diff --git a/core/llm/autodetect.ts b/core/llm/autodetect.ts index 4085d3798b7..05120f98bd4 100644 --- a/core/llm/autodetect.ts +++ b/core/llm/autodetect.ts @@ -67,6 +67,7 @@ const PROVIDER_HANDLES_TEMPLATING: string[] = [ "openrouter", "deepseek", "xAI", + "minimax", "groq", "gemini", "docker", @@ -248,6 +249,7 @@ const PARALLEL_PROVIDERS: string[] = [ "vertexai", "function-network", "scaleway", + "minimax", ]; function llmCanGenerateInParallel(provider: string, model: string): boolean { diff --git a/core/llm/llms/MiniMax.ts b/core/llm/llms/MiniMax.ts new file mode 100644 index 00000000000..a40078a543b --- /dev/null +++ b/core/llm/llms/MiniMax.ts @@ -0,0 +1,40 @@ +import { ChatMessage, CompletionOptions, LLMOptions } from "../../index.js"; + +import OpenAI from "./OpenAI.js"; + +class MiniMax extends OpenAI { + static providerName = "minimax"; + static defaultOptions: Partial = { + apiBase: "https://api.minimax.io/v1/", + model: "MiniMax-M2.7", + useLegacyCompletionsEndpoint: false, + }; + + protected _convertArgs( + options: CompletionOptions, + messages: ChatMessage[], + ) { + const finalOptions = super._convertArgs(options, messages); + + // MiniMax requires temperature in (0.0, 1.0] — zero is rejected + if ( + finalOptions.temperature !== undefined && + finalOptions.temperature !== null + ) { + if (finalOptions.temperature <= 0) { + finalOptions.temperature = 0.01; + } else if (finalOptions.temperature > 1) { + finalOptions.temperature = 1.0; + } + } + + // MiniMax does not support response_format + if ((finalOptions as any).response_format) { + delete (finalOptions as any).response_format; + } + + return finalOptions; + } +} + +export default MiniMax; diff --git a/core/llm/llms/index.ts b/core/llm/llms/index.ts index 04f58e393de..a0711f1fbdd 100644 --- a/core/llm/llms/index.ts +++ b/core/llm/llms/index.ts @@ -38,6 +38,7 @@ import Lemonade from "./Lemonade"; import LMStudio from "./LMStudio"; import Mistral from "./Mistral"; import Mimo from "./Mimo"; +import MiniMax from "./MiniMax"; import MockLLM from "./Mock"; import Moonshot from "./Moonshot"; import Msty from "./Msty"; @@ -92,6 +93,7 @@ export const LLMClasses = [ LMStudio, Mistral, Mimo, + MiniMax, Bedrock, BedrockImport, SageMaker, diff --git a/docs/customize/model-providers/more/minimax.mdx b/docs/customize/model-providers/more/minimax.mdx new file mode 100644 index 00000000000..e0a56e2cfbc --- /dev/null +++ b/docs/customize/model-providers/more/minimax.mdx @@ -0,0 +1,55 @@ +--- +title: "How to Configure MiniMax with Continue" +sidebarTitle: "MiniMax" +--- + + + Get your API key from the [MiniMax Platform](https://platform.minimax.io) + + +## Configuration + + + + ```yaml title="config.yaml" + name: My Config + version: 0.0.1 + schema: v1 + + models: + - name: MiniMax M2.7 + provider: minimax + model: MiniMax-M2.7 + apiKey: + ``` + + + ```json title="config.json" + { + "models": [ + { + "title": "MiniMax M2.7", + "provider": "minimax", + "model": "MiniMax-M2.7", + "apiKey": "" + } + ] + } + ``` + + + +## Available Models + +| Model | Description | +| :---- | :---------- | +| `MiniMax-M2.7` | Latest flagship model with enhanced reasoning and coding. 204K context window. | +| `MiniMax-M2.7-highspeed` | High-speed version of M2.7 for low-latency scenarios. 204K context window. | +| `MiniMax-M2.5` | Peak performance with ultimate value. 204K context window. | +| `MiniMax-M2.5-highspeed` | Same performance, faster and more agile. 204K context window. | + +## Notes + +- MiniMax uses an OpenAI-compatible API at `https://api.minimax.io/v1` +- Set the `MINIMAX_API_KEY` environment variable or configure `apiKey` in your config +- For users in China, set `apiBase` to `https://api.minimaxi.com/v1/` diff --git a/docs/customize/model-providers/overview.mdx b/docs/customize/model-providers/overview.mdx index 4bbf1c0dc60..fcd99be669a 100644 --- a/docs/customize/model-providers/overview.mdx +++ b/docs/customize/model-providers/overview.mdx @@ -38,6 +38,7 @@ Beyond the top-level providers, Continue supports many other options: | [Cohere](/customize/model-providers/more/cohere) | Models specialized for semantic search and text generation | | [NVIDIA](/customize/model-providers/more/nvidia) | GPU-accelerated model hosting | | [Cloudflare](/customize/model-providers/more/cloudflare) | Edge-based AI inference services | +| [MiniMax](/customize/model-providers/more/minimax) | High-performance models with 200K+ context window | ### Local Model Options diff --git a/gui/src/pages/AddNewModel/configs/models.ts b/gui/src/pages/AddNewModel/configs/models.ts index d15db3f3d1d..594a43ff551 100644 --- a/gui/src/pages/AddNewModel/configs/models.ts +++ b/gui/src/pages/AddNewModel/configs/models.ts @@ -2688,6 +2688,54 @@ export const models: { [key: string]: ModelPackage } = { providerOptions: ["sambanova"], isOpenSource: true, }, + minimaxM27: { + title: "MiniMax M2.7", + description: + "Latest flagship model with enhanced reasoning and coding capabilities. 204K context window.", + params: { + title: "MiniMax M2.7", + model: "MiniMax-M2.7", + contextLength: 204_800, + }, + providerOptions: ["minimax"], + isOpenSource: false, + }, + minimaxM27Highspeed: { + title: "MiniMax M2.7 Highspeed", + description: + "High-speed version of M2.7 for low-latency scenarios. 204K context window.", + params: { + title: "MiniMax M2.7 Highspeed", + model: "MiniMax-M2.7-highspeed", + contextLength: 204_800, + }, + providerOptions: ["minimax"], + isOpenSource: false, + }, + minimaxM25: { + title: "MiniMax M2.5", + description: + "Peak performance with ultimate value. Excels at complex reasoning, code generation, and multi-step tasks with a 204K context window.", + params: { + title: "MiniMax M2.5", + model: "MiniMax-M2.5", + contextLength: 204_800, + }, + providerOptions: ["minimax"], + isOpenSource: false, + }, + minimaxM25Highspeed: { + title: "MiniMax M2.5 Highspeed", + description: + "Same performance as M2.5, faster and more agile for latency-sensitive tasks with a 204K context window.", + params: { + title: "MiniMax M2.5 Highspeed", + model: "MiniMax-M2.5-highspeed", + contextLength: 204_800, + }, + providerOptions: ["minimax"], + isOpenSource: false, + }, AUTODETECT: { title: "Autodetect", description: diff --git a/gui/src/pages/AddNewModel/configs/providers.ts b/gui/src/pages/AddNewModel/configs/providers.ts index 5dfb7220b14..5ba3860bfb6 100644 --- a/gui/src/pages/AddNewModel/configs/providers.ts +++ b/gui/src/pages/AddNewModel/configs/providers.ts @@ -579,6 +579,38 @@ Select the \`GPT-4o\` model below to complete your provider configuration, but n ], apiKeyUrl: "https://console.groq.com/keys", }, + minimax: { + title: "MiniMax", + provider: "minimax", + description: + "MiniMax offers high-performance models with 200K+ context windows at competitive pricing.", + longDescription: + "To get started with MiniMax, obtain an API key from the [MiniMax Platform](https://platform.minimax.io).", + tags: [ModelProviderTags.RequiresApiKey], + collectInputFor: [ + { + inputType: "text", + key: "apiKey", + label: "API Key", + placeholder: "Enter your MiniMax API key", + required: true, + }, + ], + packages: [ + models.minimaxM27, + models.minimaxM27Highspeed, + models.minimaxM25, + models.minimaxM25Highspeed, + { + ...models.AUTODETECT, + params: { + ...models.AUTODETECT.params, + title: "MiniMax", + }, + }, + ], + apiKeyUrl: "https://platform.minimax.io", + }, deepseek: { title: "DeepSeek", provider: "deepseek", diff --git a/packages/config-types/src/index.ts b/packages/config-types/src/index.ts index a22bb00bb0b..8561500e662 100644 --- a/packages/config-types/src/index.ts +++ b/packages/config-types/src/index.ts @@ -61,6 +61,7 @@ export const modelDescriptionSchema = z.object({ "nebius", "scaleway", "watsonx", + "minimax", ]), model: z.string(), apiKey: z.string().optional(), diff --git a/packages/llm-info/src/index.ts b/packages/llm-info/src/index.ts index 52ca9f211cb..066b39c0ce2 100644 --- a/packages/llm-info/src/index.ts +++ b/packages/llm-info/src/index.ts @@ -4,6 +4,7 @@ import { Bedrock } from "./providers/bedrock.js"; import { Cohere } from "./providers/cohere.js"; import { CometAPI } from "./providers/cometapi.js"; import { Gemini } from "./providers/gemini.js"; +import { MiniMax } from "./providers/minimax.js"; import { Mistral } from "./providers/mistral.js"; import { Ollama } from "./providers/ollama.js"; import { OpenAi } from "./providers/openai.js"; @@ -25,6 +26,7 @@ export const allModelProviders: ModelProvider[] = [ Bedrock, Cohere, CometAPI, + MiniMax, xAI, zAI, ]; diff --git a/packages/llm-info/src/providers/minimax.ts b/packages/llm-info/src/providers/minimax.ts new file mode 100644 index 00000000000..e55a5d8fcd7 --- /dev/null +++ b/packages/llm-info/src/providers/minimax.ts @@ -0,0 +1,48 @@ +import { ModelProvider } from "../types.js"; + +export const MiniMax: ModelProvider = { + models: [ + { + model: "MiniMax-M2.7", + displayName: "MiniMax M2.7", + contextLength: 204800, + maxCompletionTokens: 192000, + description: + "Latest flagship model with enhanced reasoning and coding capabilities.", + regex: /MiniMax-M2\.7$/i, + recommendedFor: ["chat"], + }, + { + model: "MiniMax-M2.7-highspeed", + displayName: "MiniMax M2.7 Highspeed", + contextLength: 204800, + maxCompletionTokens: 192000, + description: + "High-speed version of M2.7 for low-latency scenarios.", + regex: /MiniMax-M2\.7-highspeed/i, + recommendedFor: ["chat"], + }, + { + model: "MiniMax-M2.5", + displayName: "MiniMax M2.5", + contextLength: 204800, + maxCompletionTokens: 192000, + description: + "Peak performance with ultimate value. Excels at complex reasoning, code generation, and multi-step tasks.", + regex: /MiniMax-M2\.5$/i, + recommendedFor: ["chat"], + }, + { + model: "MiniMax-M2.5-highspeed", + displayName: "MiniMax M2.5 Highspeed", + contextLength: 204800, + maxCompletionTokens: 192000, + description: + "Same performance as M2.5, faster and more agile for latency-sensitive tasks.", + regex: /MiniMax-M2\.5-highspeed/i, + recommendedFor: ["chat"], + }, + ], + id: "minimax", + displayName: "MiniMax", +}; diff --git a/packages/openai-adapters/src/apis/MiniMax.ts b/packages/openai-adapters/src/apis/MiniMax.ts new file mode 100644 index 00000000000..e13f65dcf3d --- /dev/null +++ b/packages/openai-adapters/src/apis/MiniMax.ts @@ -0,0 +1,37 @@ +import { + ChatCompletionCreateParams, +} from "openai/resources/index"; +import { MiniMaxConfig } from "../types.js"; +import { OpenAIApi } from "./OpenAI.js"; + +export const MINIMAX_API_BASE = "https://api.minimax.io/v1/"; + +export class MiniMaxApi extends OpenAIApi { + constructor(config: MiniMaxConfig) { + super({ + ...config, + provider: "openai", + apiBase: config.apiBase ?? MINIMAX_API_BASE, + }); + } + + modifyChatBody(body: T): T { + body = super.modifyChatBody(body); + + // MiniMax requires temperature in (0.0, 1.0] — zero is rejected + if (body.temperature !== undefined && body.temperature !== null) { + if (body.temperature <= 0) { + body.temperature = 0.01; + } else if (body.temperature > 1) { + body.temperature = 1.0; + } + } + + // MiniMax does not support response_format + if ((body as any).response_format) { + delete (body as any).response_format; + } + + return body; + } +} diff --git a/packages/openai-adapters/src/index.ts b/packages/openai-adapters/src/index.ts index a00b95b81f7..760f92ef7e4 100644 --- a/packages/openai-adapters/src/index.ts +++ b/packages/openai-adapters/src/index.ts @@ -13,6 +13,7 @@ import { GeminiApi } from "./apis/Gemini.js"; import { InceptionApi } from "./apis/Inception.js"; import { JinaApi } from "./apis/Jina.js"; import { LlamastackApi } from "./apis/LlamaStack.js"; +import { MiniMaxApi } from "./apis/MiniMax.js"; import { MockApi } from "./apis/Mock.js"; import { MoonshotApi } from "./apis/Moonshot.js"; import { OpenAIApi } from "./apis/OpenAI.js"; @@ -141,6 +142,8 @@ export function constructLlmApi(config: LLMConfig): BaseLlmApi | undefined { return openAICompatible("http://localhost:8000/v1/", config); case "groq": return openAICompatible("https://api.groq.com/openai/v1/", config); + case "minimax": + return new MiniMaxApi(config); case "sambanova": return openAICompatible("https://api.sambanova.ai/v1/", config); case "text-gen-webui": diff --git a/packages/openai-adapters/src/types.ts b/packages/openai-adapters/src/types.ts index 868a6e8dfe9..443036754cf 100644 --- a/packages/openai-adapters/src/types.ts +++ b/packages/openai-adapters/src/types.ts @@ -74,6 +74,11 @@ export const DeepseekConfigSchema = OpenAIConfigSchema.extend({ }); export type DeepseekConfig = z.infer; +export const MiniMaxConfigSchema = OpenAIConfigSchema.extend({ + provider: z.literal("minimax"), +}); +export type MiniMaxConfig = z.infer; + export const BedrockConfigSchema = OpenAIConfigSchema.extend({ provider: z.literal("bedrock"), // cacheBehavior: z.object({ @@ -263,6 +268,7 @@ export const LLMConfigSchema = z.discriminatedUnion("provider", [ BedrockConfigSchema, MoonshotConfigSchema, DeepseekConfigSchema, + MiniMaxConfigSchema, CohereConfigSchema, AzureConfigSchema, GeminiConfigSchema,