Recent Clients
{{ clientStatsTotal }} total| Client | Requests | Errors | Avg Latency |
|---|---|---|---|
| {{ item.client_ip }} | {{ item.total_requests }} | {{ item.error_count }} | {{ formatMilliseconds(item.total_latency_avg_ms) }} |
| Client | Requests | Errors | Avg Latency |
|---|---|---|---|
| {{ item.client_ip }} | {{ item.total_requests }} | {{ item.error_count }} | {{ formatMilliseconds(item.total_latency_avg_ms) }} |
Last 24 hours by configuration
Recent and hourly distribution
Auto-inject a system prompt into all requests for each service. Claude uses the top-level system field; Codex uses the instructions field; other services use a system message in the messages array.
| Key | Status | Requests | Traffic | Models | Last Used | |
|---|---|---|---|---|---|---|
| {{ keyEntry.name }} ID {{ (keyEntry.id || '').slice(0, 8) || '—' }} | {{ keyEntry.active ? 'Active' : 'Disabled' }} | {{ formatNumber(keyEntry.requestCount || 0) }} | In {{ formatTokensK(keyEntry.inputTokens || 0) }} Out {{ formatTokensK(keyEntry.outputTokens || 0) }} Total {{ formatTokensK((keyEntry.inputTokens || 0) + (keyEntry.outputTokens || 0)) }} |
|
{{ keyEntry.lastUsedAt ? formatRelativeTime(keyEntry.lastUsedAt) : 'Never' }} |
|
Create your first access key to enable client authentication.
{{ newlyCreatedKey.key }}
{{ selectedSessionId || '—' }}
{{ sessionCwd }}
{{ sessionTrace.session_id || selectedSessionId }}
·
{{ sessionTrace.span_count || sessionTrace.total || 0 }} spans
·
{{ formatTokensK(sessionTrace.total_tokens || 0) }} tokens
·
{{ ((sessionTrace.total_duration_ms || 0) / 1000).toFixed(1) }}s
·
{{ (sessionTrace.models || []).join(', ') }}
Requests, tokens, estimated cost, and pricing coverage
Daily volume · smooth curves for requests and tokens
Provider and model costs · OpenRouter rates
Sorted by tokens · estimated from OpenRouter rates
Sorted by tokens · estimated from OpenRouter rates
Usage, estimated cost, and users for this model
Usage, estimated cost, and coverage for this agent
Instructions for use:
• One rule per line, executed sequentially
• When selecting "Replace", replace source with target
• When "Delete" is selected, the content matching the source will be deleted
• Supports regular expressions
127.0.0.1:3211
{{ selectedLog.path }}
{{ getUpstreamHost(selectedLog.target_url) }}
{{ getUpstreamPath(selectedLog.target_url) }}
{{ selectedLog.path }}
{{ selectedLog.target_url }}
{{ selectedRealtimeRequest.responseText }}
{{ stringifyHeadersForDisplay(selectedRealtimeRequest.request_headers) }}
There is no mapping rule yet, click the "Add Mapping" button to create the first rule
There is no mapping rule yet, click the "Add Mapping" button to create the first rule
There is no mapping rule yet, click the "Add Mapping" button to create the first rule
There is no mapping rule yet, click the "Add Mapping" button to create the first rule
Raw tokens are still recorded separately. API-key token quotas consume weighted quota tokens: raw total tokens × quota multiplier.
Models are discovered from current service configuration. USD token prices sync from OpenRouter; only quota and Kiro multipliers are manual overrides.
{{ scope.row.model }}
{{ scope.row.openrouter_model }}
${{ (snapshotDetail.data.openai_cost_usd || 0).toFixed(4) }}
{{ costsComparison.snapshot2.timestamp }} → {{ costsComparison.snapshot1.timestamp }}
No snapshots yet. Click "Take Snapshot" to capture current usage.
{{ pgError }}
{{ pgResponse }}▌