diff --git a/CHANGELOG.md b/CHANGELOG.md index 2185aa155..2a71d4a97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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. diff --git a/extensions/minimax-portal-auth/index.ts b/extensions/minimax-portal-auth/index.ts index 7a9b1af04..51c1b6e1e 100644 --- a/extensions/minimax-portal-auth/index.ts +++ b/extensions/minimax-portal-auth/index.ts @@ -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", }, diff --git a/src/agents/models-config.providers.ts b/src/agents/models-config.providers.ts index bd9e97df5..5c4907bc2 100644 --- a/src/agents/models-config.providers.ts +++ b/src/agents/models-config.providers.ts @@ -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", diff --git a/src/agents/zai.live.test.ts b/src/agents/zai.live.test.ts index 0ec7e493b..c500d1a34 100644 --- a/src/agents/zai.live.test.ts +++ b/src/agents/zai.live.test.ts @@ -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); }); diff --git a/src/commands/auth-choice-options.ts b/src/commands/auth-choice-options.ts index 0296b306d..c534da48c 100644 --- a/src/commands/auth-choice-options.ts +++ b/src/commands/auth-choice-options.ts @@ -294,8 +294,8 @@ const BASE_AUTH_CHOICE_OPTIONS: ReadonlyArray = [ }, { 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" }, ]; diff --git a/src/commands/auth-choice.apply.minimax.test.ts b/src/commands/auth-choice.apply.minimax.test.ts index b561e22b3..f38ac3101 100644 --- a/src/commands/auth-choice.apply.minimax.test.ts +++ b/src/commands/auth-choice.apply.minimax.test.ts @@ -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(); diff --git a/src/commands/auth-choice.apply.minimax.ts b/src/commands/auth-choice.apply.minimax.ts index 7dba5d34c..86e5a485a 100644 --- a/src/commands/auth-choice.apply.minimax.ts +++ b/src/commands/auth-choice.apply.minimax.ts @@ -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, }); diff --git a/src/commands/onboard-auth.models.ts b/src/commands/onboard-auth.models.ts index 5aa0f2067..583da0520 100644 --- a/src/commands/onboard-auth.models.ts +++ b/src/commands/onboard-auth.models.ts @@ -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; diff --git a/src/commands/onboard-auth.test.ts b/src/commands/onboard-auth.test.ts index 319fd9864..3774c699d 100644 --- a/src/commands/onboard-auth.test.ts +++ b/src/commands/onboard-auth.test.ts @@ -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" }), diff --git a/src/commands/onboard-non-interactive/local/auth-choice.ts b/src/commands/onboard-non-interactive/local/auth-choice.ts index 54a38d844..88710fa1b 100644 --- a/src/commands/onboard-non-interactive/local/auth-choice.ts +++ b/src/commands/onboard-non-interactive/local/auth-choice.ts @@ -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);