fix(agent): honor explicit OpenAI SSE transport

This commit is contained in:
Peter Steinberger
2026-05-01 11:51:45 +01:00
parent 702e23835d
commit b68f3de91b
3 changed files with 42 additions and 5 deletions

View File

@@ -1917,6 +1917,7 @@ describe("createOpenAIWebSocketStreamFn", () => {
releaseWsSession("sess-2");
releaseWsSession("sess-boundary");
releaseWsSession("sess-fallback");
releaseWsSession("sess-explicit-sse");
releaseWsSession("sess-boundary-http-fallback");
releaseWsSession("sess-full-context-replay");
releaseWsSession("sess-encrypted-full-context-replay");
@@ -2681,6 +2682,33 @@ describe("createOpenAIWebSocketStreamFn", () => {
}
});
it("ends the HTTP fallback stream when explicit SSE transport is selected", async () => {
const streamFn = createOpenAIWebSocketStreamFn("sk-test", "sess-explicit-sse");
const stream = await resolveStream(
streamFn(
modelStub as Parameters<typeof streamFn>[0],
contextStub as Parameters<typeof streamFn>[1],
{ transport: "sse" } as Parameters<typeof streamFn>[2],
),
);
await expect(
Promise.race([
(
stream as unknown as {
result: () => Promise<{ content?: Array<{ text?: string }> }>;
}
).result(),
new Promise((_, reject) =>
setTimeout(() => reject(new Error("SSE fallback result timed out")), 100),
),
]),
).resolves.toMatchObject({
content: [{ text: "http fallback response" }],
});
expect(streamSimpleCalls).toHaveLength(1);
});
it("falls back to HTTP when WebSocket errors before any output in auto mode", async () => {
const streamFn = createOpenAIWebSocketStreamFn("sk-test", "sess-runtime-fallback");
const stream = streamFn(

View File

@@ -1346,6 +1346,7 @@ async function fallbackToHttp(
}
eventStream.push(event);
}
eventStream.end();
}
export const __testing = {

View File

@@ -1691,11 +1691,19 @@ export async function runEmbeddedAttempt(
agentDir,
workspaceDir: effectiveWorkspace,
});
const shouldUseWebSocketTransport = shouldUseOpenAIWebSocketTransport({
provider: params.provider,
modelApi: params.model.api,
modelBaseUrl: params.model.baseUrl,
});
const hasExplicitSseTransport = [
(params.streamParams as { transport?: unknown } | undefined)?.transport,
(params.model as { params?: { transport?: unknown } }).params?.transport,
]
.map((value) => (typeof value === "string" ? value.trim().toLowerCase() : ""))
.includes("sse");
const shouldUseWebSocketTransport =
!hasExplicitSseTransport &&
shouldUseOpenAIWebSocketTransport({
provider: params.provider,
modelApi: params.model.api,
modelBaseUrl: params.model.baseUrl,
});
const wsApiKey = shouldUseWebSocketTransport
? await resolveEmbeddedAgentApiKey({
provider: params.provider,