@@ -8,21 +8,21 @@ import (
88
99// Endpoints used against the CPA management API.
1010const (
11- managementAuthFilesEndpoint = "/v0/management/auth-files"
12- managementExternalKeysEndpoint = "/v0/management/api-keys"
13- managementGeminiKeysEndpoint = "/v0/management/gemini-api-key"
14- managementClaudeKeysEndpoint = "/v0/management/claude-api-key"
15- managementCodexKeysEndpoint = "/v0/management/codex-api-key"
16- managementVertexKeysEndpoint = "/v0/management/vertex-api-key"
17- managementOpenAICompatEndpoint = "/v0/management/openai-compatibility"
18- modelsEndpoint = "/v1/models"
11+ managementAuthFilesEndpoint = "/v0/management/auth-files"
12+ managementExternalKeysEndpoint = "/v0/management/api-keys"
13+ managementGeminiKeysEndpoint = "/v0/management/gemini-api-key"
14+ managementClaudeKeysEndpoint = "/v0/management/claude-api-key"
15+ managementCodexKeysEndpoint = "/v0/management/codex-api-key"
16+ managementVertexKeysEndpoint = "/v0/management/vertex-api-key"
17+ managementOpenAICompatEndpoint = "/v0/management/openai-compatibility"
18+ modelsEndpoint = "/v1/models"
1919
2020 // Redis queue (RESP TCP) constants — multiplexed on CPA's HTTP port + 1 by default (8317).
21- redisNetwork = "tcp"
22- RedisDefaultPort = "8317"
23- RedisAuthCommand = "AUTH"
24- RedisLPopCommand = "LPOP"
25- RedisUsageQueueKey = "queue"
21+ redisNetwork = "tcp"
22+ RedisDefaultPort = "8317"
23+ RedisAuthCommand = "AUTH"
24+ RedisLPopCommand = "LPOP"
25+ RedisUsageQueueKey = "queue"
2626)
2727
2828// AuthFile mirrors a single entry from /v0/management/auth-files.
@@ -181,25 +181,39 @@ func firstString(raw map[string]any, keys ...string) string {
181181// CPA encodes timestamps as RFC3339 strings; deserialization tolerates both string
182182// and object container shapes via Tokens.
183183type UsageRecord struct {
184- Timestamp time.Time `json:"timestamp"`
185- LatencyMs int64 `json:"latency_ms"`
186- Source string `json:"source"`
187- AuthIndex string `json:"auth_index"`
188- Tokens UsageTokens `json:"tokens"`
189- Failed bool `json:"failed"`
190- Provider string `json:"provider"`
191- Model string `json:"model"`
192- Endpoint string `json:"endpoint"`
193- AuthType string `json:"auth_type"`
194- APIKey string `json:"api_key"`
195- RequestID string `json:"request_id"`
184+ Timestamp time.Time `json:"timestamp"`
185+ LatencyMs int64 `json:"latency_ms"`
186+ TTFTMs int64 `json:"ttft_ms"`
187+ Source string `json:"source"`
188+ AuthIndex string `json:"auth_index"`
189+ Tokens UsageTokens `json:"tokens"`
190+ Failed bool `json:"failed"`
191+ Fail UsageFail `json:"fail"`
192+ ResponseHeaders json.RawMessage `json:"response_headers"`
193+ Provider string `json:"provider"`
194+ Model string `json:"model"`
195+ Alias string `json:"alias"`
196+ Endpoint string `json:"endpoint"`
197+ AuthType string `json:"auth_type"`
198+ APIKey string `json:"api_key"`
199+ RequestID string `json:"request_id"`
200+ ReasoningEffort string `json:"reasoning_effort"`
201+ ServiceTier string `json:"service_tier"`
196202}
197203
198204// UsageTokens is the nested token stats object from CPA.
199205type UsageTokens struct {
200- InputTokens int64 `json:"input_tokens"`
201- OutputTokens int64 `json:"output_tokens"`
202- ReasoningTokens int64 `json:"reasoning_tokens"`
203- CachedTokens int64 `json:"cached_tokens"`
204- TotalTokens int64 `json:"total_tokens"`
206+ InputTokens int64 `json:"input_tokens"`
207+ OutputTokens int64 `json:"output_tokens"`
208+ ReasoningTokens int64 `json:"reasoning_tokens"`
209+ CachedTokens int64 `json:"cached_tokens"`
210+ CacheReadTokens int64 `json:"cache_read_tokens"`
211+ CacheCreationTokens int64 `json:"cache_creation_tokens"`
212+ TotalTokens int64 `json:"total_tokens"`
213+ }
214+
215+ // UsageFail is the nested failure detail object from CPA.
216+ type UsageFail struct {
217+ StatusCode int `json:"status_code"`
218+ Body string `json:"body"`
205219}
0 commit comments