From 3ee5fa64dbd01037446faf280cd9d6c4d3b97f36 Mon Sep 17 00:00:00 2001 From: octo-patch Date: Sun, 15 Mar 2026 04:05:51 +0800 Subject: [PATCH] Add MiniMax as an LLM provider MiniMax offers OpenAI-compatible API endpoints with models like MiniMax-M2.5 and MiniMax-M2.5-highspeed (204K context window). This adds MiniMax alongside the existing providers by reusing the OpenAI-compatible adapter with the MiniMax base URL. Changes: - Add 'minimax' to the LLMProvider union type and default configs - Add MiniMax case to the provider adapter factory - Include MiniMax in the settings UI provider lists with base URL input - Update README with MiniMax in the provider table --- README.md | 5 +++-- src/main/ipc/llmHandlers.ts | 2 ++ src/renderer/src/components/modals/SettingsModal.tsx | 10 ++++++---- src/renderer/src/components/tabs/SettingsTab.tsx | 10 ++++++---- src/renderer/src/types/llm.types.ts | 4 ++++ 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index caed85d..73df5ec 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ View the code for the node. ### LLM providers -OpenAI, Anthropic (Claude), Google Gemini, Groq, xAI (Grok), OpenRouter, Ollama (local) +OpenAI, Anthropic (Claude), Google Gemini, Groq, xAI (Grok), MiniMax, OpenRouter, Ollama (local) - API keys encrypted and stored locally via Electron `safeStorage` — never sent anywhere except the provider's own API - Test connection button per provider @@ -252,6 +252,7 @@ API keys are encrypted and stored locally using Electron's `safeStorage`. They a | Google Gemini | [aistudio.google.com/app/apikey](https://aistudio.google.com/app/apikey) | | Groq | [console.groq.com/keys](https://console.groq.com/keys) | | xAI (Grok) | [console.x.ai](https://console.x.ai) | +| MiniMax | [platform.minimaxi.com](https://platform.minimaxi.com) | | OpenRouter | [openrouter.ai/keys](https://openrouter.ai/keys) | | Ollama (local) | No key needed — install [Ollama](https://ollama.com) and pull a model | @@ -274,7 +275,7 @@ ComfyNodeDesigner/ │ │ ├── index.ts # Window creation and IPC registration │ │ ├── ipc/ │ │ │ ├── fileHandlers.ts # Save/load/export/import — uses Electron dialogs + fs -│ │ │ └── llmHandlers.ts # All 7 LLM provider adapters with abort support +│ │ │ └── llmHandlers.ts # All 8 LLM provider adapters with abort support │ │ └── generators/ │ │ ├── codeGenerator.ts # Python code generation logic │ │ └── nodeImporter.ts # Python node pack parser (folder + file import) diff --git a/src/main/ipc/llmHandlers.ts b/src/main/ipc/llmHandlers.ts index 25dc7b7..66c39dd 100644 --- a/src/main/ipc/llmHandlers.ts +++ b/src/main/ipc/llmHandlers.ts @@ -238,6 +238,8 @@ function getAdapter(req: LLMGenerateRequest, apiKey: string): LLMAdapter { return getGroqAdapter(apiKey) case 'xai': return getOpenAICompatibleAdapter(apiKey, req.baseUrl ?? 'https://api.x.ai/v1') + case 'minimax': + return getOpenAICompatibleAdapter(apiKey, req.baseUrl ?? 'https://api.minimax.io/v1') case 'openrouter': return getOpenAICompatibleAdapter(apiKey, req.baseUrl ?? 'https://openrouter.ai/api/v1') case 'ollama': diff --git a/src/renderer/src/components/modals/SettingsModal.tsx b/src/renderer/src/components/modals/SettingsModal.tsx index 9395bc7..1c09fe8 100644 --- a/src/renderer/src/components/modals/SettingsModal.tsx +++ b/src/renderer/src/components/modals/SettingsModal.tsx @@ -20,7 +20,7 @@ interface SettingsModalProps { onClose: () => void } -const PROVIDERS: LLMProvider[] = ['openai', 'anthropic', 'google', 'groq', 'xai', 'openrouter', 'ollama'] +const PROVIDERS: LLMProvider[] = ['openai', 'anthropic', 'google', 'groq', 'xai', 'minimax', 'openrouter', 'ollama'] export function SettingsModal({ open, onClose }: SettingsModalProps): JSX.Element { const { llm, setProviderModel, setProviderBaseUrl, ollamaModels, fetchOllamaModels } = useSettingsStore() @@ -152,8 +152,8 @@ export function SettingsModal({ open, onClose }: SettingsModalProps): JSX.Elemen )} - {/* Base URL (Ollama / OpenRouter / xAI) */} - {(provider === 'ollama' || provider === 'openrouter' || provider === 'xai') && ( + {/* Base URL (Ollama / OpenRouter / xAI / MiniMax) */} + {(provider === 'ollama' || provider === 'openrouter' || provider === 'xai' || provider === 'minimax') && (
@@ -165,7 +165,9 @@ export function SettingsModal({ open, onClose }: SettingsModalProps): JSX.Elemen ? 'http://localhost:11434' : provider === 'openrouter' ? 'https://openrouter.ai/api/v1' - : 'https://api.x.ai/v1' + : provider === 'minimax' + ? 'https://api.minimax.io/v1' + : 'https://api.x.ai/v1' } className="font-mono text-sm" /> diff --git a/src/renderer/src/components/tabs/SettingsTab.tsx b/src/renderer/src/components/tabs/SettingsTab.tsx index 64f4174..8569c36 100644 --- a/src/renderer/src/components/tabs/SettingsTab.tsx +++ b/src/renderer/src/components/tabs/SettingsTab.tsx @@ -14,7 +14,7 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '. import { CheckCircle2, XCircle, Loader2, Eye, EyeOff, RefreshCw, X, Plus, ChevronDown, ChevronRight, Star } from 'lucide-react' import { cn } from '../../lib/utils' -const PROVIDERS: LLMProvider[] = ['openai', 'anthropic', 'google', 'groq', 'xai', 'openrouter', 'ollama'] +const PROVIDERS: LLMProvider[] = ['openai', 'anthropic', 'google', 'groq', 'xai', 'minimax', 'openrouter', 'ollama'] type SettingsSubTab = 'general' | 'color' | 'ai' | 'prompts' @@ -409,8 +409,8 @@ function AIAssistantSubTab(): JSX.Element {
)} - {/* Base URL (Ollama / OpenRouter / xAI) */} - {(provider === 'ollama' || provider === 'openrouter' || provider === 'xai') && ( + {/* Base URL (Ollama / OpenRouter / xAI / MiniMax) */} + {(provider === 'ollama' || provider === 'openrouter' || provider === 'xai' || provider === 'minimax') && (
@@ -422,7 +422,9 @@ function AIAssistantSubTab(): JSX.Element { ? 'http://localhost:11434' : provider === 'openrouter' ? 'https://openrouter.ai/api/v1' - : 'https://api.x.ai/v1' + : provider === 'minimax' + ? 'https://api.minimax.io/v1' + : 'https://api.x.ai/v1' } className="font-mono text-sm" /> diff --git a/src/renderer/src/types/llm.types.ts b/src/renderer/src/types/llm.types.ts index af35667..aa85cca 100644 --- a/src/renderer/src/types/llm.types.ts +++ b/src/renderer/src/types/llm.types.ts @@ -4,6 +4,7 @@ export type LLMProvider = | 'google' | 'groq' | 'xai' + | 'minimax' | 'openrouter' | 'ollama' @@ -68,6 +69,7 @@ export const DEFAULT_MODELS: Record = { 'meta-llama/llama-4-scout-17b-16e-instruct' ], xai: ['grok-3', 'grok-3-mini', 'grok-2'], + minimax: ['MiniMax-M2.5', 'MiniMax-M2.5-highspeed'], openrouter: ['openai/gpt-5.4', 'anthropic/claude-sonnet-4-6', 'google/gemini-3.1-pro', 'meta-llama/llama-3.3-70b-instruct'], ollama: [] // Populated dynamically from local Ollama instance } @@ -78,6 +80,7 @@ export const PROVIDER_LABELS: Record = { google: 'Google (Gemini)', groq: 'Groq', xai: 'xAI (Grok)', + minimax: 'MiniMax', openrouter: 'OpenRouter', ollama: 'Ollama (Local)' } @@ -90,6 +93,7 @@ export const DEFAULT_LLM_SETTINGS: LLMSettings = { google: { provider: 'google', model: 'gemini-3.1-pro' }, groq: { provider: 'groq', model: 'openai/gpt-oss-120b' }, xai: { provider: 'xai', model: 'grok-3', baseUrl: 'https://api.x.ai/v1' }, + minimax: { provider: 'minimax', model: 'MiniMax-M2.5', baseUrl: 'https://api.minimax.io/v1' }, openrouter: { provider: 'openrouter', model: 'openai/gpt-5.4',