Skip to content

Commit c214ffc

Browse files
committed
fix deepseek responses uuid item ids for codex
Make openai-responses passthrough optionally rewrite non-canonical message/reasoning ids, fold reasoning_text into encrypted_content, and keep SSE rewrite consumers alive when events are dropped so DeepSeek Responses works with Codex CLI/TUI.
1 parent f9b9440 commit c214ffc

7 files changed

Lines changed: 430 additions & 68 deletions

src/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ const providerConfigSchema = z.object({
488488
message: z.array(z.string().min(1)).optional(),
489489
reasoning: z.array(z.string().min(1)).optional(),
490490
repairMissingTerminalIds: z.boolean().optional(),
491+
rewriteNonCanonicalIds: z.boolean().optional(),
491492
}).strict().optional(),
492493
}).passthrough();
493494

src/server/relay-eager.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,16 @@ export function relaySseEagerBounded(
123123
if (!next) break;
124124
const payload = sseDataPayload(next.block);
125125
const rewrittenPayload = payload === null ? null : rewrite!(payload);
126+
frameBuffer = next.rest;
127+
// Returning null from rewrite drops the entire SSE event.
128+
if (payload !== null && rewrittenPayload === null) continue;
126129
// Replace only on an actual change: replaceSseDataPayload collapses
127130
// multi-data-line events and normalizes newline style even when the
128131
// payload is identical, which corrupts valid streams.
129-
const block = payload !== null && rewrittenPayload !== payload
130-
? replaceSseDataPayload(next.block, rewrittenPayload!)
132+
const block = payload !== null && rewrittenPayload !== null && rewrittenPayload !== payload
133+
? replaceSseDataPayload(next.block, rewrittenPayload)
131134
: next.block;
132135
out += block + next.delimiter;
133-
frameBuffer = next.rest;
134136
}
135137
if (rewriteBudget) {
136138
const remaining = rewriteEncoder!.encode(frameBuffer).byteLength;
@@ -149,6 +151,14 @@ export function relaySseEagerBounded(
149151
const payload = sseDataPayload(tail);
150152
if (payload !== null) {
151153
const rewrittenPayload = rewrite(payload);
154+
if (rewrittenPayload === null) {
155+
frameBuffer = "";
156+
if (rewriteBudget && frameBufferBytes > 0) {
157+
rewriteBudget.releaseRetained(frameBufferBytes, { kind: "live_transient" });
158+
}
159+
frameBufferBytes = 0;
160+
return rewriteEncoder!.encode("");
161+
}
152162
if (rewrittenPayload !== payload) tail = replaceSseDataPayload(tail, rewrittenPayload);
153163
}
154164
frameBuffer = "";

0 commit comments

Comments
 (0)