Skip to main content

Usage Tracking

Per-request logging with cost calculation and analytics.

Overview

Artemis logs every API request with detailed metrics for cost tracking, usage analysis, and debugging.

URL: https://artemis.meetrhea.com/logs

What's Tracked

Every request logs:

FieldDescription
request_idUnique identifier
api_key_idWhich Artemis key was used
provider_key_idWhich provider key was used
providerProvider name (openai, anthropic, etc.)
modelModel used
endpointAPI endpoint called
prompt_tokensInput token count
completion_tokensOutput token count
total_tokensSum of tokens
input_costCost of input tokens
output_costCost of output tokens
total_costTotal request cost
duration_msRequest duration
status_codeHTTP status
error_messageError if any
created_atTimestamp

Cost Calculation

Costs are calculated using model pricing data:

input_cost = prompt_tokens * (input_price_per_1m / 1_000_000)
output_cost = completion_tokens * (output_price_per_1m / 1_000_000)
total_cost = input_cost + output_cost

Pricing Sources

  1. Database: provider_models.input_price_per_1m and output_price_per_1m
  2. Fallback: Hardcoded pricing in app/providers/pricing.py
  3. OpenRouter: Synced from OpenRouter API

Viewing Logs

Web UI

Go to https://artemis.meetrhea.com/logs to view:

  • Recent requests
  • Filter by model, provider, API key
  • Cost summaries

API

# Get usage logs
GET /api/v1/logs?limit=100&offset=0

# Filter by date
GET /api/v1/logs?start_date=2025-01-01&end_date=2025-01-31

# Filter by model
GET /api/v1/logs?model=claude-sonnet-4-20250514

Analytics

Dashboard

The analytics dashboard shows:

  • Total spend by period
  • Token usage trends
  • Cost by model
  • Cost by provider
  • Top API keys by usage

Aggregations

# Usage by model
GET /api/v1/analytics/by-model

# Usage by provider
GET /api/v1/analytics/by-provider

# Daily totals
GET /api/v1/analytics/daily

Database Schema

usage_logs

ColumnTypeDescription
iduuidPrimary key
request_idtextUnique request ID
api_key_iduuidFK to api_keys
provider_key_iduuidFK to provider_keys
providertextProvider slug
modeltextModel used
endpointtextAPI endpoint
prompt_tokensintInput tokens
completion_tokensintOutput tokens
total_tokensintTotal tokens
input_costdecimalInput cost USD
output_costdecimalOutput cost USD
total_costdecimalTotal cost USD
duration_msintRequest duration
status_codeintHTTP status
error_messagetextError if failed
metadatajsonbCustom metadata
created_attimestampWhen logged

model_pricing

Historical pricing data:

ColumnTypeDescription
iduuidPrimary key
model_idtextModel identifier
input_price_per_1mdecimal$/1M input tokens
output_price_per_1mdecimal$/1M output tokens
effective_fromtimestampWhen pricing started
effective_totimestampWhen pricing ended

Custom Metadata

Add your own tracking data to requests:

response = client.chat.completions.create(
model="claude-sonnet-4-20250514",
messages=[...],
extra_body={
"metadata": {
"session_id": "sess-123",
"user_id": "user-456",
"feature": "chat",
"environment": "production"
}
}
)

This metadata is stored in usage_logs.metadata for filtering and analysis.

Retention

Usage logs are retained indefinitely by default. Configure retention via environment:

USAGE_LOG_RETENTION_DAYS=90  # Delete logs older than 90 days

Export

Export usage data for external analysis:

# CSV export
GET /api/v1/logs/export?format=csv&start_date=2025-01-01

# JSON export
GET /api/v1/logs/export?format=json&start_date=2025-01-01

Alerts

Set up cost alerts (coming soon):

  • Daily spend threshold
  • Per-key spend limits
  • Anomaly detection