Skip to content

Commit 11f0f90

Browse files
committed
feat(logging): add SetTranslatedReasoningEffort to track reasoning levels in usage reporting
- Introduced `SetTranslatedReasoningEffort` method in `UsageReporter` to capture and log reasoning efforts from translated payloads. - Updated executors to incorporate the new reporting functionality for handling reasoning efforts across various providers. - Enhanced logging for thinking level extraction with new helper function `ExtractTranslatedReasoningEffort`.
1 parent 4b68103 commit 11f0f90

15 files changed

Lines changed: 56 additions & 1 deletion

internal/runtime/executor/aistudio_executor.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ func (e *AIStudioExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth,
135135
if err != nil {
136136
return resp, err
137137
}
138+
reporter.SetTranslatedReasoningEffort(body.payload, body.toFormat.String())
138139

139140
endpoint := e.buildEndpoint(baseModel, body.action, opts.Alt)
140141
wsReq := &wsrelay.HTTPRequest{
@@ -199,6 +200,7 @@ func (e *AIStudioExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth
199200
if err != nil {
200201
return nil, err
201202
}
203+
reporter.SetTranslatedReasoningEffort(body.payload, body.toFormat.String())
202204

203205
endpoint := e.buildEndpoint(baseModel, body.action, opts.Alt)
204206
wsReq := &wsrelay.HTTPRequest{

internal/runtime/executor/antigravity_executor.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@ func (e *AntigravityExecutor) Execute(ctx context.Context, auth *cliproxyauth.Au
523523
requestedModel := helps.PayloadRequestedModel(opts, req.Model)
524524
requestPath := helps.PayloadRequestPath(opts)
525525
translated = helps.ApplyPayloadConfigWithRequest(e.cfg, baseModel, "antigravity", from.String(), "request", translated, originalTranslated, requestedModel, requestPath, opts.Headers)
526+
reporter.SetTranslatedReasoningEffort(translated, to.String())
526527

527528
useCredits := cliproxyauth.AntigravityCreditsRequested(ctx) && antigravityCreditsRetryEnabled(e.cfg)
528529

@@ -721,6 +722,7 @@ func (e *AntigravityExecutor) executeClaudeNonStream(ctx context.Context, auth *
721722
requestedModel := helps.PayloadRequestedModel(opts, req.Model)
722723
requestPath := helps.PayloadRequestPath(opts)
723724
translated = helps.ApplyPayloadConfigWithRequest(e.cfg, baseModel, "antigravity", from.String(), "request", translated, originalTranslated, requestedModel, requestPath, opts.Headers)
725+
reporter.SetTranslatedReasoningEffort(translated, to.String())
724726

725727
useCredits := cliproxyauth.AntigravityCreditsRequested(ctx) && antigravityCreditsRetryEnabled(e.cfg)
726728

@@ -1182,6 +1184,7 @@ func (e *AntigravityExecutor) ExecuteStream(ctx context.Context, auth *cliproxya
11821184
requestedModel := helps.PayloadRequestedModel(opts, req.Model)
11831185
requestPath := helps.PayloadRequestPath(opts)
11841186
translated = helps.ApplyPayloadConfigWithRequest(e.cfg, baseModel, "antigravity", from.String(), "request", translated, originalTranslated, requestedModel, requestPath, opts.Headers)
1187+
reporter.SetTranslatedReasoningEffort(translated, to.String())
11851188

11861189
useCredits := cliproxyauth.AntigravityCreditsRequested(ctx) && antigravityCreditsRetryEnabled(e.cfg)
11871190

internal/runtime/executor/claude_executor.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ func (e *ClaudeExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, r
200200
if oauthToken || experimentalCCHSigningEnabled(e.cfg, auth) {
201201
bodyForUpstream = signAnthropicMessagesBody(bodyForUpstream)
202202
}
203+
reporter.SetTranslatedReasoningEffort(bodyForUpstream, to.String())
203204

204205
url := fmt.Sprintf("%s/v1/messages?beta=true", baseURL)
205206
httpReq, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(bodyForUpstream))
@@ -374,6 +375,7 @@ func (e *ClaudeExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.A
374375
if oauthToken || experimentalCCHSigningEnabled(e.cfg, auth) {
375376
bodyForUpstream = signAnthropicMessagesBody(bodyForUpstream)
376377
}
378+
reporter.SetTranslatedReasoningEffort(bodyForUpstream, to.String())
377379

378380
url := fmt.Sprintf("%s/v1/messages?beta=true", baseURL)
379381
httpReq, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(bodyForUpstream))

internal/runtime/executor/codex_executor.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ func (e *CodexExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, re
285285
if e.cfg == nil || e.cfg.DisableImageGeneration == config.DisableImageGenerationOff {
286286
body = ensureImageGenerationTool(body, baseModel, auth)
287287
}
288+
reporter.SetTranslatedReasoningEffort(body, to.String())
288289

289290
url := strings.TrimSuffix(baseURL, "/") + "/responses"
290291
httpReq, err := e.cacheHelper(ctx, from, url, req, body)
@@ -441,6 +442,7 @@ func (e *CodexExecutor) executeCompact(ctx context.Context, auth *cliproxyauth.A
441442
if e.cfg == nil || e.cfg.DisableImageGeneration == config.DisableImageGenerationOff {
442443
body = ensureImageGenerationTool(body, baseModel, auth)
443444
}
445+
reporter.SetTranslatedReasoningEffort(body, to.String())
444446

445447
url := strings.TrimSuffix(baseURL, "/") + "/responses/compact"
446448
httpReq, err := e.cacheHelper(ctx, from, url, req, body)
@@ -542,6 +544,7 @@ func (e *CodexExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.Au
542544
if e.cfg == nil || e.cfg.DisableImageGeneration == config.DisableImageGenerationOff {
543545
body = ensureImageGenerationTool(body, baseModel, auth)
544546
}
547+
reporter.SetTranslatedReasoningEffort(body, to.String())
545548

546549
url := strings.TrimSuffix(baseURL, "/") + "/responses"
547550
httpReq, err := e.cacheHelper(ctx, from, url, req, body)

internal/runtime/executor/codex_openai_images.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ func (e *CodexExecutor) executeOpenAIImage(ctx context.Context, auth *cliproxyau
9696
if errBuild != nil {
9797
return resp, errBuild
9898
}
99+
reporter.SetTranslatedReasoningEffort(body, "codex")
99100

100101
url := strings.TrimSuffix(baseURL, "/") + "/responses"
101102
httpReq, errCache := e.cacheHelper(ctx, sdktranslator.FromString(codexOpenAIImageSourceFormat), url, req, body)
@@ -184,6 +185,7 @@ func (e *CodexExecutor) executeOpenAIImageStream(ctx context.Context, auth *clip
184185
if errBuild != nil {
185186
return nil, errBuild
186187
}
188+
reporter.SetTranslatedReasoningEffort(body, "codex")
187189

188190
url := strings.TrimSuffix(baseURL, "/") + "/responses"
189191
httpReq, errCache := e.cacheHelper(ctx, sdktranslator.FromString(codexOpenAIImageSourceFormat), url, req, body)

internal/runtime/executor/codex_websockets_executor.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ func (e *CodexWebsocketsExecutor) Execute(ctx context.Context, auth *cliproxyaut
221221
}
222222

223223
body, wsHeaders := applyCodexPromptCacheHeaders(from, req, body)
224+
reporter.SetTranslatedReasoningEffort(body, to.String())
224225
wsHeaders = applyCodexWebsocketHeaders(ctx, wsHeaders, auth, apiKey, e.cfg)
225226

226227
var authID, authLabel, authType, authValue string
@@ -421,6 +422,7 @@ func (e *CodexWebsocketsExecutor) ExecuteStream(ctx context.Context, auth *clipr
421422
}
422423

423424
body, wsHeaders := applyCodexPromptCacheHeaders(from, req, body)
425+
reporter.SetTranslatedReasoningEffort(body, to.String())
424426
wsHeaders = applyCodexWebsocketHeaders(ctx, wsHeaders, auth, apiKey, e.cfg)
425427

426428
var authID, authLabel, authType, authValue string

internal/runtime/executor/gemini_cli_executor.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ func (e *GeminiCLIExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth
142142
requestPath := helps.PayloadRequestPath(opts)
143143
basePayload = helps.ApplyPayloadConfigWithRequest(e.cfg, baseModel, "gemini", from.String(), "request", basePayload, originalTranslated, requestedModel, requestPath, opts.Headers)
144144
basePayload = cleanGeminiCLIRequestSchemas(basePayload)
145+
reporter.SetTranslatedReasoningEffort(basePayload, to.String())
145146

146147
action := "generateContent"
147148
if req.Metadata != nil {
@@ -299,6 +300,7 @@ func (e *GeminiCLIExecutor) ExecuteStream(ctx context.Context, auth *cliproxyaut
299300
requestPath := helps.PayloadRequestPath(opts)
300301
basePayload = helps.ApplyPayloadConfigWithRequest(e.cfg, baseModel, "gemini", from.String(), "request", basePayload, originalTranslated, requestedModel, requestPath, opts.Headers)
301302
basePayload = cleanGeminiCLIRequestSchemas(basePayload)
303+
reporter.SetTranslatedReasoningEffort(basePayload, to.String())
302304

303305
projectID := resolveGeminiProjectID(auth)
304306

internal/runtime/executor/gemini_executor.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ func (e *GeminiExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, r
151151
}
152152

153153
body, _ = sjson.DeleteBytes(body, "session_id")
154+
reporter.SetTranslatedReasoningEffort(body, to.String())
154155

155156
httpReq, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(body))
156157
if err != nil {
@@ -256,6 +257,7 @@ func (e *GeminiExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.A
256257
}
257258

258259
body, _ = sjson.DeleteBytes(body, "session_id")
260+
reporter.SetTranslatedReasoningEffort(body, to.String())
259261

260262
httpReq, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(body))
261263
if err != nil {

internal/runtime/executor/gemini_vertex_executor.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ func (e *GeminiVertexExecutor) executeWithServiceAccount(ctx context.Context, au
356356
url = url + fmt.Sprintf("?$alt=%s", opts.Alt)
357357
}
358358
body, _ = sjson.DeleteBytes(body, "session_id")
359+
reporter.SetTranslatedReasoningEffort(body, "gemini")
359360

360361
httpReq, errNewReq := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(body))
361362
if errNewReq != nil {
@@ -481,6 +482,7 @@ func (e *GeminiVertexExecutor) executeWithAPIKey(ctx context.Context, auth *clip
481482
url = url + fmt.Sprintf("?$alt=%s", opts.Alt)
482483
}
483484
body, _ = sjson.DeleteBytes(body, "session_id")
485+
reporter.SetTranslatedReasoningEffort(body, to.String())
484486

485487
httpReq, errNewReq := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(body))
486488
if errNewReq != nil {
@@ -589,6 +591,7 @@ func (e *GeminiVertexExecutor) executeStreamWithServiceAccount(ctx context.Conte
589591
}
590592
}
591593
body, _ = sjson.DeleteBytes(body, "session_id")
594+
reporter.SetTranslatedReasoningEffort(body, to.String())
592595

593596
httpReq, errNewReq := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(body))
594597
if errNewReq != nil {
@@ -734,6 +737,7 @@ func (e *GeminiVertexExecutor) executeStreamWithAPIKey(ctx context.Context, auth
734737
}
735738
}
736739
body, _ = sjson.DeleteBytes(body, "session_id")
740+
reporter.SetTranslatedReasoningEffort(body, to.String())
737741

738742
httpReq, errNewReq := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(body))
739743
if errNewReq != nil {

internal/runtime/executor/helps/usage_helpers.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/gin-gonic/gin"
1313
internallogging "github.com/router-for-me/CLIProxyAPI/v7/internal/logging"
14+
"github.com/router-for-me/CLIProxyAPI/v7/internal/thinking"
1415
cliproxyauth "github.com/router-for-me/CLIProxyAPI/v7/sdk/cliproxy/auth"
1516
"github.com/router-for-me/CLIProxyAPI/v7/sdk/cliproxy/usage"
1617
"github.com/tidwall/gjson"
@@ -66,6 +67,13 @@ func (r *UsageReporter) PublishAdditionalModel(ctx context.Context, model string
6667
r.publishRecord(ctx, record)
6768
}
6869

70+
func (r *UsageReporter) SetTranslatedReasoningEffort(payload []byte, format string) {
71+
if r == nil {
72+
return
73+
}
74+
r.reasoning = thinking.ExtractTranslatedReasoningEffort(payload, format)
75+
}
76+
6977
func (r *UsageReporter) buildAdditionalModelRecord(model string, detail usage.Detail) (usage.Record, bool) {
7078
if r == nil {
7179
return usage.Record{}, false

0 commit comments

Comments
 (0)