feat(models): support minimax highspeed across onboarding

This commit is contained in:
Peter Steinberger
2026-03-03 00:39:57 +00:00
parent 53fd7f8163
commit 77ecef1fde
10 changed files with 36 additions and 14 deletions

View File

@@ -6,6 +6,8 @@ Docs: https://docs.openclaw.ai
### Changes
- Models/MiniMax: add first-class `MiniMax-M2.5-highspeed` support across built-in provider catalogs, onboarding flows, and MiniMax OAuth plugin defaults, while keeping legacy `MiniMax-M2.5-Lightning` compatibility for existing configs.
- Docs/Models: refresh MiniMax, Moonshot (Kimi), GLM/Z.AI model docs to align with latest defaults (`MiniMax-M2.5`, `MiniMax-M2.5-highspeed`, `moonshot/kimi-k2.5`, `zai/glm-5`) and keep Moonshot model lists synced from shared source data.
- Outbound adapters/plugins: add shared `sendPayload` support across direct-text-media, Discord, Slack, WhatsApp, Zalo, and Zalouser with multi-media iteration and chunk-aware text fallback. (#30144) Thanks @nohat.
- Media understanding/audio echo: add optional `tools.media.audio.echoTranscript` + `echoFormat` to send a pre-agent transcript confirmation message to the originating chat, with echo disabled by default. (#32150) Thanks @AytuncYildizli.
- Plugin runtime/STT: add `api.runtime.stt.transcribeAudioFile(...)` so extensions can transcribe local audio files through OpenClaw's configured media-understanding audio providers. (#22402) Thanks @benthecarman.

View File

@@ -89,6 +89,12 @@ function createOAuthHandler(region: MiniMaxRegion) {
name: "MiniMax M2.5",
input: ["text"],
}),
buildModelDefinition({
id: "MiniMax-M2.5-highspeed",
name: "MiniMax M2.5 Highspeed",
input: ["text"],
reasoning: true,
}),
buildModelDefinition({
id: "MiniMax-M2.5-Lightning",
name: "MiniMax M2.5 Lightning",
@@ -103,6 +109,9 @@ function createOAuthHandler(region: MiniMaxRegion) {
defaults: {
models: {
[modelRef("MiniMax-M2.5")]: { alias: "minimax-m2.5" },
[modelRef("MiniMax-M2.5-highspeed")]: {
alias: "minimax-m2.5-highspeed",
},
[modelRef("MiniMax-M2.5-Lightning")]: {
alias: "minimax-m2.5-lightning",
},

View File

@@ -596,6 +596,11 @@ function buildMinimaxProvider(): ProviderConfig {
name: "MiniMax M2.5",
reasoning: true,
}),
buildMinimaxTextModel({
id: "MiniMax-M2.5-highspeed",
name: "MiniMax M2.5 Highspeed",
reasoning: true,
}),
buildMinimaxTextModel({
id: "MiniMax-M2.5-Lightning",
name: "MiniMax M2.5 Lightning",
@@ -616,6 +621,11 @@ function buildMinimaxPortalProvider(): ProviderConfig {
name: "MiniMax M2.5",
reasoning: true,
}),
buildMinimaxTextModel({
id: "MiniMax-M2.5-highspeed",
name: "MiniMax M2.5 Highspeed",
reasoning: true,
}),
buildMinimaxTextModel({
id: "MiniMax-M2.5-Lightning",
name: "MiniMax M2.5 Lightning",

View File

@@ -11,8 +11,8 @@ const LIVE = isTruthyEnvValue(process.env.ZAI_LIVE_TEST) || isTruthyEnvValue(pro
const describeLive = LIVE && ZAI_KEY ? describe : describe.skip;
async function expectModelReturnsAssistantText(modelId: "glm-4.7" | "glm-4.7-flashx") {
const model = getModel("zai", modelId as "glm-4.7");
async function expectModelReturnsAssistantText(modelId: "glm-5" | "glm-4.7") {
const model = getModel("zai", modelId);
const res = await completeSimple(
model,
{
@@ -26,10 +26,10 @@ async function expectModelReturnsAssistantText(modelId: "glm-4.7" | "glm-4.7-fla
describeLive("zai live", () => {
it("returns assistant text", async () => {
await expectModelReturnsAssistantText("glm-4.7");
await expectModelReturnsAssistantText("glm-5");
}, 20000);
it("glm-4.7-flashx returns assistant text", async () => {
await expectModelReturnsAssistantText("glm-4.7-flashx");
it("glm-4.7 returns assistant text", async () => {
await expectModelReturnsAssistantText("glm-4.7");
}, 20000);
});

View File

@@ -294,8 +294,8 @@ const BASE_AUTH_CHOICE_OPTIONS: ReadonlyArray<AuthChoiceOption> = [
},
{
value: "minimax-api-lightning",
label: "MiniMax M2.5 Lightning",
hint: "Faster, higher output cost",
label: "MiniMax M2.5 Highspeed",
hint: "Official fast tier (legacy: Lightning)",
},
{ value: "custom-api-key", label: "Custom Provider" },
];

View File

@@ -212,7 +212,7 @@ describe("applyAuthChoiceMiniMax", () => {
mode: "api_key",
});
expect(resolveAgentModelPrimaryValue(result?.config.agents?.defaults?.model)).toBe(
"minimax/MiniMax-M2.5-Lightning",
"minimax/MiniMax-M2.5-highspeed",
);
expect(text).not.toHaveBeenCalled();
expect(confirm).not.toHaveBeenCalled();

View File

@@ -112,7 +112,7 @@ export async function applyAuthChoiceMiniMax(
promptMessage: "Enter MiniMax API key",
modelRefPrefix: "minimax",
modelId:
params.authChoice === "minimax-api-lightning" ? "MiniMax-M2.5-Lightning" : "MiniMax-M2.5",
params.authChoice === "minimax-api-lightning" ? "MiniMax-M2.5-highspeed" : "MiniMax-M2.5",
applyDefaultConfig: applyMinimaxApiConfig,
applyProviderConfig: applyMinimaxApiProviderConfig,
});

View File

@@ -90,6 +90,7 @@ export const ZAI_DEFAULT_COST = {
const MINIMAX_MODEL_CATALOG = {
"MiniMax-M2.5": { name: "MiniMax M2.5", reasoning: true },
"MiniMax-M2.5-highspeed": { name: "MiniMax M2.5 Highspeed", reasoning: true },
"MiniMax-M2.5-Lightning": { name: "MiniMax M2.5 Lightning", reasoning: true },
} as const;

View File

@@ -370,9 +370,9 @@ describe("applyMinimaxApiConfig", () => {
});
});
it("does not set reasoning for non-reasoning models", () => {
it("keeps reasoning enabled for MiniMax-M2.5", () => {
const cfg = applyMinimaxApiConfig({}, "MiniMax-M2.5");
expect(cfg.models?.providers?.minimax?.models[0]?.reasoning).toBe(false);
expect(cfg.models?.providers?.minimax?.models[0]?.reasoning).toBe(true);
});
it("preserves existing model params when adding alias", () => {
@@ -514,8 +514,8 @@ describe("primary model defaults", () => {
it("sets correct primary model", () => {
const configCases = [
{
getConfig: () => applyMinimaxApiConfig({}, "MiniMax-M2.5-Lightning"),
primaryModel: "minimax/MiniMax-M2.5-Lightning",
getConfig: () => applyMinimaxApiConfig({}, "MiniMax-M2.5-highspeed"),
primaryModel: "minimax/MiniMax-M2.5-highspeed",
},
{
getConfig: () => applyZaiConfig({}, { modelId: "glm-5" }),

View File

@@ -831,7 +831,7 @@ export async function applyNonInteractiveAuthChoice(params: {
mode: "api_key",
});
const modelId =
authChoice === "minimax-api-lightning" ? "MiniMax-M2.5-Lightning" : "MiniMax-M2.5";
authChoice === "minimax-api-lightning" ? "MiniMax-M2.5-highspeed" : "MiniMax-M2.5";
return isCn
? applyMinimaxApiConfigCn(nextConfig, modelId)
: applyMinimaxApiConfig(nextConfig, modelId);