























@@ -3959,8 +3959,8 @@ describe("runAgentTurnWithFallback", () => {
39593959});
3960396039613961const followupRun = createFollowupRun();
3962-followupRun.run.provider = "anthropic";
3963-followupRun.run.model = "claude-opus-4-6";
3962+followupRun.run.provider = "bailian";
3963+followupRun.run.model = "qwen3.6-plus";
3964396439653965const sessionEntry: SessionEntry = {
39663966sessionId: "session",
@@ -4007,6 +4007,71 @@ describe("runAgentTurnWithFallback", () => {
40074007expect(sessionEntry.modelOverrideSource).toBeUndefined();
40084008});
400940094010+it("persists fallback selection for recovered auto overrides without modelOverrideSource", async () => {
4011+state.runWithModelFallbackMock.mockImplementation(
4012+async (params: { run: (provider: string, model: string) => Promise<unknown> }) => ({
4013+result: await params.run("openai-codex", "gpt-5.4"),
4014+provider: "openai-codex",
4015+model: "gpt-5.4",
4016+attempts: [],
4017+}),
4018+);
4019+state.runEmbeddedPiAgentMock.mockResolvedValue({
4020+payloads: [{ text: "ok" }],
4021+meta: {},
4022+});
4023+4024+const followupRun = createFollowupRun();
4025+followupRun.run.provider = "anthropic";
4026+followupRun.run.model = "claude-opus-4-6";
4027+4028+const sessionEntry: SessionEntry = {
4029+sessionId: "session",
4030+updatedAt: Date.now(),
4031+totalTokens: 1,
4032+compactionCount: 0,
4033+providerOverride: "bailian",
4034+modelOverride: "qwen3.6-plus",
4035+modelOverrideFallbackOriginProvider: "minimax",
4036+modelOverrideFallbackOriginModel: "MiniMax-M2.7",
4037+// modelOverrideSource intentionally absent
4038+};
4039+const sessionStore = { main: sessionEntry };
4040+4041+const runAgentTurnWithFallback = await getRunAgentTurnWithFallback();
4042+const result = await runAgentTurnWithFallback({
4043+commandBody: "hello",
4044+ followupRun,
4045+sessionCtx: {
4046+Provider: "telegram",
4047+MessageSid: "msg",
4048+} as unknown as TemplateContext,
4049+opts: {},
4050+typingSignals: createMockTypingSignaler(),
4051+blockReplyPipeline: null,
4052+blockStreamingEnabled: false,
4053+resolvedBlockStreamingBreak: "message_end",
4054+applyReplyToMode: (payload) => payload,
4055+shouldEmitToolResult: () => true,
4056+shouldEmitToolOutput: () => false,
4057+pendingToolTasks: new Set(),
4058+resetSessionAfterCompactionFailure: async () => false,
4059+resetSessionAfterRoleOrderingConflict: async () => false,
4060+isHeartbeat: false,
4061+sessionKey: "main",
4062+getActiveSessionEntry: () => sessionEntry,
4063+activeSessionStore: sessionStore,
4064+resolvedVerboseLevel: "off",
4065+});
4066+4067+expect(result.kind).toBe("success");
4068+expect(sessionEntry.providerOverride).toBe("openai-codex");
4069+expect(sessionEntry.modelOverride).toBe("gpt-5.4");
4070+expect(sessionEntry.modelOverrideSource).toBe("auto");
4071+expect(sessionEntry.modelOverrideFallbackOriginProvider).toBe("minimax");
4072+expect(sessionEntry.modelOverrideFallbackOriginModel).toBe("MiniMax-M2.7");
4073+});
4074+40104075it("does not persist fallback selection when modelOverrideSource is user", async () => {
40114076// Regression: fallback persistence overwrote user-initiated /models
40124077// selections. When the user explicitly picked a model, the fallback
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。