fix(minimax): default music generation to music 2.6

This commit is contained in:
Peter Steinberger
2026-04-25 10:51:39 +01:00
parent c1f359c276
commit ed8384d32d
10 changed files with 33 additions and 33 deletions

View File

@@ -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.

View File

@@ -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 }`).

View File

@@ -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

View File

@@ -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",
},
},
},

View File

@@ -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"],
},
},
},

View File

@@ -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,
}),
}),

View File

@@ -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",

View File

@@ -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 } } } },

View File

@@ -11,7 +11,7 @@ export { parseProviderModelMap, redactLiveApiKey };
export const DEFAULT_LIVE_MUSIC_MODELS: Record<string, string> = {
google: "google/lyria-3-clip-preview",
minimax: "minimax/music-2.5+",
minimax: "minimax/music-2.6",
};
export function parseCsvFilter(raw?: string): Set<string> | null {

View File

@@ -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,