From 05ed9d43afeef5ded39a12e89c0a25287a7a1ec5 Mon Sep 17 00:00:00 2001 From: dahetaoa <2732988078@qq.com> Date: Wed, 4 Feb 2026 21:43:33 +0000 Subject: [PATCH] fix(relay/codex): optimize headers and ensure instructions presence --- relay/channel/codex/adaptor.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/relay/channel/codex/adaptor.go b/relay/channel/codex/adaptor.go index 44ec98c8e..d8a4e866b 100644 --- a/relay/channel/codex/adaptor.go +++ b/relay/channel/codex/adaptor.go @@ -90,6 +90,12 @@ func (a *Adaptor) ConvertOpenAIResponsesRequest(c *gin.Context, info *relaycommo } } } + // Codex backend requires the `instructions` field to be present. + // Keep it consistent with Codex CLI behavior by defaulting to an empty string. + if len(request.Instructions) == 0 { + request.Instructions = json.RawMessage(`""`) + } + if isCompact { return request, nil } @@ -172,5 +178,15 @@ func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Header, info *rel req.Set("originator", "codex_cli_rs") } + // chatgpt.com/backend-api/codex/responses is strict about Content-Type. + // Clients may omit it or include parameters like `application/json; charset=utf-8`, + // which can be rejected by the upstream. Force the exact media type. + req.Set("Content-Type", "application/json") + if info.IsStream { + req.Set("Accept", "text/event-stream") + } else if req.Get("Accept") == "" { + req.Set("Accept", "application/json") + } + return nil }