Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ Current honest limitation:
- the curated registry currently contains these supported models:
- `qwen3-235b` -> `qwen/qwen3-235b-a22b-instruct-2507-fp8`
- `kimi-k2.6` -> `moonshotai/kimi-k2.6` (default)
- `minimax-m2.7` -> `minimaxai/minimax-m2.7`

## What the Repo Does and Does Not Do

Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

## [Unreleased]

- Added `minimaxai/minimax-m2.7` to the curated GonkaGate model registry under the `minimax-m2.7` model key.
- Added `moonshotai/kimi-k2.6` to the curated GonkaGate model registry under the `kimi-k2.6` model key and made it the default model.
- The installer now fetches GonkaGate `GET /v1/models` after API key entry, requires every curated model to be live, and uses the live metadata for OpenClaw provider model catalog entries.
- The installer now creates or updates `agents.defaults.models` with the curated GonkaGate allowlist so OpenClaw `/models` can switch between supported models.
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ Current curated registry in this package:

- `qwen3-235b` -> `qwen/qwen3-235b-a22b-instruct-2507-fp8`
- `kimi-k2.6` -> `moonshotai/kimi-k2.6` (default)
- `minimax-m2.7` -> `minimaxai/minimax-m2.7`

## What It Does

Expand Down
7 changes: 7 additions & 0 deletions src/constants/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ const curatedModelRegistry = [
modelId: "moonshotai/kimi-k2.6",
description: "Recommended default for long-horizon coding and agentic workflows on GonkaGate.",
isDefault: true
},
{
key: "minimax-m2.7",
displayName: "MiniMax M2.7",
modelId: "minimaxai/minimax-m2.7",
description: "MiniMax model on GonkaGate.",
isDefault: false
}
] as const satisfies readonly SupportedModelDefinition[];

Expand Down
17 changes: 15 additions & 2 deletions test/gonkagate-models.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ test("fetchCuratedGonkaGateModelCatalog fetches and maps live curated model meta
name: "Unsupported",
object: "model"
},
{
id: "minimaxai/minimax-m2.7",
name: "MiniMax M2.7 Live",
object: "model"
},
{
context_length: 262144,
id: "qwen/qwen3-235b-a22b-instruct-2507-fp8",
Expand All @@ -47,7 +52,7 @@ test("fetchCuratedGonkaGateModelCatalog fetches and maps live curated model meta

assert.equal(capturedUrl, "https://api.gonkagate.com/v1/models");
assert.equal(capturedAuthorization, "Bearer gp-test-key");
assert.deepEqual(catalog.map((entry) => entry.model.key), ["qwen3-235b", "kimi-k2.6"]);
assert.deepEqual(catalog.map((entry) => entry.model.key), ["qwen3-235b", "kimi-k2.6", "minimax-m2.7"]);
assert.deepEqual(catalog[0]?.providerModel, {
contextWindow: 262144,
id: "qwen/qwen3-235b-a22b-instruct-2507-fp8",
Expand All @@ -57,6 +62,10 @@ test("fetchCuratedGonkaGateModelCatalog fetches and maps live curated model meta
id: "moonshotai/kimi-k2.6",
name: "Kimi K2.6 Live"
});
assert.deepEqual(catalog[2]?.providerModel, {
id: "minimaxai/minimax-m2.7",
name: "MiniMax M2.7 Live"
});
});

test("fetchCuratedGonkaGateModelCatalog retries temporary catalog unavailability", async () => {
Expand All @@ -82,6 +91,9 @@ test("fetchCuratedGonkaGateModelCatalog retries temporary catalog unavailability
},
{
id: "qwen/qwen3-235b-a22b-instruct-2507-fp8"
},
{
id: "minimaxai/minimax-m2.7"
}
]
})
Expand All @@ -92,7 +104,7 @@ test("fetchCuratedGonkaGateModelCatalog retries temporary catalog unavailability
});

assert.equal(calls, 2);
assert.deepEqual(catalog.map((entry) => entry.model.key), ["qwen3-235b", DEFAULT_MODEL.key]);
assert.deepEqual(catalog.map((entry) => entry.model.key), ["qwen3-235b", DEFAULT_MODEL.key, "minimax-m2.7"]);
});

test("fetchCuratedGonkaGateModelCatalog rejects invalid API keys before config writes", async () => {
Expand Down Expand Up @@ -160,6 +172,7 @@ test("fetchCuratedGonkaGateModelCatalog rejects catalogs that omit a curated sup
assert.ok(error instanceof GonkaGateModelsError);
assert.equal(error.kind, "missing_supported_models");
assert.match(error.message, /moonshotai\/kimi-k2\.6/);
assert.match(error.message, /minimaxai\/minimax-m2\.7/);
return true;
}
);
Expand Down
2 changes: 1 addition & 1 deletion test/install-use-case.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -681,7 +681,7 @@ test("runInstallUseCase prompts with the curated models returned by the live Gon
targetPath: "/tmp/openclaw.json"
}, dependencies);

assert.deepEqual(promptModels, ["qwen3-235b", "kimi-k2.6"]);
assert.deepEqual(promptModels, ["qwen3-235b", "kimi-k2.6", "minimax-m2.7"]);
assert.equal(promptDefaultModelKey, DEFAULT_MODEL_KEY);
assert.equal(state.writeCalls, 1);
assert.deepEqual(((state.writtenSettings?.agents as Record<string, unknown>).defaults as Record<string, unknown>).model, {
Expand Down
8 changes: 6 additions & 2 deletions test/models.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,20 @@ import {
toPrimaryModelRef
} from "../src/constants/models.js";

test("curated registry includes Kimi K2.6 as the default model", () => {
test("curated registry includes Kimi K2.6 as the default model and MiniMax M2.7", () => {
assert.equal(DEFAULT_MODEL_KEY, "kimi-k2.6");
assert.equal(DEFAULT_MODEL.modelId, "moonshotai/kimi-k2.6");
assert.deepEqual(SUPPORTED_MODEL_KEYS, ["qwen3-235b", "kimi-k2.6"]);
assert.deepEqual(SUPPORTED_MODEL_KEYS, ["qwen3-235b", "kimi-k2.6", "minimax-m2.7"]);

const kimi = requireSupportedModel("kimi-k2.6");
const minimax = requireSupportedModel("minimax-m2.7");

assert.equal(kimi.displayName, "Kimi K2.6");
assert.equal(kimi.modelId, "moonshotai/kimi-k2.6");
assert.equal(toPrimaryModelRef(kimi), "openai/moonshotai/kimi-k2.6");
assert.equal(minimax.displayName, "MiniMax M2.7");
assert.equal(minimax.modelId, "minimaxai/minimax-m2.7");
assert.equal(toPrimaryModelRef(minimax), "openai/minimaxai/minimax-m2.7");
assert.equal(DEFAULT_MODEL, kimi);
assert.equal(getSupportedModelByKey("missing-model"), undefined);
});
Loading