Files
2026-07-13 13:39:12 +08:00

74 lines
2.9 KiB
TypeScript

// Port of upstream #2081 — forceStream (stream-only) providers must keep streaming even
// when the client asks for a non-streaming/JSON response. OmniRoute then accumulates the
// provider stream and returns a normal JSON body to the client (handleForcedSSEToJson).
import { describe, it } from "node:test";
import assert from "node:assert/strict";
import { resolveStreamFlag } from "../../open-sse/utils/aiSdkCompat.ts";
describe("resolveStreamFlag — forceStream / providerRequiresStreaming guard (#2081)", () => {
it("keeps streaming for a forceStream provider even when client prefers JSON and sets stream:false", () => {
// The bug: Accept: application/json + stream:false used to override providerRequiresStreaming,
// sending stream:false to a stream-only provider (e.g. CodeBuddy) → HTTP 400.
const result = resolveStreamFlag(
false, // body.stream = false
"application/json", // Accept header
undefined, // sourceFormat
{ providerRequiresStreaming: true }
);
assert.equal(result, true, "stream-only provider must stay streaming even when client prefers JSON");
});
it("non-forceStream provider: client prefers JSON + stream:false → non-streaming (unchanged behavior)", () => {
const result = resolveStreamFlag(
false,
"application/json",
undefined,
{ providerRequiresStreaming: false }
);
assert.equal(result, false, "normal provider should respect client JSON preference");
});
it("forceStream provider: no explicit stream flag → streams by default", () => {
const result = resolveStreamFlag(
undefined,
undefined,
undefined,
{ providerRequiresStreaming: true }
);
assert.equal(result, true);
});
it("ordinary provider with no special flags streams by default (backward compat)", () => {
const result = resolveStreamFlag(undefined, undefined);
assert.equal(result, true);
});
it("forceStream provider: client explicitly sends stream:true → stays true", () => {
const result = resolveStreamFlag(
true,
"application/json",
undefined,
{ providerRequiresStreaming: true }
);
assert.equal(result, true);
});
it("forceStream provider: client sends Accept: text/event-stream + stream:false → stays true", () => {
// SSE Accept header alone shouldn't be needed for stream-only providers,
// but providerRequiresStreaming should still force true.
const result = resolveStreamFlag(
false,
"text/event-stream",
undefined,
{ providerRequiresStreaming: true }
);
assert.equal(result, true);
});
it("without providerRequiresStreaming option, JSON client + stream:false still gets non-streaming", () => {
// Verify backward compatibility — no regression for callers that don't pass the option
const result = resolveStreamFlag(false, "application/json");
assert.equal(result, false);
});
});