{{ autoRefreshInterval ? `Auto (${autoRefreshInterval/1000}s)` : 'Refresh' }} {{ logsAutoRefreshInterval ? `Auto (${logsAutoRefreshInterval >= 60000 ? (logsAutoRefreshInterval/60000) + 'min' : (logsAutoRefreshInterval/1000) + 's'})` : 'Refresh' }} Refresh Refresh Sync OpenRouter Refresh
{{ stats.requestCount || 0 }} Requests {{ stats.latestSessionId.substring(0, 8) }}
{{ usageSummary.formattedTotals.total || '0' }} Tokens
{{ stats.realtimeSummary.total_active_requests || 0 }} Active
{{ stats.configCount || 0 }} Configs
{{ stats.requestCount > 0 ? Math.round((1 - (stats.errorCount || 0) / stats.requestCount) * 100) + '%' : '—' }} Success Rate
{{ stats.errorCount || 0 }} Errors
C
Claude :{{ services.claude.port || 3210 }}
{{ services.claude.running ? 'Online' : 'Offline' }}
{{ services.claude.runtimeSnapshot?.runtime?.active_request_count || 0 }} Active
{{ formatMilliseconds(services.claude.runtimeSnapshot?.runtime?.average_duration_ms || 0) }} Avg Time
{{ formatBytes(services.claude.processSnapshot?.memory_rss_bytes || 0) }} Memory
X
Codex :{{ services.codex.port || 3211 }}
{{ services.codex.running ? 'Online' : 'Offline' }}
{{ services.codex.runtimeSnapshot?.runtime?.active_request_count || 0 }} Active
{{ formatMilliseconds(services.codex.runtimeSnapshot?.runtime?.average_duration_ms || 0) }} Avg Time
{{ formatBytes(services.codex.processSnapshot?.memory_rss_bytes || 0) }} Memory
G
Gemini :{{ services.gemini.port || 3212 }}
{{ services.gemini.running ? 'Online' : 'Offline' }}
{{ services.gemini.runtimeSnapshot?.runtime?.active_request_count || 0 }} Active
{{ formatMilliseconds(services.gemini.runtimeSnapshot?.runtime?.average_duration_ms || 0) }} Avg Time
{{ formatBytes(services.gemini.processSnapshot?.memory_rss_bytes || 0) }} Memory

Recent Clients

{{ clientStatsTotal }} total
Client Requests Errors Avg Latency
{{ item.client_ip }} {{ item.total_requests }} {{ item.error_count }} {{ formatMilliseconds(item.total_latency_avg_ms) }}
{{ currentSettingsService.label }} · {{ getServiceActiveConfigCount(currentSettingsService.id) }}/{{ getServiceConfigCount(currentSettingsService.id) }} enabled Share live usage {{ getServiceActionLabel(currentSettingsService.id) }}
{{ config.name }} {{ config.id }}
{{ config.active ? 'Enabled' : 'Disabled' }} {{ getAuthTypeLabel(config.authType) }}
{{ getConfigIdentityHint(config, currentSettingsService.id) }}
{{ m }}
Any (general)
{{ getConfigStats(currentSettingsService.id, config.name)?.weight || config.weight }} {{ calculateTrafficPercent(currentSettingsService.id, config.name) }}%
No plan usage for this auth mode
{{ getWindowSummary(currentSettingsService.id, config.name, '5m').total_requests }} req {{ formatSummarySuccessRate(getWindowSummary(currentSettingsService.id, config.name, '5m')) }}
No requests in the last 5m
{{ getWindowSummary(currentSettingsService.id, config.name, '5m').success || 0 }} ok {{ getWindowSummary(currentSettingsService.id, config.name, '5m').failure || 0 }} err
Protocol · Health · Diagnostics

Protocol / Upstream

Wire protocol and target host

Protocol {{ getConfigProtocolLabel(config, currentSettingsService.id) }}
Upstream {{ getConfigUpstream(config, currentSettingsService.id) }}

Health

Recent success ratio and activity

{{ getHealthPercent(getConfigStats(currentSettingsService.id, config.name)) }} OK {{ getConfigStats(currentSettingsService.id, config.name)?.total_success || 0 }}/{{ getConfigStats(currentSettingsService.id, config.name)?.total_requests || 0 }}
{{ getWindowSummary(currentSettingsService.id, config.name, '24h').total_requests }} / 24h {{ getConfigStats(currentSettingsService.id, config.name)?.last_updated ? formatLastUpdated(getConfigStats(currentSettingsService.id, config.name)?.last_updated) : 'No activity' }}
Req 24h {{ getWindowSummary(currentSettingsService.id, config.name, '24h').total_requests }}
OK Rate {{ formatSummarySuccessRate(getWindowSummary(currentSettingsService.id, config.name, '24h')) }}
Routed {{ getRoutingStats(currentSettingsService.id, config.name)?.count || 0 }}
Last {{ getLastResultLabel(currentSettingsService.id, config.name) }}

Request Volume

Last 24 hours by configuration

Latency

Recent and hourly distribution

Custom Prompts

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.

{{ svc[0].toUpperCase() }}

{{ svc }}

Active Not set
Save Clear
New Key
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)) }} {{ formatAllowedModels(keyEntry) }} {{ keyEntry.lastUsedAt ? formatRelativeTime(keyEntry.lastUsedAt) : 'Never' }} Copy Edit

No Access Keys

Create your first access key to enable client authentication.

Create Key
All Models Select Models
{{ model }}
No models in Pricing yet
If not configured, this key can use every model.
All Sites Select Sites
A friendly name to identify this key
All Models (default) Select specific models
{{ model }}
No models in Pricing yet
Leave as All Models to avoid restrictions.
All Sites (default) Select specific sites
No sites configured yet

Key Created Successfully

Make sure to copy this key now. You won't be able to see it again!
{{ newlyCreatedKey.key }} Copy

Request History

{{ historyPagination.total }} logs
Success {{ historySummary.success }} Error {{ historySummary.failure }}
Service Session Model Thinking Effort Config User-Agent
{{ allLogsLoading ? 'Loading...' : 'No logs found' }}
{{ log.status_code || '—' }} {{ getLogServiceType(log) }} {{ log.model || '—' }} {{ log.thinking_level }} {{ log.channel || '—' }} {{ log.agent || '—' }}
{{ formatRequestBodySize(log.original_body_length) }}
{{ log.duration_ms ? (log.duration_ms >= 1000 ? (log.duration_ms / 1000).toFixed(1) + 's' : log.duration_ms + 'ms') : '—' }} {{ timeAgo(log.timestamp) }}
Conversation · session_id

{{ selectedSessionId || '—' }}

{{ sessionSummaryLine }}
cwd {{ sessionCwd }}
session {{ 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(', ') }}
Refresh Open full detail
{{ sessionTraceError }}
No session selected
{{ sessionSpanDetailError }}
Select a span

Overview metrics

Requests, tokens, estimated cost, and pricing coverage

Requests {{ formatNumber(insightsOverview?.totals?.requestCount || 0) }} successful
Tokens {{ formatTokensK(insightsOverview?.totals?.totalTokens || 0) }} {{ formatTokensK(insightsOverview?.totals?.inputTokens || 0) }} in · {{ formatTokensK(insightsOverview?.totals?.outputTokens || 0) }} out
Est. API Cost {{ formatCostUsd(insightsOverview?.totals?.costUsd || 0) }} {{ formatCostUsd(insightsOverview?.totals?.avgCostUsd || 0) }} / req · OpenRouter rates
$ / 1M Tokens {{ formatCostUsd(insightsOverview?.totals?.costPerMTokens || 0) }} blended · priced tokens only
Pricing Coverage {{ (insightsOverview?.totals?.pricingCoverage || 0).toFixed(1) }}% {{ insightsOverallModels.length }} models shown · unpriced excluded from rate
{{ insightsError }} · Showing last successful result.
Loading usage…
No usage data for this window.

Usage trend

Daily volume · smooth curves for requests and tokens

Requests Tokens
{{ Math.round(insightsTrendChart.maxReq * (5-i) / 4) }} {{ formatTokensK(insightsTrendChart.maxTokens * (5-i) / 4) }} {{ pt.label }} · {{ formatNumber(pt.requests) }} req {{ pt.label }} · {{ formatTokensK(pt.tokens) }} tokens {{ pt.label }}

Channel usage

Provider and model costs · OpenRouter rates

{{ formatTokensK(insightsOverview?.totals?.totalTokens || 0) }} · {{ formatCostUsd(insightsOverview?.totals?.costUsd || 0) }}
ProviderChannelsRequestsTokensCostCost share
{{ provider.service }} {{ provider.channelCount }} {{ formatNumber(provider.requestCount) }} {{ formatTokensK(provider.totalTokens) }} {{ provider.costUsd ? formatCostUsd(provider.costUsd) : '—' }} {{ provider.costUsd ? (provider.costShare || 0).toFixed(1) + '%' : '—' }}
ChannelRequestsTokensCostCost share

Model ranking

Sorted by tokens · estimated from OpenRouter rates

# Model Requests Tokens Cost Cost share

Agent ranking

Sorted by tokens · estimated from OpenRouter rates

# Agent Requests Tokens Cost Cost share

Model metrics

Usage, estimated cost, and users for this model

{{ insightsError }} · Showing last successful result.
Loading model usage…

Agent share

Who calls this model
{{ formatNumber(insightsModelPageAgentDonut.total) }} Requests
{{ sl.label }} {{ Math.round(sl.pct * 100) }}%

Used by agents

Client agents calling this model
{{ insightsModelAgents.length }} agents
{{ item.value }} {{ formatTokensK(item.totalTokens) }}
{{ item.requestCount }} req {{ item.requestShare.toFixed(1) }}% {{ formatCostUsd(item.costUsd) }} last {{ item.lastSeen.replace('T', ' ').substring(0, 16) }}
No agent data

Used by keys

API keys calling this model
{{ insightsModelKeys.length }} keys
{{ item.value }} {{ formatTokensK(item.totalTokens) }}
{{ item.requestCount }} req {{ item.requestShare.toFixed(1) }}% {{ formatCostUsd(item.costUsd) }} last {{ item.lastSeen.replace('T', ' ').substring(0, 16) }}
No key data

Routing configs

Upstream config footprint for this model
{{ insightsModelConfigs.length }} configs
{{ item.value }} {{ item.requestCount }} req
{{ item.requestShare.toFixed(1) }}% {{ formatTokensK(item.totalTokens) }} {{ formatCostUsd(item.costUsd) }}
No usage data for this model and window.

Agent metrics

Usage, estimated cost, and coverage for this agent

{{ insightsError }} · Showing last successful result.
Loading agent usage…

Model share

Token distribution for this agent
{{ formatTokensK(insightsAgentPageModelDonut.total) }} Tokens
{{ sl.label }} {{ Math.round(sl.pct * 100) }}%

Models used

Which models this agent requests
{{ insightsAgentModels.length }} models
{{ item.value }} {{ item.costUsd ? formatCostUsd(item.costUsd) : formatTokensK(item.totalTokens) }}
{{ item.requestCount }} req {{ item.requestShare.toFixed(1) }}% {{ formatTokensK(item.totalTokens) }}

Keys used

Which API keys this agent uses
{{ insightsAgentKeys.length }} keys
{{ item.value }} {{ formatTokensK(item.totalTokens) }}
{{ item.requestCount }} req {{ item.requestShare.toFixed(1) }}% {{ formatCostUsd(item.costUsd) }} last {{ item.lastSeen.replace('T', ' ').substring(0, 16) }}

Key activity

Hourly request heatmap per key
{{ entry.key }}
{{ insightsAgentKeyActivity[0].buckets[0].bucket.replace('T', ' ') }} {{ insightsAgentKeyActivity[0].buckets[insightsAgentKeyActivity[0].buckets.length - 1].bucket.replace('T', ' ') }}
No usage data for this agent and window.
Add rules

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

Save filter rules reload
{{ selectedLog.status_code || '---' }}
{{ selectedLog.service }} · {{ formatChannelName(selectedLog.channel) }} · {{ selectedLog.model }} · effort {{ selectedLog.thinking_level }} · {{ selectedLog.duration_ms }}ms · {{ selectedLog.timestamp }}
Session {{ String(selectedLog.session_id).slice(0, 8) }} {{ shareUrl ? 'Copied!' : '🔗 Share' }}
💬 User Message
{{ userMessageText }}
Client → Proxy {{ selectedLog.status_code }}
Host: 127.0.0.1:3211
Path: {{ selectedLog.path }}
Proxy → Upstream {{ selectedLog.status_code }} N/A
Host: {{ getUpstreamHost(selectedLog.target_url) }}
Path: {{ getUpstreamPath(selectedLog.target_url) }}
Not forwarded
Request
{{ selectedLog.method }} {{ selectedLog.path }} Copy
Client: {{ selectedLog.client_ip }} ID: {{ selectedLog.request_id }}
Headers ({{ Object.keys(selectedLog.original_headers || {}).length }}) Copy
No headers
{{ key }} {{ formatHeaderDisplayValue(key, selectedLog.original_headers[key]) }}
Body ({{ formatBytes(selectedLog.original_body_length) }}) Truncated Copy Format
No body
Response {{ selectedLog.status_code }}
Status: {{ selectedLog.status_code }} {{ getStatusText(selectedLog.status_code) }} Size: {{ formatBytes(selectedLog.response_bytes) }} Duration: {{ selectedLog.duration_ms }}ms
Headers ({{ Object.keys(selectedLog.response_headers || {}).length }}) Copy
No headers
{{ key }} {{ formatHeaderDisplayValue(key, selectedLog.response_headers[key]) }}
Body ({{ formatBytes(selectedLog.response_content_length) }}) Truncated Copy {{ isResponseContentParsed ? 'Raw' : 'Parse' }} Format
No response
Request was not forwarded to upstream

Realtime requests

Claude is connected Claude is not connected Codex is connected Codex not connected
connect disconnect
No real-time request yet
Serve path state time consuming operate
{{ request.service }}{{ request.channel ? ` [${request.channel}]` : '' }} {{ request.path }} {{ getStatusDisplay(request.status).text }} {{ request.displayDuration }}ms Details

Request history

Total {{ (historyPagination && historyPagination.total) || 0 }} logs (current page {{ filteredLogs.length }} logs, total {{ (historyPagination && historyPagination.overallTotal) || 0 }} logs, keep the most recent {{ systemConfig.logLimit }} logs)
Success {{ historySummary.success }} Error {{ historySummary.failure }}
refresh
time Serve URL state time consuming Usage operate
{{ allLogsLoading ? 'Loading log data...' : ((allLogs.items && allLogs.items.length === 0) ? 'No log data' : 'No matching log') }}
{{ formatTimestamp(log.timestamp) }} {{ formatServiceWithChannel(log.service, log.channel) }} {{ formatMethodWithURL(log.method, log.path) }} {{ log.status_code || '-' }} FO {{ log.duration_ms ? `${log.duration_ms}ms` : '-' }} {{ formatUsageSummary(log.usage, log.service) }} Details

Overall summary

{{ usageMetricLabels[key] }}: {{ getUsageFormattedValue(usageDetails.totals, key) }}

{{ serviceName }} CLI

Total {{ getUsageFormattedValue(serviceData.overall, 'total') }}
{{ usageMetricLabels[key] }}: {{ getUsageFormattedValue(serviceData.overall, key) }}
target site {{ usageMetricLabels[key] }}
{{ formatChannelName(channelName) }} {{ getUsageFormattedValue(channelData, key) }}
No channel data yet
refresh Clear Token closure
{{ selectedRealtimeRequest.request_id }} {{ selectedRealtimeRequest.service }} {{ selectedRealtimeRequest.channel }} {{ getStatusDisplay(selectedRealtimeRequest.status).text }} {{ selectedRealtimeRequest.method }} {{ selectedRealtimeRequest.path }} {{ selectedRealtimeRequest.displayDuration }}ms {{ selectedRealtimeRequest.status_code }} {{ formatRealtimeTime(selectedRealtimeRequest.start_time) }} {{ selectedRealtimeRequest.target_url }}

real-time response streaming

{{ selectedRealtimeRequest.responseText }}
No response data yet...

Request header

{{ stringifyHeadersForDisplay(selectedRealtimeRequest.request_headers) }}

Claude model mapping rules

Add mapping
delete

There is no mapping rule yet, click the "Add Mapping" button to create the first rule

Codex model mapping rules

Add mapping
delete

There is no mapping rule yet, click the "Add Mapping" button to create the first rule

Claude model configuration mapping rules

Add mapping
delete

There is no mapping rule yet, click the "Add Mapping" button to create the first rule

Codex model configuration mapping rules

Add mapping
delete

There is no mapping rule yet, click the "Add Mapping" button to create the first rule

Model Pricing & Quota Multipliers

Raw tokens are still recorded separately. API-key token quotas consume weighted quota tokens: raw total tokens × quota multiplier.

Automatic model pricing OpenRouter {{ pricingSyncSummary.matched }}/{{ pricingSyncSummary.total }} matched

Models are discovered from current service configuration. USD token prices sync from OpenRouter; only quota and Kiro multipliers are manual overrides.

Cost & Pricing

Take Snapshot Compare Selected ({{ selectedSnapshots.length }}/2) Delete Selected ({{ selectedSnapshots.length }})

{{ snapshotDetail.timestamp }}

Model Details

Kiro Accounts

No Kiro accounts configured

OpenAI Cost

${{ (snapshotDetail.data.openai_cost_usd || 0).toFixed(4) }}

{{ costsComparison.snapshot2.timestamp }} → {{ costsComparison.snapshot1.timestamp }}

Claude Credits Delta
{{ costsComparison.claude.credits_delta.toFixed(2) }}
Kiro Cost (@ $0.04/credit)
${{ costsComparison.claude.kiro_cost_usd.toFixed(4) }}
Claude Credits/1M Tokens
{{ (costsComparison.claude.credits_per_1m_tokens || 0).toFixed(2) }}
Claude $/1M Tokens
${{ (costsComparison.claude.cost_per_1m_usd || 0).toFixed(4) }}
OpenAI Cost Delta
${{ costsComparison.openai.cost_delta_usd.toFixed(4) }}
OpenAI $/1M Tokens
${{ (costsComparison.openai.cost_per_1m_usd || 0).toFixed(4) }}

Model Token Delta

Kiro Credit Delta

No snapshots yet. Click "Take Snapshot" to capture current usage.

Playground

Stream
Send Clear {{ pgDuration }}ms
{{ pgError }}
{{ pgResponse }}

Server Log ({{ serverLogsTotal }} total, showing last {{ serverLogs.length }})

Refresh Clear
No server logs found.
{{ line }}