test(auth): validated websocket preference and session state propagation
- Added test assertions for `preferWebsockets` parity in `advisor-provider-options-parity.test.ts`. - Introduced a benchmark test to verify propagation of `providerSessionState` and `preferWebsockets` in `bench-auth-fallback.test.ts`.
This commit is contained in:
@@ -7,8 +7,8 @@
|
||||
* with only `sessionId`/`getApiKey`/telemetry — it dropped the session's
|
||||
* `streamFn` wrapper (so `providers.openrouterVariant` and `loopGuard` never
|
||||
* landed on advisor requests), its `promptCacheKey` (so OpenAI Responses
|
||||
* fell back to a different cache shard), and its shared `providerSessionState`
|
||||
* (so Codex websocket / Anthropic fast-mode state was not reused).
|
||||
* fell back to a different cache shard), its shared `providerSessionState`,
|
||||
* and its explicit websocket preference.
|
||||
*/
|
||||
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from "bun:test";
|
||||
import * as path from "node:path";
|
||||
@@ -68,7 +68,7 @@ describe("AgentSession advisor provider-options parity", () => {
|
||||
} catch {}
|
||||
});
|
||||
|
||||
it("inherits streamFn, promptCacheKey and providerSessionState from the session", () => {
|
||||
it("inherits streamFn, promptCacheKey, websocket preference, and providerSessionState from the session", () => {
|
||||
const advisorStreamFn: StreamFn = (m, ctx, opts) => streamSimple(m, ctx, opts);
|
||||
const mainAgent = new Agent({
|
||||
initialState: { model, systemPrompt: ["Test"], tools: [], messages: [] },
|
||||
@@ -80,6 +80,7 @@ describe("AgentSession advisor provider-options parity", () => {
|
||||
modelRegistry,
|
||||
advisorTools: [],
|
||||
advisorStreamFn,
|
||||
preferWebsockets: true,
|
||||
});
|
||||
session.settings.setModelRole("advisor", "anthropic/claude-sonnet-4-5");
|
||||
expect(session.setAdvisorEnabled(true)).toBe(true);
|
||||
@@ -97,6 +98,7 @@ describe("AgentSession advisor provider-options parity", () => {
|
||||
// Shared transport / fast-mode state map keeps Codex websockets and
|
||||
// Anthropic fast-mode fallbacks consistent across the two agents.
|
||||
expect(advisor.providerSessionState).toBe(session.providerSessionState);
|
||||
expect(session.preferWebsockets).toBe(true);
|
||||
|
||||
// Stable cache key on the advisor session id pins consecutive advisor
|
||||
// turns to the same OpenAI Responses cache shard.
|
||||
@@ -131,6 +133,7 @@ describe("AgentSession advisor provider-options parity", () => {
|
||||
onResponse,
|
||||
onSseEvent,
|
||||
transformProviderContext,
|
||||
preferWebsockets: true,
|
||||
});
|
||||
session.settings.setModelRole("advisor", "anthropic/claude-sonnet-4-5");
|
||||
expect(session.setAdvisorEnabled(true)).toBe(true);
|
||||
@@ -160,5 +163,6 @@ describe("AgentSession advisor provider-options parity", () => {
|
||||
expect(opts.sessionId).toBe(advisor.sessionId);
|
||||
expect(opts.promptCacheKey).toBe(advisor.sessionId);
|
||||
expect(opts.providerSessionState).toBe(session.providerSessionState);
|
||||
expect(opts.preferWebsockets).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -208,6 +208,39 @@ async function captureServiceTier(opts: {
|
||||
return { wire: captured?.serviceTier, summary: summary.serviceTier };
|
||||
}
|
||||
|
||||
describe("bench provider session state and websocket preference", () => {
|
||||
it("sends providerSessionState and preferWebsockets to the stream", async () => {
|
||||
const registry = fakeRegistry({
|
||||
models: [fakeModel("openai-codex", "gpt-5.5")],
|
||||
authedProviders: ["openai-codex"],
|
||||
});
|
||||
let captured: SimpleStreamOptions | undefined;
|
||||
await runBenchCommand(
|
||||
{ models: ["openai-codex/gpt-5.5"], flags: { runs: 1, maxTokens: 64, json: true } },
|
||||
{
|
||||
createRuntime: async () => ({
|
||||
modelRegistry: registry,
|
||||
settings: undefined,
|
||||
close: () => {},
|
||||
}),
|
||||
randomSessionId: () => "sess-1",
|
||||
writeStdout: () => {},
|
||||
writeStderr: () => {},
|
||||
setExitCode: () => {},
|
||||
streamSimple: (_model, _context, options) => {
|
||||
captured = options;
|
||||
return fakeStream();
|
||||
},
|
||||
now: () => 0,
|
||||
stdoutIsTTY: false,
|
||||
},
|
||||
);
|
||||
expect(captured?.providerSessionState).toBeInstanceOf(Map);
|
||||
expect(captured?.providerSessionState?.size).toBe(0);
|
||||
expect(captured?.preferWebsockets).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("bench service tier", () => {
|
||||
it("sends the configured serviceTier setting when no flag is passed", async () => {
|
||||
const { wire, summary } = await captureServiceTier({ setting: "flex" });
|
||||
|
||||
Reference in New Issue
Block a user