From 33983b6f3e0ecff7619d96241e60d900ff5d0514 Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Sun, 31 May 2026 14:38:54 +0800 Subject: [PATCH] refactor(executor): consolidate Codex request translation logic - Introduced `translateCodexRequestPair` to simplify and reuse translation logic for handling original and modified payloads. - Updated relevant methods to use the new function. - Added unit tests to cover payload reuse and differentiation scenarios. --- internal/runtime/executor/codex_executor.go | 19 ++++-- .../executor/codex_executor_translate_test.go | 59 +++++++++++++++++++ .../executor/codex_websockets_executor.go | 3 +- 3 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 internal/runtime/executor/codex_executor_translate_test.go diff --git a/internal/runtime/executor/codex_executor.go b/internal/runtime/executor/codex_executor.go index a96e805c..7b607944 100644 --- a/internal/runtime/executor/codex_executor.go +++ b/internal/runtime/executor/codex_executor.go @@ -207,6 +207,16 @@ func NewCodexExecutor(cfg *config.Config) *CodexExecutor { return &CodexExecutor func (e *CodexExecutor) Identifier() string { return "codex" } +func translateCodexRequestPair(from, to sdktranslator.Format, model string, originalPayload, payload []byte, stream bool) ([]byte, []byte) { + if bytes.Equal(originalPayload, payload) { + body := sdktranslator.TranslateRequest(from, to, model, payload, stream) + return body, body + } + originalTranslated := sdktranslator.TranslateRequest(from, to, model, originalPayload, stream) + body := sdktranslator.TranslateRequest(from, to, model, payload, stream) + return originalTranslated, body +} + // PrepareRequest injects Codex credentials into the outgoing HTTP request. func (e *CodexExecutor) PrepareRequest(req *http.Request, auth *cliproxyauth.Auth) error { if req == nil { @@ -264,8 +274,7 @@ func (e *CodexExecutor) Execute(ctx context.Context, auth *cliproxyauth.Auth, re originalPayloadSource = opts.OriginalRequest } originalPayload := originalPayloadSource - originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, false) - body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) + originalTranslated, body := translateCodexRequestPair(from, to, baseModel, originalPayload, req.Payload, false) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -427,8 +436,7 @@ func (e *CodexExecutor) executeCompact(ctx context.Context, auth *cliproxyauth.A originalPayloadSource = opts.OriginalRequest } originalPayload := originalPayloadSource - originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, false) - body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) + originalTranslated, body := translateCodexRequestPair(from, to, baseModel, originalPayload, req.Payload, false) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { @@ -528,8 +536,7 @@ func (e *CodexExecutor) ExecuteStream(ctx context.Context, auth *cliproxyauth.Au originalPayloadSource = opts.OriginalRequest } originalPayload := originalPayloadSource - originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, true) - body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, true) + originalTranslated, body := translateCodexRequestPair(from, to, baseModel, originalPayload, req.Payload, true) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { diff --git a/internal/runtime/executor/codex_executor_translate_test.go b/internal/runtime/executor/codex_executor_translate_test.go new file mode 100644 index 00000000..5b28f9e7 --- /dev/null +++ b/internal/runtime/executor/codex_executor_translate_test.go @@ -0,0 +1,59 @@ +package executor + +import ( + "bytes" + "sync/atomic" + "testing" + + sdktranslator "github.com/router-for-me/CLIProxyAPI/v7/sdk/translator" +) + +func TestTranslateCodexRequestPairReusesEqualPayload(t *testing.T) { + from := sdktranslator.Format("codex-test-from-equal") + to := sdktranslator.Format("codex-test-to-equal") + var calls int32 + sdktranslator.Register(from, to, func(model string, rawJSON []byte, stream bool) []byte { + atomic.AddInt32(&calls, 1) + if model != "test-model" { + t.Errorf("model = %q, want test-model", model) + } + if !stream { + t.Error("stream = false, want true") + } + return append([]byte(nil), rawJSON...) + }, sdktranslator.ResponseTransform{}) + + payload := []byte(`{"model":"test-model","input":[{"role":"user"}]}`) + originalTranslated, body := translateCodexRequestPair(from, to, "test-model", payload, bytes.Clone(payload), true) + + if gotCalls := atomic.LoadInt32(&calls); gotCalls != 1 { + t.Fatalf("TranslateRequest calls = %d, want 1", gotCalls) + } + if !bytes.Equal(originalTranslated, body) { + t.Fatalf("translated payloads differ: original=%s body=%s", originalTranslated, body) + } +} + +func TestTranslateCodexRequestPairTranslatesDifferentPayloads(t *testing.T) { + from := sdktranslator.Format("codex-test-from-different") + to := sdktranslator.Format("codex-test-to-different") + var calls int32 + sdktranslator.Register(from, to, func(_ string, rawJSON []byte, _ bool) []byte { + atomic.AddInt32(&calls, 1) + return append([]byte(nil), rawJSON...) + }, sdktranslator.ResponseTransform{}) + + originalPayload := []byte(`{"model":"test-model","input":[{"role":"system"}]}`) + payload := []byte(`{"model":"test-model","input":[{"role":"user"}]}`) + originalTranslated, body := translateCodexRequestPair(from, to, "test-model", originalPayload, payload, false) + + if gotCalls := atomic.LoadInt32(&calls); gotCalls != 2 { + t.Fatalf("TranslateRequest calls = %d, want 2", gotCalls) + } + if !bytes.Equal(originalTranslated, originalPayload) { + t.Fatalf("original translated = %s, want %s", originalTranslated, originalPayload) + } + if !bytes.Equal(body, payload) { + t.Fatalf("body = %s, want %s", body, payload) + } +} diff --git a/internal/runtime/executor/codex_websockets_executor.go b/internal/runtime/executor/codex_websockets_executor.go index 8339114f..4a2fb1f9 100644 --- a/internal/runtime/executor/codex_websockets_executor.go +++ b/internal/runtime/executor/codex_websockets_executor.go @@ -194,8 +194,7 @@ func (e *CodexWebsocketsExecutor) Execute(ctx context.Context, auth *cliproxyaut originalPayloadSource = opts.OriginalRequest } originalPayload := originalPayloadSource - originalTranslated := sdktranslator.TranslateRequest(from, to, baseModel, originalPayload, false) - body := sdktranslator.TranslateRequest(from, to, baseModel, req.Payload, false) + originalTranslated, body := translateCodexRequestPair(from, to, baseModel, originalPayload, req.Payload, false) body, err = thinking.ApplyThinking(body, req.Model, from.String(), to.String(), e.Identifier()) if err != nil { -- 2.51.2