diff --git a/CHANGELOG.md b/CHANGELOG.md index 40225a1808a..d53c28181f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ Docs: https://docs.openclaw.ai ### Fixes +- MiniMax music generation: switch the bundled default model from the unsupported `music-2.5+` id to the current `music-2.6` API model. Fixes #64870 and #62315. Thanks @noahclanman and @edwardzheng1. - Google media generation: strip a configured trailing `/v1beta` from Google music/video provider base URLs before calling the Google GenAI SDK, preventing doubled `/v1beta/v1beta` paths. Fixes #63240. (#63258) Thanks @Hybirdss. - Google Chat: preserve reply text when a typing indicator message is deleted or can no longer be updated, so media captions and first text chunks are resent instead of silently disappearing. (#71498) Thanks @colin-lgtm. - Cron: tolerate malformed legacy job rows in startup, main-session system-event payloads, and human-readable `cron list` output so missing `state`, `payload.text`, or display fields no longer crash the scheduler or CLI. Fixes #66016, #65916, #64137, #57872, #59968, #63813, #52804, and #43163. (#71509) Thanks @vincentkoc. diff --git a/docs/gateway/config-agents.md b/docs/gateway/config-agents.md index 61447670c6b..31f4a583f4a 100644 --- a/docs/gateway/config-agents.md +++ b/docs/gateway/config-agents.md @@ -347,7 +347,7 @@ Time format in system prompt. Default: `auto` (OS preference). - If omitted, `image_generate` can still infer an auth-backed provider default. It tries the current default provider first, then the remaining registered image-generation providers in provider-id order. - `musicGenerationModel`: accepts either a string (`"provider/model"`) or an object (`{ primary, fallbacks }`). - Used by the shared music-generation capability and the built-in `music_generate` tool. - - Typical values: `google/lyria-3-clip-preview`, `google/lyria-3-pro-preview`, or `minimax/music-2.5+`. + - Typical values: `google/lyria-3-clip-preview`, `google/lyria-3-pro-preview`, or `minimax/music-2.6`. - If omitted, `music_generate` can still infer an auth-backed provider default. It tries the current default provider first, then the remaining registered music-generation providers in provider-id order. - If you select a provider/model directly, configure the matching provider auth/API key too. - `videoGenerationModel`: accepts either a string (`"provider/model"`) or an object (`{ primary, fallbacks }`). diff --git a/docs/help/testing-live.md b/docs/help/testing-live.md index 21c4f00f6f6..30e098b3480 100644 --- a/docs/help/testing-live.md +++ b/docs/help/testing-live.md @@ -492,7 +492,7 @@ image-generation runtime, and the live provider request. - `comfy`: separate Comfy live file, not this shared sweep - Optional narrowing: - `OPENCLAW_LIVE_MUSIC_GENERATION_PROVIDERS="google,minimax"` - - `OPENCLAW_LIVE_MUSIC_GENERATION_MODELS="google/lyria-3-clip-preview,minimax/music-2.5+"` + - `OPENCLAW_LIVE_MUSIC_GENERATION_MODELS="google/lyria-3-clip-preview,minimax/music-2.6"` - Optional auth behavior: - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` to force profile-store auth and ignore env-only overrides diff --git a/docs/providers/minimax.md b/docs/providers/minimax.md index 88bc78ff027..b752e9f0cff 100644 --- a/docs/providers/minimax.md +++ b/docs/providers/minimax.md @@ -12,7 +12,7 @@ MiniMax also provides: - Bundled speech synthesis via T2A v2 - Bundled image understanding via `MiniMax-VL-01` -- Bundled music generation via `music-2.5+` +- Bundled music generation via `music-2.6` - Bundled `web_search` through the MiniMax Coding Plan search API Provider split: @@ -30,7 +30,7 @@ Provider split: | `MiniMax-M2.7-highspeed` | Chat (reasoning) | Faster M2.7 reasoning tier | | `MiniMax-VL-01` | Vision | Image understanding model | | `image-01` | Image generation | Text-to-image and image-to-image editing | -| `music-2.5+` | Music generation | Default music model | +| `music-2.6` | Music generation | Default music model | | `music-2.5` | Music generation | Previous music generation tier | | `music-2.0` | Music generation | Legacy music generation tier | | `MiniMax-Hailuo-2.3` | Video generation | Text-to-video and image reference flows | @@ -282,7 +282,7 @@ The bundled `minimax` plugin registers MiniMax T2A v2 as a speech provider for The bundled `minimax` plugin also registers music generation through the shared `music_generate` tool. -- Default music model: `minimax/music-2.5+` +- Default music model: `minimax/music-2.6` - Also supports `minimax/music-2.5` and `minimax/music-2.0` - Prompt controls: `lyrics`, `instrumental`, `durationSeconds` - Output format: `mp3` @@ -295,7 +295,7 @@ To use MiniMax as the default music provider: agents: { defaults: { musicGenerationModel: { - primary: "minimax/music-2.5+", + primary: "minimax/music-2.6", }, }, }, diff --git a/docs/tools/music-generation.md b/docs/tools/music-generation.md index 54f860cda15..47aa4e42e87 100644 --- a/docs/tools/music-generation.md +++ b/docs/tools/music-generation.md @@ -81,7 +81,7 @@ Example: | -------- | ---------------------- | ---------------- | --------------------------------------------------------- | -------------------------------------- | | ComfyUI | `workflow` | Up to 1 image | Workflow-defined music or audio | `COMFY_API_KEY`, `COMFY_CLOUD_API_KEY` | | Google | `lyria-3-clip-preview` | Up to 10 images | `lyrics`, `instrumental`, `format` | `GEMINI_API_KEY`, `GOOGLE_API_KEY` | -| MiniMax | `music-2.5+` | None | `lyrics`, `instrumental`, `durationSeconds`, `format=mp3` | `MINIMAX_API_KEY` | +| MiniMax | `music-2.6` | None | `lyrics`, `instrumental`, `durationSeconds`, `format=mp3` | `MINIMAX_API_KEY` | ### Declared capability matrix @@ -176,7 +176,7 @@ Duplicate prevention: if a music task is already `queued` or `running` for the c defaults: { musicGenerationModel: { primary: "google/lyria-3-clip-preview", - fallbacks: ["minimax/music-2.5+"], + fallbacks: ["minimax/music-2.6"], }, }, }, diff --git a/extensions/minimax/music-generation-provider.test.ts b/extensions/minimax/music-generation-provider.test.ts index 7e9c5c51f1d..d015d102b6e 100644 --- a/extensions/minimax/music-generation-provider.test.ts +++ b/extensions/minimax/music-generation-provider.test.ts @@ -47,7 +47,6 @@ describe("minimax music generation provider", () => { const provider = buildMinimaxMusicGenerationProvider(); const result = await provider.generateMusic({ provider: "minimax", - model: "music-2.5+", prompt: "upbeat dance-pop with female vocals", cfg: {}, lyrics: "our city wakes", @@ -61,7 +60,7 @@ describe("minimax music generation provider", () => { get: expect.any(Function), }), body: expect.objectContaining({ - model: "music-2.5+", + model: "music-2.6", lyrics: "our city wakes", output_format: "url", audio_setting: { @@ -95,7 +94,7 @@ describe("minimax music generation provider", () => { const provider = buildMinimaxMusicGenerationProvider(); const result = await provider.generateMusic({ provider: "minimax", - model: "music-2.5+", + model: "music-2.6", prompt: "upbeat dance-pop with female vocals", cfg: {}, lyrics: "our city wakes", @@ -116,7 +115,7 @@ describe("minimax music generation provider", () => { await expect( provider.generateMusic({ provider: "minimax", - model: "music-2.5+", + model: "music-2.6", prompt: "driving techno", cfg: {}, instrumental: true, @@ -135,7 +134,7 @@ describe("minimax music generation provider", () => { const provider = buildMinimaxMusicGenerationProvider(); await provider.generateMusic({ provider: "minimax", - model: "music-2.5+", + model: "music-2.6", prompt: "upbeat dance-pop", cfg: {}, }); @@ -143,7 +142,7 @@ describe("minimax music generation provider", () => { expect(postJsonRequestMock).toHaveBeenCalledWith( expect.objectContaining({ body: expect.objectContaining({ - model: "music-2.5+", + model: "music-2.6", lyrics_optimizer: true, }), }), diff --git a/extensions/minimax/music-generation-provider.ts b/extensions/minimax/music-generation-provider.ts index 58ff8c9cbba..1b94f16f2a6 100644 --- a/extensions/minimax/music-generation-provider.ts +++ b/extensions/minimax/music-generation-provider.ts @@ -15,7 +15,7 @@ import { import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime"; const DEFAULT_MINIMAX_MUSIC_BASE_URL = "https://api.minimax.io"; -const DEFAULT_MINIMAX_MUSIC_MODEL = "music-2.5+"; +const DEFAULT_MINIMAX_MUSIC_MODEL = "music-2.6"; const DEFAULT_TIMEOUT_MS = 120_000; type MinimaxBaseResp = { @@ -125,7 +125,7 @@ export function buildMinimaxMusicGenerationProvider(): MusicGenerationProvider { id: "minimax", label: "MiniMax", defaultModel: DEFAULT_MINIMAX_MUSIC_MODEL, - models: [DEFAULT_MINIMAX_MUSIC_MODEL, "music-2.5", "music-2.0"], + models: [DEFAULT_MINIMAX_MUSIC_MODEL, "music-2.6-free", "music-cover", "music-cover-free"], isConfigured: ({ agentDir }) => isProviderApiKeyConfigured({ provider: "minimax", diff --git a/src/agents/tools/music-generate-tool.test.ts b/src/agents/tools/music-generate-tool.test.ts index fe3de1fd365..6a683685014 100644 --- a/src/agents/tools/music-generate-tool.test.ts +++ b/src/agents/tools/music-generate-tool.test.ts @@ -333,8 +333,8 @@ describe("createMusicGenerateTool", () => { vi.spyOn(musicGenerationRuntime, "listRuntimeMusicGenerationProviders").mockReturnValue([ { id: "minimax", - defaultModel: "music-2.5+", - models: ["music-2.5+"], + defaultModel: "music-2.6", + models: ["music-2.6"], capabilities: { generate: { maxTracks: 1, @@ -355,7 +355,7 @@ describe("createMusicGenerateTool", () => { config: asConfig({ agents: { defaults: { - musicGenerationModel: { primary: "minimax/music-2.5+" }, + musicGenerationModel: { primary: "minimax/music-2.6" }, }, }, }), @@ -457,7 +457,7 @@ describe("createMusicGenerateTool", () => { it("surfaces normalized durations from runtime metadata", async () => { vi.spyOn(musicGenerationRuntime, "generateMusic").mockResolvedValue({ provider: "minimax", - model: "music-2.5+", + model: "music-2.6", attempts: [], ignoredOverrides: [], tracks: [ @@ -489,7 +489,7 @@ describe("createMusicGenerateTool", () => { config: asConfig({ agents: { defaults: { - musicGenerationModel: { primary: "minimax/music-2.5+" }, + musicGenerationModel: { primary: "minimax/music-2.6" }, }, }, }), @@ -521,8 +521,8 @@ describe("createMusicGenerateTool", () => { vi.spyOn(musicGenerationRuntime, "listRuntimeMusicGenerationProviders").mockReturnValue([ { id: "minimax", - defaultModel: "music-2.5+", - models: ["music-2.5+"], + defaultModel: "music-2.6", + models: ["music-2.6"], capabilities: { edit: { enabled: true, maxInputImages: 1 }, }, @@ -538,7 +538,7 @@ describe("createMusicGenerateTool", () => { }); vi.spyOn(musicGenerationRuntime, "generateMusic").mockResolvedValue({ provider: "minimax", - model: "music-2.5+", + model: "music-2.6", attempts: [], ignoredOverrides: [], tracks: [{ buffer: Buffer.from("music"), mimeType: "audio/mpeg" }], @@ -553,7 +553,7 @@ describe("createMusicGenerateTool", () => { config: asConfig({ agents: { defaults: { - musicGenerationModel: { primary: "minimax/music-2.5+" }, + musicGenerationModel: { primary: "minimax/music-2.6" }, }, }, tools: { web: { fetch: { ssrfPolicy: { allowRfc2544BenchmarkRange: true } } } }, diff --git a/src/music-generation/live-test-helpers.ts b/src/music-generation/live-test-helpers.ts index db861ebf3e2..a0034c6072b 100644 --- a/src/music-generation/live-test-helpers.ts +++ b/src/music-generation/live-test-helpers.ts @@ -11,7 +11,7 @@ export { parseProviderModelMap, redactLiveApiKey }; export const DEFAULT_LIVE_MUSIC_MODELS: Record = { google: "google/lyria-3-clip-preview", - minimax: "minimax/music-2.5+", + minimax: "minimax/music-2.6", }; export function parseCsvFilter(raw?: string): Set | null { diff --git a/src/music-generation/runtime.test.ts b/src/music-generation/runtime.test.ts index 6c9248cef86..99197050fd2 100644 --- a/src/music-generation/runtime.test.ts +++ b/src/music-generation/runtime.test.ts @@ -93,13 +93,13 @@ describe("music-generation runtime", () => { if (providerId === "minimax") { return { id: "minimax", - defaultModel: "music-2.5+", + defaultModel: "music-2.6", capabilities: {}, isConfigured: () => true, async generateMusic() { return { tracks: [{ buffer: Buffer.from("mp3-bytes"), mimeType: "audio/mpeg" }], - model: "music-2.5+", + model: "music-2.6", }; }, }; @@ -116,7 +116,7 @@ describe("music-generation runtime", () => { }, { id: "minimax", - defaultModel: "music-2.5+", + defaultModel: "music-2.6", capabilities: {}, isConfigured: () => true, generateMusic: async () => ({ tracks: [] }), @@ -129,7 +129,7 @@ describe("music-generation runtime", () => { }); expect(result.provider).toBe("minimax"); - expect(result.model).toBe("music-2.5+"); + expect(result.model).toBe("music-2.6"); expect(result.attempts).toEqual([ { provider: "google", @@ -302,7 +302,7 @@ describe("music-generation runtime", () => { durationSeconds?: number; } | undefined; - mocks.resolveAgentModelPrimaryValue.mockReturnValue("minimax/music-2.5+"); + mocks.resolveAgentModelPrimaryValue.mockReturnValue("minimax/music-2.6"); mocks.getMusicGenerationProvider.mockReturnValue({ id: "minimax", capabilities: { @@ -317,7 +317,7 @@ describe("music-generation runtime", () => { }; return { tracks: [{ buffer: Buffer.from("mp3-bytes"), mimeType: "audio/mpeg" }], - model: "music-2.5+", + model: "music-2.6", }; }, }); @@ -326,7 +326,7 @@ describe("music-generation runtime", () => { cfg: { agents: { defaults: { - musicGenerationModel: { primary: "minimax/music-2.5+" }, + musicGenerationModel: { primary: "minimax/music-2.6" }, }, }, } as OpenClawConfig,