






















@@ -71,16 +71,43 @@ function firstResponseResult(respond: ReturnType<typeof vi.fn>) {
7171return respond.mock.calls[0]?.[1];
7272}
737374-test("e2e #76482: session with different model gets its own thinking levels through gateway row + consumer fallback", async () => {
74+type ThinkingSession = {
75+key: string;
76+modelProvider?: string;
77+model?: string;
78+thinkingLevels?: Array<{ label: string }>;
79+thinkingOptions?: string[];
80+};
81+82+type SessionsListResult = {
83+sessions?: ThinkingSession[];
84+defaults?: Parameters<typeof resolveThinkingLevelsConsumerSide>[1];
85+};
86+87+async function listMainSessionWithThinking(params: {
88+reqId: string;
89+primaryModel: string;
90+sessionModelProvider: string;
91+sessionModel: string;
92+loadGatewayModelCatalog?: () => Promise<
93+Array<{
94+provider: string;
95+id: string;
96+name: string;
97+reasoning: boolean;
98+compat?: { supportedReasoningEfforts?: string[] };
99+}>
100+>;
101+}) {
75102await createSessionStoreDir();
76103testState.agentConfig = {
77-model: { primary: "openai/gpt-5.5" },
104+model: { primary: params.primaryModel },
78105};
79106await writeSessionStore({
80107entries: {
81108main: sessionStoreEntry("sess-main", {
82-modelProvider: "test-extended",
83-model: "extended-reasoner",
109+modelProvider: params.sessionModelProvider,
110+model: params.sessionModel,
84111}),
85112},
86113});
@@ -89,30 +116,42 @@ test("e2e #76482: session with different model gets its own thinking levels thro
89116const sessionsHandlers = await getSessionsHandlers();
90117const { getRuntimeConfig } = await getGatewayConfigModule();
91118await sessionsHandlers["sessions.list"]({
92-req: { type: "req", id: "req-e2e-extended", method: "sessions.list", params: {} },
119+req: { type: "req", id: params.reqId, method: "sessions.list", params: {} },
93120params: {},
94121 respond,
95122client: null,
96123isWebchatConnect: () => false,
97124context: {
98125 getRuntimeConfig,
99-// Provide a catalog with xhigh support — simulates what a real gateway
100-// resolves for models like DeepSeek V4 Pro
101-loadGatewayModelCatalog: async () => [
102-{
103-provider: "test-extended",
104-id: "extended-reasoner",
105-name: "Extended Reasoner",
106-reasoning: true,
107-compat: { supportedReasoningEfforts: ["xhigh"] },
108-},
109-],
126+loadGatewayModelCatalog: params.loadGatewayModelCatalog ?? (async () => []),
110127} as never,
111128});
112129113-const result = firstResponseResult(respond);
114-const session = result?.sessions?.find((s: { key: string }) => s.key === "agent:main:main");
115-const defaults = result?.defaults;
130+const result = firstResponseResult(respond) as SessionsListResult | undefined;
131+return {
132+session: result?.sessions?.find((s) => s.key === "agent:main:main"),
133+defaults: result?.defaults,
134+};
135+}
136+137+test("e2e #76482: session with different model gets its own thinking levels through gateway row + consumer fallback", async () => {
138+const { session, defaults } = await listMainSessionWithThinking({
139+reqId: "req-e2e-extended",
140+primaryModel: "openai/gpt-5.5",
141+sessionModelProvider: "test-extended",
142+sessionModel: "extended-reasoner",
143+loadGatewayModelCatalog: async () => [
144+// Provide a catalog with xhigh support — simulates what a real gateway
145+// resolves for models like DeepSeek V4 Pro
146+{
147+provider: "test-extended",
148+id: "extended-reasoner",
149+name: "Extended Reasoner",
150+reasoning: true,
151+compat: { supportedReasoningEfforts: ["xhigh"] },
152+},
153+],
154+});
116155117156// Gateway includes thinkingOptions for lightweight rows (needed by Control UI)
118157expect(session?.thinkingOptions?.length).toBeGreaterThan(0);
@@ -130,35 +169,13 @@ test("e2e #76482: session with different model gets its own thinking levels thro
130169});
131170132171test("e2e #76482: Anthropic session does not leak DeepSeek thinking levels from defaults", async () => {
133-await createSessionStoreDir();
134-testState.agentConfig = {
135-model: { primary: "deepseek/deepseek-v4-pro" },
136-};
137-await writeSessionStore({
138-entries: {
139-main: sessionStoreEntry("sess-main", {
140-modelProvider: "anthropic",
141-model: "claude-sonnet-4-6",
142-}),
143-},
144-});
145-146-const respond = vi.fn();
147-const sessionsHandlers = await getSessionsHandlers();
148-const { getRuntimeConfig } = await getGatewayConfigModule();
149-await sessionsHandlers["sessions.list"]({
150-req: { type: "req", id: "req-e2e-anthropic", method: "sessions.list", params: {} },
151-params: {},
152- respond,
153-client: null,
154-isWebchatConnect: () => false,
155-context: { getRuntimeConfig, loadGatewayModelCatalog: async () => [] } as never,
172+const { session, defaults } = await listMainSessionWithThinking({
173+reqId: "req-e2e-anthropic",
174+primaryModel: "deepseek/deepseek-v4-pro",
175+sessionModelProvider: "anthropic",
176+sessionModel: "claude-sonnet-4-6",
156177});
157178158-const result = firstResponseResult(respond);
159-const session = result?.sessions?.find((s: { key: string }) => s.key === "agent:main:main");
160-const defaults = result?.defaults;
161-162179// Session model differs from default
163180expect(session?.modelProvider).toBe("anthropic");
164181expect(defaults?.modelProvider).toBe("deepseek");
@@ -173,35 +190,13 @@ test("e2e #76482: Anthropic session does not leak DeepSeek thinking levels from
173190});
174191175192test("e2e #76482: session matching default model inherits default thinking levels", async () => {
176-await createSessionStoreDir();
177-testState.agentConfig = {
178-model: { primary: "openai/gpt-5.5" },
179-};
180-await writeSessionStore({
181-entries: {
182-main: sessionStoreEntry("sess-main", {
183-modelProvider: "openai",
184-model: "gpt-5.5",
185-}),
186-},
187-});
188-189-const respond = vi.fn();
190-const sessionsHandlers = await getSessionsHandlers();
191-const { getRuntimeConfig } = await getGatewayConfigModule();
192-await sessionsHandlers["sessions.list"]({
193-req: { type: "req", id: "req-e2e-same", method: "sessions.list", params: {} },
194-params: {},
195- respond,
196-client: null,
197-isWebchatConnect: () => false,
198-context: { getRuntimeConfig, loadGatewayModelCatalog: async () => [] } as never,
193+const { session, defaults } = await listMainSessionWithThinking({
194+reqId: "req-e2e-same",
195+primaryModel: "openai/gpt-5.5",
196+sessionModelProvider: "openai",
197+sessionModel: "gpt-5.5",
199198});
200199201-const result = firstResponseResult(respond);
202-const session = result?.sessions?.find((s: { key: string }) => s.key === "agent:main:main");
203-const defaults = result?.defaults;
204-205200// Session matches default → consumer should use defaults
206201expect(session?.modelProvider).toBe(defaults?.modelProvider);
207202此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。