From 8b27c489f5aed9ebacd79503caca4e15cb323efc Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 27 Apr 2026 03:39:19 +0100 Subject: [PATCH] test: bound openai websocket live e2e --- src/agents/openai-ws-stream.e2e.test.ts | 62 +++++++++++++++++++++---- 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/src/agents/openai-ws-stream.e2e.test.ts b/src/agents/openai-ws-stream.e2e.test.ts index 2f6392c10c0..65e411558a0 100644 --- a/src/agents/openai-ws-stream.e2e.test.ts +++ b/src/agents/openai-ws-stream.e2e.test.ts @@ -20,6 +20,7 @@ import type { AssistantMessageEventStream, Context, } from "@mariozechner/pi-ai"; +import { createAssistantMessageEventStream } from "@mariozechner/pi-ai"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { isLiveTestEnabled } from "./live-test-helpers.js"; import type { OutputItem, ResponseObject } from "./openai-ws-connection.js"; @@ -108,8 +109,10 @@ async function runWebsocketToolFollowupTurn(params: { await collectEvents( params.streamFn(model, secondContext, { transport: "websocket", - maxTokens: 128, - }), + maxTokens: 16, + reasoningEffort: "none", + textVerbosity: "low", + } as unknown as StreamFnParams[2]), ), ); } @@ -272,7 +275,9 @@ describe("OpenAI WebSocket e2e", () => { streamFn(model, firstContext, { transport: "websocket", toolChoice: "required", - maxTokens: 128, + maxTokens: 16, + reasoningEffort: "none", + textVerbosity: "low", } as unknown as StreamFnParams[2]), ); const firstDone = expectDone(firstEvents); @@ -419,15 +424,56 @@ describe("OpenAI WebSocket e2e", () => { ); testFn( - "falls back to HTTP gracefully with invalid API key", + "falls back to HTTP gracefully when websocket connect fails", async () => { const sid = freshSession("fallback"); - const streamFn = openAIWsStreamModule.createOpenAIWebSocketStreamFn("sk-invalid-key", sid); - const stream = streamFn(model, makeContext("Hello"), {}); + openAIWsStreamModule.__testing.setDepsForTest({ + createHttpFallbackStreamFn: () => + (() => { + const stream = createAssistantMessageEventStream(); + queueMicrotask(() => { + stream.push({ + type: "done", + reason: "stop", + message: { + role: "assistant", + content: [{ type: "text", text: "FALLBACK_OK" }], + stopReason: "stop", + api: "openai-responses", + provider: "openai", + model: "gpt-5.4", + usage: { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + totalTokens: 0, + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }, + }, + timestamp: Date.now(), + }, + }); + stream.end(); + }); + return stream; + }) as never, + }); + const streamFn = openAIWsStreamModule.createOpenAIWebSocketStreamFn(API_KEY!, sid, { + managerOptions: { + url: "ws://127.0.0.1:1", + maxRetries: 0, + backoffDelaysMs: [0], + }, + }); + const stream = streamFn(model, makeContext("Reply with exactly FALLBACK_OK."), { + maxTokens: 8, + reasoningEffort: "none", + textVerbosity: "low", + } as unknown as StreamFnParams[2]); const events = await collectEvents(stream); - const hasTerminal = events.some((e) => e.type === "done" || e.type === "error"); - expect(hasTerminal).toBe(true); + const done = expectDone(events); + expect(assistantText(done)).toContain("FALLBACK_OK"); }, 45_000, );