diff --git a/packages/browseros-agent/apps/agent/entrypoints/app/ai-settings/NewProviderDialog.tsx b/packages/browseros-agent/apps/agent/entrypoints/app/ai-settings/NewProviderDialog.tsx index c8f050cf7..430266366 100644 --- a/packages/browseros-agent/apps/agent/entrypoints/app/ai-settings/NewProviderDialog.tsx +++ b/packages/browseros-agent/apps/agent/entrypoints/app/ai-settings/NewProviderDialog.tsx @@ -64,6 +64,7 @@ import { import { getDefaultBaseUrlForProviders, getProviderTemplate, + MINIMAX_REGIONS, providerTypeOptions, } from '@/lib/llm-providers/providerTemplates' import { type TestResult, testProvider } from '@/lib/llm-providers/testProvider' @@ -87,6 +88,7 @@ const providerTypeEnum = z.enum([ 'chatgpt-pro', 'github-copilot', 'qwen-code', + 'minimax', ]) /** @@ -105,7 +107,7 @@ export const providerFormSchema = z temperature: z.number().min(0).max(2), // Azure-specific resourceName: z.string().optional(), - // Bedrock-specific + // Bedrock-specific / MiniMax region accessKeyId: z.string().optional(), secretAccessKey: z.string().optional(), region: z.string().optional(), @@ -164,6 +166,30 @@ export const providerFormSchema = z ) { // No validation needed — OAuth tokens are on the server } + // MiniMax: require baseUrl + apiKey + else if (data.type === 'minimax') { + if (!data.baseUrl) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Base URL is required', + path: ['baseUrl'], + }) + } else if (!/^https?:\/\/.+/.test(data.baseUrl)) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Must be a valid URL', + path: ['baseUrl'], + }) + } + + if (!data.apiKey?.trim()) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'API Key is required', + path: ['apiKey'], + }) + } + } // Other providers: require baseUrl else if (!data.baseUrl) { ctx.addIssue({ @@ -316,6 +342,9 @@ export const NewProviderDialog: FC = ({ if (defaultUrl) { form.setValue('baseUrl', defaultUrl) } + if (newType === 'minimax') { + form.setValue('region', 'chinese') + } form.setValue('modelId', '') } @@ -722,6 +751,94 @@ export const NewProviderDialog: FC = ({ ) } + // Minimax: region selector + if (watchedType === 'minimax') { + return ( + <> + ( + + Region * + + + Choose the endpoint closest to your location + + + + )} + /> + ( + + Base URL * + + + + + + )} + /> + ( + + API Key * + + + + + Your API key is encrypted and stored locally.{' '} + {setupGuideUrl && ( + + + {setupGuideText} + + )} + + + + )} + /> + + ) + } + // Standard providers (OpenAI, Anthropic, Google, etc.) return ( <> diff --git a/packages/browseros-agent/apps/agent/entrypoints/sidepanel/index/ChatError.tsx b/packages/browseros-agent/apps/agent/entrypoints/sidepanel/index/ChatError.tsx index 03d92929d..0aca1589e 100644 --- a/packages/browseros-agent/apps/agent/entrypoints/sidepanel/index/ChatError.tsx +++ b/packages/browseros-agent/apps/agent/entrypoints/sidepanel/index/ChatError.tsx @@ -31,6 +31,7 @@ const PROVIDER_DISPLAY_NAMES: Record = { 'chatgpt-pro': 'ChatGPT Pro', 'github-copilot': 'GitHub Copilot', 'qwen-code': 'Qwen Code', + minimax: 'MiniMax', } const UPSTREAM_RATE_LIMIT_PATTERNS: Array = [ diff --git a/packages/browseros-agent/apps/agent/lib/llm-providers/models-dev-data.json b/packages/browseros-agent/apps/agent/lib/llm-providers/models-dev-data.json index df8a5083a..35df9a169 100644 --- a/packages/browseros-agent/apps/agent/lib/llm-providers/models-dev-data.json +++ b/packages/browseros-agent/apps/agent/lib/llm-providers/models-dev-data.json @@ -5402,5 +5402,89 @@ "outputCost": 0 } ] + }, + "minimax": { + "name": "MiniMax", + "api": "https://api.minimaxi.com/v1", + "doc": "https://platform.minimax.io", + "models": [ + { + "id": "MiniMax-M2.7", + "name": "MiniMax M2.7", + "contextWindow": 204800, + "maxOutput": 8192, + "supportsImages": false, + "supportsReasoning": true, + "supportsToolCall": true, + "inputCost": 0.3, + "outputCost": 1.2 + }, + { + "id": "MiniMax-M2.7-highspeed", + "name": "MiniMax M2.7 Highspeed", + "contextWindow": 204800, + "maxOutput": 8192, + "supportsImages": false, + "supportsReasoning": true, + "supportsToolCall": true, + "inputCost": 0.6, + "outputCost": 2.4 + }, + { + "id": "MiniMax-M2.5", + "name": "MiniMax M2.5", + "contextWindow": 204800, + "maxOutput": 8192, + "supportsImages": false, + "supportsReasoning": true, + "supportsToolCall": true, + "inputCost": 0.3, + "outputCost": 1.2 + }, + { + "id": "MiniMax-M2.5-highspeed", + "name": "MiniMax M2.5 Highspeed", + "contextWindow": 204800, + "maxOutput": 8192, + "supportsImages": false, + "supportsReasoning": true, + "supportsToolCall": true, + "inputCost": 0.6, + "outputCost": 2.4 + }, + { + "id": "MiniMax-M2.1", + "name": "MiniMax M2.1", + "contextWindow": 204800, + "maxOutput": 8192, + "supportsImages": false, + "supportsReasoning": true, + "supportsToolCall": true, + "inputCost": 0.3, + "outputCost": 1.2 + }, + { + "id": "MiniMax-M2.1-highspeed", + "name": "MiniMax M2.1 Highspeed", + "contextWindow": 204800, + "maxOutput": 8192, + "supportsImages": false, + "supportsReasoning": true, + "supportsToolCall": true, + "inputCost": 0.6, + "outputCost": 2.4 + }, + { + "id": "M2-her", + "name": "M2-her", + "contextWindow": 204800, + "maxOutput": 8192, + "supportsImages": false, + "supportsReasoning": false, + "supportsToolCall": true, + "inputCost": 0.3, + "outputCost": 1.2 + } + ] } } diff --git a/packages/browseros-agent/apps/agent/lib/llm-providers/providerIcons.tsx b/packages/browseros-agent/apps/agent/lib/llm-providers/providerIcons.tsx index 8fd9f8892..8b3c8a179 100644 --- a/packages/browseros-agent/apps/agent/lib/llm-providers/providerIcons.tsx +++ b/packages/browseros-agent/apps/agent/lib/llm-providers/providerIcons.tsx @@ -5,6 +5,7 @@ import { Gemini, Kimi, LmStudio, + Minimax, Ollama, OpenAI, OpenRouter, @@ -36,6 +37,7 @@ const providerIconMap: Record = { 'chatgpt-pro': OpenAI, 'github-copilot': Github, 'qwen-code': Qwen, + minimax: Minimax, } interface ProviderIconProps { diff --git a/packages/browseros-agent/apps/agent/lib/llm-providers/providerTemplates.ts b/packages/browseros-agent/apps/agent/lib/llm-providers/providerTemplates.ts index 4d8799b45..f3712b90e 100644 --- a/packages/browseros-agent/apps/agent/lib/llm-providers/providerTemplates.ts +++ b/packages/browseros-agent/apps/agent/lib/llm-providers/providerTemplates.ts @@ -140,8 +140,31 @@ export const providerTemplates: ProviderTemplate[] = [ setupGuideUrl: 'https://docs.aws.amazon.com/bedrock/latest/userguide/getting-started.html', }), + enrichTemplate('minimax', { + defaultModelId: 'MiniMax-M2.7', + apiKeyUrl: + 'https://platform.minimax.io/user-center/basic-information/interface-key', + setupGuideUrl: 'https://platform.minimax.io/docs/guides/models-intro', + }), ] +export const MINIMAX_REGIONS = { + chinese: { + api: 'https://api.minimaxi.com/v1', + apiKeyUrl: + 'https://platform.minimaxi.com/user-center/basic-information/interface-key', + setupGuideUrl: 'https://platform.minimaxi.com/document', + }, + international: { + api: 'https://api.minimax.io/v1', + apiKeyUrl: + 'https://platform.minimax.io/user-center/basic-information/interface-key', + setupGuideUrl: 'https://platform.minimax.io/docs/guides/models-intro', + }, +} as const + +export type MinimaxRegion = keyof typeof MINIMAX_REGIONS + /** * Provider type options for select dropdowns * @public @@ -161,6 +184,7 @@ export const providerTypeOptions: { value: ProviderType; label: string }[] = [ { value: 'lmstudio', label: 'LM Studio' }, { value: 'bedrock', label: 'AWS Bedrock' }, { value: 'browseros', label: 'BrowserOS' }, + { value: 'minimax', label: 'MiniMax' }, ] /** @@ -192,6 +216,7 @@ export const DEFAULT_BASE_URLS: Record = { lmstudio: 'http://localhost:1234/v1', bedrock: '', browseros: '', + minimax: MINIMAX_REGIONS.chinese.api, } /** diff --git a/packages/browseros-agent/apps/agent/lib/llm-providers/types.ts b/packages/browseros-agent/apps/agent/lib/llm-providers/types.ts index df537f2fb..595cc5c13 100644 --- a/packages/browseros-agent/apps/agent/lib/llm-providers/types.ts +++ b/packages/browseros-agent/apps/agent/lib/llm-providers/types.ts @@ -17,6 +17,7 @@ export type ProviderType = | 'chatgpt-pro' | 'github-copilot' | 'qwen-code' + | 'minimax' /** * LLM Provider configuration diff --git a/packages/browseros-agent/apps/server/src/lib/clients/llm/provider.ts b/packages/browseros-agent/apps/server/src/lib/clients/llm/provider.ts index 106752b8d..36f05649b 100644 --- a/packages/browseros-agent/apps/server/src/lib/clients/llm/provider.ts +++ b/packages/browseros-agent/apps/server/src/lib/clients/llm/provider.ts @@ -148,6 +148,16 @@ function createMoonshotModel(config: ResolvedLLMConfig): LanguageModel { })(config.model) } +function createMinimaxModel(config: ResolvedLLMConfig): LanguageModel { + if (!config.baseUrl) throw new Error('Minimax provider requires baseUrl') + if (!config.apiKey) throw new Error('Minimax provider requires apiKey') + return createOpenAICompatible({ + name: 'minimax', + baseURL: config.baseUrl, + apiKey: config.apiKey, + })(config.model) +} + function createQwenCodeModel(config: ResolvedLLMConfig): LanguageModel { if (!config.apiKey) throw new Error('Qwen Code requires OAuth authentication') return createOpenAICompatible({ @@ -192,6 +202,7 @@ const PROVIDER_FACTORIES: Record = { [LLM_PROVIDERS.CHATGPT_PRO]: createChatGPTProModel, [LLM_PROVIDERS.GITHUB_COPILOT]: createGitHubCopilotModel, [LLM_PROVIDERS.QWEN_CODE]: createQwenCodeModel, + [LLM_PROVIDERS.MINIMAX]: createMinimaxModel, } export function createLLMProvider(config: ResolvedLLMConfig): LanguageModel { diff --git a/packages/browseros-agent/packages/shared/src/schemas/llm.ts b/packages/browseros-agent/packages/shared/src/schemas/llm.ts index 45e7cc029..b93d582d2 100644 --- a/packages/browseros-agent/packages/shared/src/schemas/llm.ts +++ b/packages/browseros-agent/packages/shared/src/schemas/llm.ts @@ -27,6 +27,7 @@ export const LLM_PROVIDERS = { CHATGPT_PRO: 'chatgpt-pro', GITHUB_COPILOT: 'github-copilot', QWEN_CODE: 'qwen-code', + MINIMAX: 'minimax', } as const /** @@ -48,6 +49,7 @@ export const LLMProviderSchema: z.ZodEnum< 'chatgpt-pro', 'github-copilot', 'qwen-code', + 'minimax', ] > = z.enum([ LLM_PROVIDERS.ANTHROPIC, @@ -64,6 +66,7 @@ export const LLMProviderSchema: z.ZodEnum< LLM_PROVIDERS.CHATGPT_PRO, LLM_PROVIDERS.GITHUB_COPILOT, LLM_PROVIDERS.QWEN_CODE, + LLM_PROVIDERS.MINIMAX, ]) export type LLMProvider = z.infer