


























@@ -855,8 +855,12 @@ describe("createModelSelectionState auto-failover overrides", () => {
855855modelOverrideFallbackOriginProvider?: string;
856856modelOverrideFallbackOriginModel?: string;
857857fallbackNoticeSelectedModel?: string;
858+authProfileOverride?: string;
859+authProfileOverrideSource?: "auto" | "user";
858860provider?: string;
859861model?: string;
862+primaryProvider?: string;
863+primaryModel?: string;
860864isHeartbeat?: boolean;
861865}) {
862866const cfg = {} as OpenClawConfig;
@@ -867,6 +871,8 @@ describe("createModelSelectionState auto-failover overrides", () => {
867871modelOverrideFallbackOriginProvider: params.modelOverrideFallbackOriginProvider,
868872modelOverrideFallbackOriginModel: params.modelOverrideFallbackOriginModel,
869873fallbackNoticeSelectedModel: params.fallbackNoticeSelectedModel,
874+authProfileOverride: params.authProfileOverride,
875+authProfileOverrideSource: params.authProfileOverrideSource,
870876});
871877const sessionStore = { [sessionKey]: sessionEntry };
872878const state = await createModelSelectionState({
@@ -877,6 +883,8 @@ describe("createModelSelectionState auto-failover overrides", () => {
877883 sessionKey,
878884 defaultProvider,
879885 defaultModel,
886+primaryProvider: params.primaryProvider,
887+primaryModel: params.primaryModel,
880888provider: params.provider ?? defaultProvider,
881889model: params.model ?? defaultModel,
882890hasModelDirective: false,
@@ -987,6 +995,39 @@ describe("createModelSelectionState auto-failover overrides", () => {
987995expect(sessionStore[sessionKey]?.modelOverrideFallbackOriginModel).toBeUndefined();
988996});
989997998+it("preserves user auth profile when clearing a stale heartbeat auto-failover override", async () => {
999+authProfileStoreMock.store = {
1000+version: 1,
1001+profiles: {
1002+"mac-studio:local": {
1003+type: "api_key",
1004+provider: defaultProvider,
1005+key: "test-key",
1006+},
1007+},
1008+};
1009+const { state, sessionStore } = await resolveStateWithOverride({
1010+providerOverride: "openrouter",
1011+modelOverride: "minimax/minimax-m2.7",
1012+modelOverrideSource: "auto",
1013+modelOverrideFallbackOriginProvider: "openai-codex",
1014+modelOverrideFallbackOriginModel: "gpt-5.3",
1015+authProfileOverride: "mac-studio:local",
1016+authProfileOverrideSource: "user",
1017+provider: "openrouter",
1018+model: "minimax/minimax-m2.7",
1019+isHeartbeat: true,
1020+});
1021+1022+expect(state.provider).toBe(defaultProvider);
1023+expect(state.model).toBe(defaultModel);
1024+expect(state.resetModelOverride).toBe(true);
1025+expect(sessionStore[sessionKey]?.providerOverride).toBeUndefined();
1026+expect(sessionStore[sessionKey]?.modelOverride).toBeUndefined();
1027+expect(sessionStore[sessionKey]?.authProfileOverride).toBe("mac-studio:local");
1028+expect(sessionStore[sessionKey]?.authProfileOverrideSource).toBe("user");
1029+});
1030+9901031it("keeps heartbeat auto-failover override when the fallback origin still matches default", async () => {
9911032const { state, sessionStore } = await resolveStateWithOverride({
9921033providerOverride: "openrouter",
@@ -1006,6 +1047,27 @@ describe("createModelSelectionState auto-failover overrides", () => {
10061047expect(sessionStore[sessionKey]?.modelOverride).toBe("minimax/minimax-m2.7");
10071048});
100810491050+it("keeps heartbeat auto-failover override when the origin matches the channel primary", async () => {
1051+const { state, sessionStore } = await resolveStateWithOverride({
1052+providerOverride: "openrouter",
1053+modelOverride: "minimax/minimax-m2.7",
1054+modelOverrideSource: "auto",
1055+modelOverrideFallbackOriginProvider: "openai",
1056+modelOverrideFallbackOriginModel: "gpt-4o",
1057+primaryProvider: "openai",
1058+primaryModel: "gpt-4o",
1059+provider: "openrouter",
1060+model: "minimax/minimax-m2.7",
1061+isHeartbeat: true,
1062+});
1063+1064+expect(state.provider).toBe("openrouter");
1065+expect(state.model).toBe("minimax/minimax-m2.7");
1066+expect(state.resetModelOverride).toBe(false);
1067+expect(sessionStore[sessionKey]?.providerOverride).toBe("openrouter");
1068+expect(sessionStore[sessionKey]?.modelOverride).toBe("minimax/minimax-m2.7");
1069+});
1070+10091071it("clears legacy heartbeat auto-failover override when no origin metadata exists", async () => {
10101072const { state, sessionStore } = await resolveStateWithOverride({
10111073providerOverride: "openrouter",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。