fix(opencode-go): remove deprecated mimo-v2-omni and mimo-v2-pro model aliases (#103329)

* fix(opencode-go): remove deprecated mimo-v2-omni and mimo-v2-pro model aliases

These deprecated aliases reject agent requests from the OpenCode Go gateway.
Remove them from the provider catalog and clean up all references in probe
skip lists, CI workflows, and tests.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(opencode-go): complete deprecated MiMo cleanup

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
This commit is contained in:
krissding
2026-07-10 06:49:09 +01:00
committed by GitHub
co-authored by Claude Sonnet 4.6 Peter Steinberger
parent 461772868d
commit 1a0dc9b83f
9 changed files with 54 additions and 56 deletions
@@ -2123,7 +2123,7 @@ jobs:
- suite_id: native-live-src-gateway-profiles-opencode-go-mimo
suite_group: native-live-src-gateway-profiles-opencode-go
label: Native live gateway profiles OpenCode Go MiMo
command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=opencode-go OPENCLAW_LIVE_GATEWAY_MODELS=opencode-go/mimo-v2-omni,opencode-go/mimo-v2-pro,opencode-go/mimo-v2.5,opencode-go/mimo-v2.5-pro node .release-harness/scripts/test-live-shard.mjs native-live-src-gateway-profiles
command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=opencode-go OPENCLAW_LIVE_GATEWAY_MODELS=opencode-go/mimo-v2.5,opencode-go/mimo-v2.5-pro node .release-harness/scripts/test-live-shard.mjs native-live-src-gateway-profiles
timeout_minutes: 30
profile_env_only: false
advisory: true
+1
View File
@@ -25,6 +25,7 @@ Docs: https://docs.openclaw.ai
### Fixes
- **OpenCode Go MiMo catalog:** stop exposing the deprecated `mimo-v2-omni` and `mimo-v2-pro` aliases that reject agent requests, and keep release validation on the active MiMo V2.5 routes. (#103311, #103329) Thanks @krissding.
- **OpenAI-compatible streamed tool calls:** execute complete native tool calls from streams that end with SSE `data: [DONE]` but omit `finish_reason`, while keeping transport EOF and visible-text cases fail-closed. (#98124, #97994) Thanks @SunnyShu0925.
- **xAI provider aliases:** preserve Grok 4.3 and Grok 4.5 thinking profiles, fast-model routing, and encrypted reasoning replay when models use the shipped `x-ai` provider alias instead of clamping valid thinking requests to `minimal`. (#103315)
- **Doctor state isolation:** prevent automated update and Gateway watch repair from importing and archiving default-home exec or plugin-binding approvals when `OPENCLAW_STATE_DIR` points elsewhere, keep implicit CLI preflight notice-only, and reserve cross-state imports for direct operator doctor runs. (#103247, #103317)
-2
View File
@@ -81,9 +81,7 @@ Bundled rows:
| `opencode-go/kimi-k2.5` | Kimi K2.5 | 262,144 | 65,536 | Yes |
| `opencode-go/kimi-k2.6` | Kimi K2.6 | 262,144 | 65,536 | Yes |
| `opencode-go/kimi-k2.7-code` | Kimi K2.7 Code | 262,144 | 262,144 | Yes |
| `opencode-go/mimo-v2-omni` | MiMo V2 Omni | 262,144 | 32,000 | Yes |
| `opencode-go/mimo-v2.5` | MiMo V2.5 | 1M | 128,000 | Yes |
| `opencode-go/mimo-v2-pro` | MiMo V2 Pro | 1,048,576 | 32,000 | No |
| `opencode-go/mimo-v2.5-pro` | MiMo V2.5 Pro | 1,048,576 | 128,000 | No |
| `opencode-go/minimax-m2.5` | MiniMax M2.5 | 204,800 | 65,536 | No |
| `opencode-go/minimax-m2.7` | MiniMax M2.7 | 204,800 | 131,072 | No |
+30 -4
View File
@@ -10,7 +10,10 @@ import { expectPassthroughReplayPolicy } from "openclaw/plugin-sdk/provider-test
import { beforeEach, describe, expect, it, vi } from "vitest";
import plugin from "./index.js";
import manifest from "./openclaw.plugin.json" with { type: "json" };
import { buildOpencodeGoLiveProviderConfig } from "./provider-catalog.js";
import {
buildOpencodeGoLiveProviderConfig,
buildStaticOpencodeGoProviderConfig,
} from "./provider-catalog.js";
import opencodeGoProviderDiscovery from "./provider-discovery.js";
function requireRecord(value: unknown, label: string): Record<string, unknown> {
@@ -92,9 +95,7 @@ describe("opencode-go provider plugin", () => {
"kimi-k2.5",
"kimi-k2.6",
"kimi-k2.7-code",
"mimo-v2-omni",
"mimo-v2.5",
"mimo-v2-pro",
"mimo-v2.5-pro",
"minimax-m2.5",
"minimax-m2.7",
@@ -251,7 +252,7 @@ describe("opencode-go provider plugin", () => {
const deepSeekPro = result.provider.models.find((model) => model.id === "deepseek-v4-pro");
const glm52 = result.provider.models.find((model) => model.id === "glm-5.2");
expect(result.provider.models).toHaveLength(20);
expect(result.provider.models).toHaveLength(18);
expect(deepSeekPro).toMatchObject({
provider: "opencode-go",
contextWindow: 1_000_000,
@@ -277,6 +278,31 @@ describe("opencode-go provider plugin", () => {
).resolves.toBeNull();
});
it("keeps deprecated upstream MiMo aliases out of static and live catalogs", async () => {
const deprecatedModelIds = ["mimo-v2-omni", "mimo-v2-pro"];
const activeModelIds = ["mimo-v2.5", "mimo-v2.5-pro"];
const staticModelIds = buildStaticOpencodeGoProviderConfig().models.map((model) => model.id);
expect(staticModelIds).toEqual(expect.arrayContaining(activeModelIds));
expect(staticModelIds).toEqual(expect.not.arrayContaining(deprecatedModelIds));
const fetchGuard = vi.fn(async () => ({
response: new Response(
JSON.stringify({
data: [...deprecatedModelIds, ...activeModelIds].map((id) => ({ id, object: "model" })),
}),
),
finalUrl: "https://opencode.ai/zen/go/v1/models",
release: vi.fn(async () => undefined),
}));
const live = await buildOpencodeGoLiveProviderConfig({
discoveryApiKey: "resolved-opencode-key",
fetchGuard,
});
expect(live.models.map((model) => model.id)).toEqual(activeModelIds);
});
it("does not mix provider-specific runtime auth with shared discovery auth", async () => {
const provider = await registerSingleProviderPlugin(plugin);
const fetchMock = vi.spyOn(globalThis, "fetch").mockRejectedValue(new Error("blocked fetch"));
@@ -196,23 +196,6 @@ const OPENCODE_GO_MODELS = (
contextWindow: 262_144,
maxTokens: 262_144,
},
{
id: "mimo-v2-omni",
name: "MiMo V2 Omni",
api: "openai-completions",
provider: PROVIDER_ID,
baseUrl: OPENCODE_GO_OPENAI_BASE_URL,
reasoning: true,
input: ["text", "image"],
cost: {
input: 0,
output: 0,
cacheRead: 0,
cacheWrite: 0,
},
contextWindow: 262_144,
maxTokens: 32_000,
},
{
id: "mimo-v2.5",
name: "MiMo V2.5",
@@ -230,23 +213,6 @@ const OPENCODE_GO_MODELS = (
contextWindow: 1_000_000,
maxTokens: 128_000,
},
{
id: "mimo-v2-pro",
name: "MiMo V2 Pro",
api: "openai-completions",
provider: PROVIDER_ID,
baseUrl: OPENCODE_GO_OPENAI_BASE_URL,
reasoning: true,
input: ["text"],
cost: {
input: 0,
output: 0,
cacheRead: 0,
cacheWrite: 0,
},
contextWindow: 1_048_576,
maxTokens: 32_000,
},
{
id: "mimo-v2.5-pro",
name: "MiMo V2.5 Pro",
@@ -103,10 +103,6 @@ describe("live model turn probes", () => {
expect(shouldSkipLiveModelFileProbe({ provider: "google", id: "gemini-3.1-pro-preview" })).toBe(
true,
);
expect(shouldSkipLiveModelFileProbe({ provider: "opencode-go", id: "mimo-v2-omni" })).toBe(
true,
);
expect(shouldSkipLiveModelFileProbe({ provider: "opencode-go", id: "mimo-v2-pro" })).toBe(true);
expect(shouldSkipLiveModelFileProbe({ provider: "opencode-go", id: "minimax-m2.5" })).toBe(
true,
);
@@ -165,9 +161,6 @@ describe("live model turn probes", () => {
id: "accounts/fireworks/models/kimi-k2p6",
}),
).toBe(true);
expect(shouldSkipLiveModelImageProbe({ provider: "opencode-go", id: "mimo-v2-omni" })).toBe(
true,
);
expect(shouldSkipLiveModelImageProbe({ provider: "opencode-go", id: "kimi-k2.5" })).toBe(true);
expect(
shouldSkipLiveModelImageProbe({
-3
View File
@@ -23,8 +23,6 @@ const KNOWN_EMPTY_FILE_PROBE_MODELS = new Set([
"google/gemini-3.1-pro-preview-customtools",
"opencode-go/glm-5",
"opencode-go/glm-5.1",
"opencode-go/mimo-v2-omni",
"opencode-go/mimo-v2-pro",
"opencode-go/minimax-m2.5",
"openrouter/arcee-ai/trinity-mini",
"openrouter/deepseek/deepseek-chat-v3.1",
@@ -46,7 +44,6 @@ const KNOWN_EMPTY_IMAGE_PROBE_MODELS = new Set([
"fireworks/accounts/fireworks/routers/kimi-k2p5-turbo",
"google/gemini-3.1-pro-preview-customtools",
"opencode/kimi-k2.6",
"opencode-go/mimo-v2-omni",
"opencode-go/kimi-k2.5",
"opencode-go/kimi-k2.6",
"openrouter/amazon/nova-pro-v1",
+3 -3
View File
@@ -1165,13 +1165,13 @@ describe("image tool implicit imageModel config", () => {
const result = await tool.execute("t1", {
prompt: "Describe this image.",
image: `data:image/png;base64,${ONE_PIXEL_PNG_B64}`,
model: "opencode-go/mimo-v2-omni",
model: "opencode-go/mimo-v2.5",
});
const request = firstImageRequest(describeImage);
expect(request.provider).toBe("opencode-go");
expect(request.model).toBe("mimo-v2-omni");
expectToolText(result, "ok opencode-go/mimo-v2-omni");
expect(request.model).toBe("mimo-v2.5");
expectToolText(result, "ok opencode-go/mimo-v2.5");
});
});
@@ -60,6 +60,7 @@ type WorkflowMatrixEntry = {
advisory?: boolean;
command?: string;
profiles?: string;
suite_group?: string;
suite_id?: string;
};
@@ -1079,8 +1080,6 @@ describe("package artifact reuse", () => {
expect(workflow).toContain("suite_group: native-live-extensions-media-video");
expect(workflow).toContain("OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS=google,minimax");
expect(workflow).toContain("OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS=openai,openrouter,xai");
expect(workflow).toContain("suite_group: native-live-src-gateway-profiles-opencode-go");
expect(workflow).toContain("opencode-go/mimo-v2-omni");
expect(workflow).toContain(
"inputs.live_suite_filter == 'native-live-src-gateway-profiles-anthropic'",
);
@@ -1125,6 +1124,24 @@ describe("package artifact reuse", () => {
);
});
it("pins OpenCode Go MiMo live profiles to both current V2.5 model refs", () => {
const mimo = workflowMatrixEntry(
LIVE_E2E_WORKFLOW,
"validate_live_provider_suites",
"native-live-src-gateway-profiles-opencode-go-mimo",
);
expect(mimo).toMatchObject({
advisory: true,
command:
"OPENCLAW_LIVE_GATEWAY_PROVIDERS=opencode-go OPENCLAW_LIVE_GATEWAY_MODELS=opencode-go/mimo-v2.5,opencode-go/mimo-v2.5-pro node .release-harness/scripts/test-live-shard.mjs native-live-src-gateway-profiles",
profiles: "full",
suite_group: "native-live-src-gateway-profiles-opencode-go",
});
expect(mimo.command).not.toContain("opencode-go/mimo-v2-omni");
expect(mimo.command).not.toContain("opencode-go/mimo-v2-pro");
});
it("runs Docker live harnesses from trusted helper scripts", () => {
const workflow = readFileSync(LIVE_E2E_WORKFLOW, "utf8");
const scenarios = readFileSync("scripts/lib/docker-e2e-scenarios.mjs", "utf8");