diff --git a/.dev.vars.example b/.dev.vars.example index ddf421e2f..c9bf6eef6 100644 --- a/.dev.vars.example +++ b/.dev.vars.example @@ -15,9 +15,10 @@ #ANTHROPIC_API_KEY="" #OPENAI_API_KEY="" GOOGLE_AI_STUDIO_API_KEY="" -#OPENROUTER_API_KEY="default" -#GROQ_API_KEY="default" - +#OPENROUTER_API_KEY="default" +#GROQ_API_KEY="default" +#MINIMAX_API_KEY="default" + # Stuff for Oauths: #GOOGLE_CLIENT_SECRET="" #GOOGLE_CLIENT_ID="" diff --git a/README.md b/README.md index 53066a784..8923ea4a4 100644 --- a/README.md +++ b/README.md @@ -112,6 +112,7 @@ Once you click "Deploy to Cloudflare", you'll be taken to your Cloudflare dashbo ### 🔑 What you'll configure - `GOOGLE_AI_STUDIO_API_KEY` - Your Google Gemini API key for Gemini models +- `MINIMAX_API_KEY` - Your MiniMax API key for MiniMax models (M3 default, M2.7 optional) - `JWT_SECRET` - Secure random string for session management - `WEBHOOK_SECRET` - Webhook authentication secret - `SECRETS_ENCRYPTION_KEY` - Encryption key for secrets @@ -431,6 +432,7 @@ bun run deploy # Builds and deploys automatically (includes remote DB migration wrangler secret put ANTHROPIC_API_KEY wrangler secret put OPENAI_API_KEY wrangler secret put GOOGLE_AI_STUDIO_API_KEY + wrangler secret put MINIMAX_API_KEY # ... etc ``` @@ -477,7 +479,7 @@ Cloudflare VibeSDK implements enterprise-grade security: - Check that your account has D1 access enabled **🔐 "Missing Required Variables"** -- **Worker Secrets**: Verify all required secrets are set: `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GOOGLE_AI_STUDIO_API_KEY`, `JWT_SECRET` +- **Worker Secrets**: Verify all required secrets are set: `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GOOGLE_AI_STUDIO_API_KEY`, `MINIMAX_API_KEY`, `JWT_SECRET` - **AI Gateway Token**: `CLOUDFLARE_AI_GATEWAY_TOKEN` should be set as BOTH build variable and worker secret - **Environment Variables**: These are automatically loaded from wrangler.jsonc - no manual setup needed - **Authentication**: API tokens and account IDs are automatically provided by Workers Builds diff --git a/docs/llm.md b/docs/llm.md index fe75cdcde..35648dd50 100644 --- a/docs/llm.md +++ b/docs/llm.md @@ -73,7 +73,7 @@ **Prerequisites:** - Node.js 18+ - Cloudflare account (for D1, Durable Objects) -- API keys: OpenAI, Anthropic, Google AI Studio +- API keys: OpenAI, Anthropic, Google AI Studio, MiniMax **Environment Variables:** Create `.dev.vars` in project root: @@ -82,6 +82,7 @@ Create `.dev.vars` in project root: OPENAI_API_KEY=sk-... ANTHROPIC_API_KEY=sk-ant-... GOOGLE_AI_STUDIO_API_KEY=... +MINIMAX_API_KEY=ey... # Authentication JWT_SECRET=your-secret-key diff --git a/worker-configuration.d.ts b/worker-configuration.d.ts index 29a8b17cd..35b317def 100644 --- a/worker-configuration.d.ts +++ b/worker-configuration.d.ts @@ -19,6 +19,7 @@ declare namespace Cloudflare { OPENROUTER_API_KEY: string; CEREBRAS_API_KEY: string; GROQ_API_KEY: string; + MINIMAX_API_KEY: string; GOOGLE_VERTEX_AI_API_KEY: string; PLATFORM_MODEL_PROVIDERS: string; SANDBOX_SERVICE_API_KEY: string; @@ -69,5 +70,5 @@ type StringifyValues> = { [Binding in keyof EnvType]: EnvType[Binding] extends string ? EnvType[Binding] : string; }; declare namespace NodeJS { - interface ProcessEnv extends StringifyValues> {} + interface ProcessEnv extends StringifyValues> {} } diff --git a/worker/agents/inferutils/config.types.ts b/worker/agents/inferutils/config.types.ts index 35def168a..a78f295a8 100644 --- a/worker/agents/inferutils/config.types.ts +++ b/worker/agents/inferutils/config.types.ts @@ -337,7 +337,44 @@ const MODELS_MASTER = { creditCost: 8, // $0.22 contextSize: 262144, // 256K Context }, - } + }, + + // --- MiniMax Models --- + // https://platform.minimax.io/docs/api-reference/text-openai-api + // MiniMax-M3 is the latest flagship model (default), M2.7 retained for compatibility. + MINIMAX_M3: { + id: 'minimax/MiniMax-M3', + config: { + name: 'MiniMax M3', + size: ModelSize.LARGE, + provider: 'minimax', + creditCost: 2.4, // $0.60 input + contextSize: 524288, // 512K Context + directOverride: true, + } + }, + MINIMAX_M2_7: { + id: 'minimax/MiniMax-M2.7', + config: { + name: 'MiniMax M2.7', + size: ModelSize.REGULAR, + provider: 'minimax', + creditCost: 1.2, // $0.30 input + contextSize: 204800, // 200K Context + directOverride: true, + } + }, + MINIMAX_M2_7_HIGHSPEED: { + id: 'minimax/MiniMax-M2.7-highspeed', + config: { + name: 'MiniMax M2.7 High Speed', + size: ModelSize.LITE, + provider: 'minimax', + creditCost: 2.4, // $0.60 input + contextSize: 204800, // 200K Context + directOverride: true, + } + }, } as const; /** diff --git a/worker/agents/inferutils/core.ts b/worker/agents/inferutils/core.ts index 9dffaf472..a9d6ce219 100644 --- a/worker/agents/inferutils/core.ts +++ b/worker/agents/inferutils/core.ts @@ -303,6 +303,11 @@ export async function getConfigurationForModel( baseURL: 'https://api.anthropic.com/v1/', apiKey: env.ANTHROPIC_API_KEY, }; + case 'minimax': + return { + baseURL: 'https://api.minimax.io/v1', + apiKey: await getApiKey('minimax', env, userId, runtimeOverrides), + }; default: providerForcedOverride = modelConfig.provider as AIGatewayProviders; break; diff --git a/worker/api/controllers/modelConfig/byokHelper.ts b/worker/api/controllers/modelConfig/byokHelper.ts index 3c179b3af..0de8624aa 100644 --- a/worker/api/controllers/modelConfig/byokHelper.ts +++ b/worker/api/controllers/modelConfig/byokHelper.ts @@ -53,6 +53,7 @@ export function getPlatformEnabledProviders(env: Env): string[] { 'google-ai-studio', 'cerebras', 'groq', + 'minimax', ]; for (const provider of providerList) { diff --git a/worker/types/secretsTemplates.ts b/worker/types/secretsTemplates.ts index 96c736595..c7bd1a1dc 100644 --- a/worker/types/secretsTemplates.ts +++ b/worker/types/secretsTemplates.ts @@ -160,6 +160,20 @@ export function getTemplatesData(): SecretTemplate[] { required: false, category: 'byok', }, + { + id: 'MINIMAX_API_KEY_BYOK', + displayName: 'MiniMax (BYOK)', + envVarName: 'MINIMAX_API_KEY_BYOK', + provider: 'minimax', + icon: 'M', + description: + 'Use your MiniMax API key for MiniMax models', + instructions: 'Go to MiniMax Platform → API Keys → Create new key', + placeholder: 'Your MiniMax API key', + validation: '^.{10,}$', + required: false, + category: 'byok', + }, // Development Tools {