diff --git a/packages/pi-ai/scripts/generate-models.ts b/packages/pi-ai/scripts/generate-models.ts index a36dacfef..a35300b85 100644 --- a/packages/pi-ai/scripts/generate-models.ts +++ b/packages/pi-ai/scripts/generate-models.ts @@ -268,6 +268,15 @@ function applyThinkingLevelMetadata(model: Model): void { ) { mergeAnthropicMessagesCompat(model, { forceAdaptiveThinking: true }); } + if ( + (model.provider === "minimax" || model.provider === "minimax-cn") && + model.api === "anthropic-messages" && + model.id === "MiniMax-M3" + ) { + // M3 exposes adaptive and disabled thinking modes over the Anthropic-compatible + // endpoint, so force adaptive thinking instead of the budget-based default. + mergeAnthropicMessagesCompat(model, { forceAdaptiveThinking: true }); + } if (model.api === "openai-completions" && model.id.includes("deepseek-v4")) { mergeThinkingLevelMap(model, DEEPSEEK_V4_THINKING_LEVEL_MAP); } @@ -1786,12 +1795,16 @@ async function generateModels() { } } - const minimaxDirectModelOverrides = new Map([ + const minimaxDirectModelOverrides = new Map< + string, + { contextWindow: number; maxTokens: number; input?: ("text" | "image" | "video")[] } + >([ ["MiniMax-M2.7", { contextWindow: 204800, maxTokens: 131072 }], ["MiniMax-M2.7-highspeed", { contextWindow: 204800, maxTokens: 131072 }], // MiniMax's API overview advertises a 1M context window for M3; models.dev - // currently reports the documented guaranteed 512K floor. - ["MiniMax-M3", { contextWindow: 1000000, maxTokens: 131072 }], + // currently reports the documented guaranteed 512K floor. M3 also accepts + // video inputs alongside text and image, which models.dev does not report. + ["MiniMax-M3", { contextWindow: 1000000, maxTokens: 131072, input: ["text", "image", "video"] }], ]); const minimaxDirectSupportedIds = new Set(minimaxDirectModelOverrides.keys()); @@ -1804,6 +1817,9 @@ async function generateModels() { if (override) { candidate.contextWindow = override.contextWindow; candidate.maxTokens = override.maxTokens; + if (override.input) { + candidate.input = override.input; + } } } } diff --git a/packages/pi-ai/src/model-catalog.ts b/packages/pi-ai/src/model-catalog.ts index d998f9a54..c34986491 100644 --- a/packages/pi-ai/src/model-catalog.ts +++ b/packages/pi-ai/src/model-catalog.ts @@ -111,7 +111,7 @@ const ModelCatalogEntrySchema = Type.Object({ baseUrl: Type.String(), reasoning: Type.Boolean(), thinkingLevelMap: Type.Optional(ThinkingLevelMapSchema), - input: Type.Array(Type.Union([Type.Literal("text"), Type.Literal("image")]), { minItems: 1 }), + input: Type.Array(Type.Union([Type.Literal("text"), Type.Literal("image"), Type.Literal("video")]), { minItems: 1 }), cost: Type.Object({ input: Type.Number(), output: Type.Number(), diff --git a/packages/pi-ai/src/models.generated.json b/packages/pi-ai/src/models.generated.json index ffc2230fe..5df2a079f 100644 --- a/packages/pi-ai/src/models.generated.json +++ b/packages/pi-ai/src/models.generated.json @@ -7694,10 +7694,14 @@ "api": "anthropic-messages", "provider": "minimax", "baseUrl": "https://api.minimax.io/anthropic", + "compat": { + "forceAdaptiveThinking": true + }, "reasoning": true, "input": [ "text", - "image" + "image", + "video" ], "cost": { "input": 0.6, @@ -7754,10 +7758,14 @@ "api": "anthropic-messages", "provider": "minimax-cn", "baseUrl": "https://api.minimaxi.com/anthropic", + "compat": { + "forceAdaptiveThinking": true + }, "reasoning": true, "input": [ "text", - "image" + "image", + "video" ], "cost": { "input": 0.6, diff --git a/packages/pi-ai/src/models.generated.ts b/packages/pi-ai/src/models.generated.ts index 0ded61628..a5db0f87d 100644 --- a/packages/pi-ai/src/models.generated.ts +++ b/packages/pi-ai/src/models.generated.ts @@ -6132,8 +6132,9 @@ export const MODELS = { api: "anthropic-messages", provider: "minimax", baseUrl: "https://api.minimax.io/anthropic", + compat: {"forceAdaptiveThinking":true}, reasoning: true, - input: ["text", "image"], + input: ["text", "image", "video"], cost: { input: 0.6, output: 2.4, @@ -6185,8 +6186,9 @@ export const MODELS = { api: "anthropic-messages", provider: "minimax-cn", baseUrl: "https://api.minimaxi.com/anthropic", + compat: {"forceAdaptiveThinking":true}, reasoning: true, - input: ["text", "image"], + input: ["text", "image", "video"], cost: { input: 0.6, output: 2.4, diff --git a/packages/pi-ai/src/types.ts b/packages/pi-ai/src/types.ts index d839b5724..864a9e6b1 100644 --- a/packages/pi-ai/src/types.ts +++ b/packages/pi-ai/src/types.ts @@ -609,7 +609,7 @@ export interface Model { * Missing keys use provider defaults. null marks a level as unsupported. */ thinkingLevelMap?: ThinkingLevelMap; - input: ("text" | "image")[]; + input: ("text" | "image" | "video")[]; cost: { input: number; // $/million tokens output: number; // $/million tokens diff --git a/packages/pi-ai/test/generated-models.test.ts b/packages/pi-ai/test/generated-models.test.ts index 763eb2d95..6b584eb91 100644 --- a/packages/pi-ai/test/generated-models.test.ts +++ b/packages/pi-ai/test/generated-models.test.ts @@ -180,7 +180,8 @@ describe("models.generated.ts", () => { provider, baseUrl, reasoning: true, - input: ["text", "image"], + input: ["text", "image", "video"], + compat: { forceAdaptiveThinking: true }, cost: { input: 0.6, output: 2.4, diff --git a/packages/pi-coding-agent/src/core/model-registry.ts b/packages/pi-coding-agent/src/core/model-registry.ts index 391e611e2..0594f9bc2 100644 --- a/packages/pi-coding-agent/src/core/model-registry.ts +++ b/packages/pi-coding-agent/src/core/model-registry.ts @@ -1167,7 +1167,7 @@ export class ModelRegistry { private getDiscoveryProviderDefaults(provider: string): { api: Api; baseUrl: string; - input: ("text" | "image")[]; + input: Model["input"]; contextWindow: number; maxTokens: number; } {