




























@@ -20,6 +20,7 @@ import type {
2020AssistantMessageEventStream,
2121Context,
2222} from "@mariozechner/pi-ai";
23+import { createAssistantMessageEventStream } from "@mariozechner/pi-ai";
2324import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2425import { isLiveTestEnabled } from "./live-test-helpers.js";
2526import type { OutputItem, ResponseObject } from "./openai-ws-connection.js";
@@ -108,8 +109,10 @@ async function runWebsocketToolFollowupTurn(params: {
108109await collectEvents(
109110params.streamFn(model, secondContext, {
110111transport: "websocket",
111-maxTokens: 128,
112-}),
112+maxTokens: 16,
113+reasoningEffort: "none",
114+textVerbosity: "low",
115+} as unknown as StreamFnParams[2]),
113116),
114117);
115118}
@@ -272,7 +275,9 @@ describe("OpenAI WebSocket e2e", () => {
272275streamFn(model, firstContext, {
273276transport: "websocket",
274277toolChoice: "required",
275-maxTokens: 128,
278+maxTokens: 16,
279+reasoningEffort: "none",
280+textVerbosity: "low",
276281} as unknown as StreamFnParams[2]),
277282);
278283const firstDone = expectDone(firstEvents);
@@ -419,15 +424,56 @@ describe("OpenAI WebSocket e2e", () => {
419424);
420425421426testFn(
422-"falls back to HTTP gracefully with invalid API key",
427+"falls back to HTTP gracefully when websocket connect fails",
423428async () => {
424429const sid = freshSession("fallback");
425-const streamFn = openAIWsStreamModule.createOpenAIWebSocketStreamFn("sk-invalid-key", sid);
426-const stream = streamFn(model, makeContext("Hello"), {});
430+openAIWsStreamModule.__testing.setDepsForTest({
431+createHttpFallbackStreamFn: () =>
432+(() => {
433+const stream = createAssistantMessageEventStream();
434+queueMicrotask(() => {
435+stream.push({
436+type: "done",
437+reason: "stop",
438+message: {
439+role: "assistant",
440+content: [{ type: "text", text: "FALLBACK_OK" }],
441+stopReason: "stop",
442+api: "openai-responses",
443+provider: "openai",
444+model: "gpt-5.4",
445+usage: {
446+input: 0,
447+output: 0,
448+cacheRead: 0,
449+cacheWrite: 0,
450+totalTokens: 0,
451+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
452+},
453+timestamp: Date.now(),
454+},
455+});
456+stream.end();
457+});
458+return stream;
459+}) as never,
460+});
461+const streamFn = openAIWsStreamModule.createOpenAIWebSocketStreamFn(API_KEY!, sid, {
462+managerOptions: {
463+url: "ws://127.0.0.1:1",
464+maxRetries: 0,
465+backoffDelaysMs: [0],
466+},
467+});
468+const stream = streamFn(model, makeContext("Reply with exactly FALLBACK_OK."), {
469+maxTokens: 8,
470+reasoningEffort: "none",
471+textVerbosity: "low",
472+} as unknown as StreamFnParams[2]);
427473const events = await collectEvents(stream);
428474429-const hasTerminal = events.some((e) => e.type === "done" || e.type === "error");
430-expect(hasTerminal).toBe(true);
475+const done = expectDone(events);
476+expect(assistantText(done)).toContain("FALLBACK_OK");
431477},
43247845_000,
433479);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。