From 8c6e3b8b62eb2f0ffc78d5d1eefc5f84dd931a15 Mon Sep 17 00:00:00 2001 From: Hellodebasishsahu Date: Fri, 6 Feb 2026 15:02:56 +0700 Subject: [PATCH] fix(codex): use user-agent detection for Droid CLI compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous merge used sourceFormat check which broke Cursor when it sends openai-responses format requests. Now uses user-agent detection: - Droid CLI (user-agent contains 'droid' or 'codex-cli') → passthrough - Other clients (Cursor, etc.) → translate to Chat Completions format This fixes the API translation for both clients. Co-authored-by: Hellodebasishsahu Co-authored-by: Cursor --- open-sse/handlers/chatCore.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/open-sse/handlers/chatCore.js b/open-sse/handlers/chatCore.js index 5bb2caf3..14c36f4c 100644 --- a/open-sse/handlers/chatCore.js +++ b/open-sse/handlers/chatCore.js @@ -469,10 +469,11 @@ export async function handleChatCore({ body, modelInfo, credentials, log, onCred // Create transform stream with logger for streaming response let transformStream; // For Codex provider, translate response from openai-responses to openai (Chat Completions) format - // UNLESS client originally sent in openai-responses format (like Droid CLI) - they expect same format back - const needsCodexTranslation = provider === 'codex' - && targetFormat === 'openai-responses' - && sourceFormat !== 'openai-responses'; + // UNLESS client is Droid CLI which expects openai-responses format back + const isDroidCLI = userAgent?.toLowerCase().includes('droid') || userAgent?.toLowerCase().includes('codex-cli'); + const needsCodexTranslation = provider === 'codex' + && targetFormat === 'openai-responses' + && !isDroidCLI; if (needsCodexTranslation) { // Codex returns openai-responses, translate to openai (Chat Completions) that clients expect