From 8b556de03b3f1c5503223ab8ff5e528e9180fb08 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Sat, 21 Mar 2026 17:09:13 -0300 Subject: [PATCH] fix: preserve prompt_cache_key in Responses API translation, escape \n in tagContent (#517, #515) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(translator): preserve prompt_cache_key when translating Responses API requests (#517) — prompt_cache_key is an account-affinity signal used by Codex for prompt cache routing. Deleting it from the translated request prevented full cache effectiveness. Removed delete from openai-responses.ts and responsesApiHelper.ts cleanup blocks. fix(combo): escape \n in tagContent so injected JSON string is valid (#515) — omniModel tag content used template literal newlines (U+000A) which produce unescaped newline chars inside a JSON string value. Replaced with literal \n escape sequences for valid JSON injection in streaming SSE content chunks. --- open-sse/services/combo.ts | 2 +- open-sse/translator/helpers/responsesApiHelper.ts | 3 ++- open-sse/translator/request/openai-responses.ts | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/open-sse/services/combo.ts b/open-sse/services/combo.ts index 8dc2e99668..a8963b1a4d 100644 --- a/open-sse/services/combo.ts +++ b/open-sse/services/combo.ts @@ -472,7 +472,7 @@ export async function handleComboChat({ // SDKs close the connection on finish_reason, so anything sent after // that marker is silently dropped. if (!res.body) return res; - const tagContent = `\n${modelStr}\n`; + const tagContent = `\\n${modelStr}\\n`; const encoder = new TextEncoder(); const decoder = new TextDecoder(); let tagInjected = false; diff --git a/open-sse/translator/helpers/responsesApiHelper.ts b/open-sse/translator/helpers/responsesApiHelper.ts index 0d65111ebf..01967f6fd0 100644 --- a/open-sse/translator/helpers/responsesApiHelper.ts +++ b/open-sse/translator/helpers/responsesApiHelper.ts @@ -93,10 +93,11 @@ export function convertResponsesApiFormat(body) { } // Cleanup Responses API specific fields + // Note: prompt_cache_key is intentionally preserved — it is used by Codex and other + // providers as a cache-affinity signal. Stripping it breaks prompt caching (#517). delete result.input; delete result.instructions; delete result.include; - delete result.prompt_cache_key; delete result.store; delete result.reasoning; diff --git a/open-sse/translator/request/openai-responses.ts b/open-sse/translator/request/openai-responses.ts index 239c547562..11fcbe86aa 100644 --- a/open-sse/translator/request/openai-responses.ts +++ b/open-sse/translator/request/openai-responses.ts @@ -227,10 +227,11 @@ export function openaiResponsesToOpenAIRequest( }); // Cleanup Responses API specific fields + // Note: prompt_cache_key is intentionally preserved — it is used by Codex and other + // providers as a cache-affinity signal. Stripping it breaks prompt caching (#517). delete result.input; delete result.instructions; delete result.include; - delete result.prompt_cache_key; delete result.store; delete result.reasoning;