@@ -61,6 +61,10 @@ vi.mock("../model-suppression.js", () => {
|
61 | 61 | return undefined; |
62 | 62 | } |
63 | 63 | |
| 64 | +function isUnsupportedXaiMultiAgentModel(provider?: string, id?: string): boolean { |
| 65 | +return provider === "xai" && id?.trim().toLowerCase() === "grok-4.20-multi-agent-0309"; |
| 66 | +} |
| 67 | + |
64 | 68 | return { |
65 | 69 | shouldSuppressBuiltInModel: ({ |
66 | 70 | provider, |
@@ -79,6 +83,9 @@ vi.mock("../model-suppression.js", () => {
|
79 | 83 | ) { |
80 | 84 | return true; |
81 | 85 | } |
| 86 | +if (isUnsupportedXaiMultiAgentModel(provider, id)) { |
| 87 | +return true; |
| 88 | +} |
82 | 89 | return ( |
83 | 90 | (provider === "qwen" || provider === "modelstudio") && |
84 | 91 | id?.trim().toLowerCase() === "qwen3.6-plus" && |
@@ -92,7 +99,7 @@ vi.mock("../model-suppression.js", () => {
|
92 | 99 | ) { |
93 | 100 | return true; |
94 | 101 | } |
95 | | -return false; |
| 102 | +return isUnsupportedXaiMultiAgentModel(provider, id); |
96 | 103 | }, |
97 | 104 | buildSuppressedBuiltInModelError: ({ |
98 | 105 | provider, |
@@ -116,6 +123,9 @@ vi.mock("../model-suppression.js", () => {
|
116 | 123 | ) { |
117 | 124 | return `Unknown model: ${provider}/gpt-5.3-codex-spark. gpt-5.3-codex-spark is available only through ChatGPT/Codex OAuth. Run \`openclaw models auth login --provider openai\` and use openai/gpt-5.3-codex-spark with that OAuth profile; OpenAI API-key auth cannot use this model.`; |
118 | 125 | } |
| 126 | +if (isUnsupportedXaiMultiAgentModel(provider, id)) { |
| 127 | +return "Unknown model: xai/grok-4.20-multi-agent-0309. OpenClaw does not currently support xAI multi-agent models; choose another xAI model. See https://docs.openclaw.ai/providers/xai."; |
| 128 | +} |
119 | 129 | return undefined; |
120 | 130 | }, |
121 | 131 | }; |
@@ -3451,6 +3461,27 @@ describe("resolveModel", () => {
|
3451 | 3461 | ); |
3452 | 3462 | }); |
3453 | 3463 | |
| 3464 | +it("does not build a configured fallback for unsupported xAI multi-agent models", () => { |
| 3465 | +const cfg = { |
| 3466 | +models: { |
| 3467 | +providers: { |
| 3468 | +xai: { |
| 3469 | +baseUrl: "https://api.x.ai/v1", |
| 3470 | +api: "openai-completions", |
| 3471 | +models: [], |
| 3472 | +}, |
| 3473 | +}, |
| 3474 | +}, |
| 3475 | +} as unknown as OpenClawConfig; |
| 3476 | + |
| 3477 | +const result = resolveModelForTest("xai", "grok-4.20-multi-agent-0309", "/tmp/agent", cfg); |
| 3478 | + |
| 3479 | +expect(result.model).toBeUndefined(); |
| 3480 | +expect(result.error).toBe( |
| 3481 | +"Unknown model: xai/grok-4.20-multi-agent-0309. OpenClaw does not currently support xAI multi-agent models; choose another xAI model. See https://docs.openclaw.ai/providers/xai.", |
| 3482 | +); |
| 3483 | +}); |
| 3484 | + |
3454 | 3485 | it("rejects stale openai gpt-5.3-codex-spark discovery rows", () => { |
3455 | 3486 | mockDiscoveredModel(discoverModels, { |
3456 | 3487 | provider: "openai", |
|