diff --git a/open-sse/utils/stream.js b/open-sse/utils/stream.js index bcfff891..83f48713 100644 --- a/open-sse/utils/stream.js +++ b/open-sse/utils/stream.js @@ -253,6 +253,14 @@ export function createSSEStream(options = {}) { appendRequestLog({ model, provider, connectionId, tokens: null, status: "200 OK" }).catch(() => { }); } + // IMPORTANT: In passthrough mode we still must terminate the SSE stream. + // Some clients (e.g. OpenClaw) expect the OpenAI-style sentinel: + // data: [DONE]\n\n + // Without it they can hang until timeout and trigger failover. + const doneOutput = "data: [DONE]\n\n"; + reqLogger?.appendConvertedChunk?.(doneOutput); + controller.enqueue(sharedEncoder.encode(doneOutput)); + if (onStreamComplete) { onStreamComplete({ content: accumulatedContent,