























@@ -1029,7 +1029,7 @@ describe("runWithModelFallback", () => {
10291029});
10301030});
103110311032-it("puts configured primary next when an override model is requested", () => {
1032+it("puts configured fallbacks before the configured primary when an override model is requested", () => {
10331033const cfg = makeCfg({
10341034agents: {
10351035defaults: {
@@ -1049,10 +1049,37 @@ describe("runWithModelFallback", () => {
10491049}),
10501050).toEqual([
10511051{ provider: "anthropic", model: "claude-opus-4-5" },
1052+{ provider: "anthropic", model: "claude-haiku-3-5" },
1053+{ provider: "openrouter", model: "openrouter/deepseek-chat" },
10521054{ provider: "openai", model: "gpt-4.1-mini" },
10531055]);
10541056});
105510571058+it("keeps configured fallbacks before configured primary for duplicate provider model ids", () => {
1059+const cfg = makeCfg({
1060+agents: {
1061+defaults: {
1062+model: {
1063+primary: "deepseek/deepseek-v4-flash",
1064+fallbacks: ["minimax-portal/MiniMax-M2.7"],
1065+},
1066+},
1067+},
1068+});
1069+1070+expect(
1071+__testing.resolveFallbackCandidates({
1072+ cfg,
1073+provider: "qianfan",
1074+model: "deepseek-v4-flash",
1075+}),
1076+).toEqual([
1077+{ provider: "qianfan", model: "deepseek-v4-flash" },
1078+{ provider: "minimax-portal", model: "MiniMax-M2.7" },
1079+{ provider: "deepseek", model: "deepseek-v4-flash" },
1080+]);
1081+});
1082+10561083it("keeps configured fallback chain when current model is a configured fallback", () => {
10571084const cfg = makeCfg({
10581085agents: {
@@ -1102,7 +1129,7 @@ describe("runWithModelFallback", () => {
11021129]);
11031130});
110411311105-it("falls back to configured primary for override credential validation errors", async () => {
1132+it("tries configured fallbacks before primary for override credential validation errors", async () => {
11061133const cfg = makeCfg();
11071134const run = createOverrideFailureRun({
11081135overrideProvider: "anthropic",
@@ -1122,6 +1149,7 @@ describe("runWithModelFallback", () => {
11221149expect(result.result).toBe("ok");
11231150expect(run.mock.calls).toEqual([
11241151["anthropic", "claude-opus-4"],
1152+["anthropic", "claude-haiku-3-5"],
11251153["openai", "gpt-4.1-mini"],
11261154]);
11271155});
@@ -1196,7 +1224,7 @@ describe("runWithModelFallback", () => {
11961224provider: "anthropic",
11971225model: "claude-opus-4-6",
11981226error: new Error("Unknown model: anthropic/claude-opus-4-6"),
1199-expectedFallback: ["openai", "gpt-4.1-mini"],
1227+expectedFallback: ["anthropic", "claude-haiku-3-5"],
12001228},
12011229{
12021230name: "openai model not found",
@@ -1696,7 +1724,7 @@ describe("runWithModelFallback", () => {
16961724],
16971725},
16981726{
1699-name: "different provider skips configured fallbacks",
1727+name: "different provider uses configured primary when no fallbacks exist",
17001728cfg: makeCfg({
17011729agents: {
17021730defaults: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。