From 571167f9dddcd373cfae22a8304c34e587f28a54 Mon Sep 17 00:00:00 2001 From: Alex-wuhu Date: Tue, 24 Mar 2026 19:48:34 +0800 Subject: [PATCH 1/3] feat: add Novita AI as LLM provider Add Novita AI as a new LLM provider with OpenAI-compatible API support. Users can now select Novita from all entry points (CLI, config, UI). - Add 'novita' to ProviderName type - Add Novita AI entry to PROVIDER_INFO with default base URL - Add Novita suggested models (kimi-k2.5, glm-5, minimax-m2.5) - Add 'novita' to ALLOWED_CLIENT_PROVIDERS - Add NOVITA_API_KEY environment variable mapping - Add novita case to getAIModel() switch using OpenAI-compatible API - Add novita to SINGLE_SYSTEM_PROVIDERS for proper message handling --- lib/ai-providers.ts | 11 ++++++++--- lib/types/model-config.ts | 12 ++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/ai-providers.ts b/lib/ai-providers.ts index 6ab2af3..b355a54 100644 --- a/lib/ai-providers.ts +++ b/lib/ai-providers.ts @@ -28,6 +28,7 @@ export const SINGLE_SYSTEM_PROVIDERS = new Set([ "qwen", "kimi", "qiniu", + "novita", ]) /** @@ -98,6 +99,7 @@ const ALLOWED_CLIENT_PROVIDERS: ProviderName[] = [ "qiniu", "kimi", "minimax", + "novita", ] // Bedrock provider options for Anthropic beta features @@ -520,7 +522,8 @@ function buildProviderOptions( case "glm": case "qwen": case "kimi": - case "qiniu": { + case "qiniu": + case "novita": { // These providers don't have reasoning configs in AI SDK yet // Gateway passes through to underlying providers which handle their own configs break @@ -555,6 +558,7 @@ const PROVIDER_ENV_VARS: Record = { qiniu: "QINIU_API_KEY", kimi: "KIMI_API_KEY", minimax: "MINIMAX_API_KEY", + novita: "NOVITA_API_KEY", } /** @@ -1258,7 +1262,8 @@ export function getAIModel(overrides?: ClientOverrides): ModelConfig { case "glm": case "qwen": case "qiniu": - case "kimi": { + case "kimi": + case "novita": { const envVar = PROVIDER_ENV_VARS[provider] if (!envVar) { throw new Error( @@ -1285,7 +1290,7 @@ export function getAIModel(overrides?: ClientOverrides): ModelConfig { default: throw new Error( - `Unknown AI provider: ${provider}. Supported providers: bedrock, openai, anthropic, google, azure, ollama, openrouter, deepseek, siliconflow, sglang, gateway, edgeone, doubao, modelscope, glm, qwen, qiniu, kimi, minimax`, + `Unknown AI provider: ${provider}. Supported providers: bedrock, openai, anthropic, google, azure, ollama, openrouter, deepseek, siliconflow, sglang, gateway, edgeone, doubao, modelscope, glm, qwen, qiniu, kimi, minimax, novita`, ) } diff --git a/lib/types/model-config.ts b/lib/types/model-config.ts index 9a5d433..c89ca10 100644 --- a/lib/types/model-config.ts +++ b/lib/types/model-config.ts @@ -21,6 +21,7 @@ export type ProviderName = | "qiniu" | "kimi" | "minimax" + | "novita" // Individual model configuration export interface ModelConfig { @@ -101,6 +102,7 @@ export const PROVIDER_LOGO_MAP: Record = { doubao: "bytedance", modelscope: "modelscope", minimax: "minimax", + novita: "novita", } // Provider metadata @@ -179,6 +181,10 @@ export const PROVIDER_INFO: Record< label: "MiniMax", defaultBaseUrl: "https://api.minimaxi.com/anthropic", }, + novita: { + label: "Novita AI", + defaultBaseUrl: "https://api.novita.ai/openai", + }, } // Suggested models per provider for quick add @@ -350,6 +356,12 @@ export const SUGGESTED_MODELS: Partial> = { "MiniMax-M2.5", "MiniMax-M2.5-highspeed", ], + novita: [ + // Novita AI models (OpenAI-compatible API) + "moonshotai/kimi-k2.5", + "zai-org/glm-5", + "minimax/minimax-m2.5", + ], } // Helper to generate UUID From a5871ded9b3982dd92c5184f724cf2cd2fe8021e Mon Sep 17 00:00:00 2001 From: Alex-wuhu Date: Wed, 25 Mar 2026 15:03:51 +0800 Subject: [PATCH 2/3] docs: add Novita AI config to env.example Add NOVITA_API_KEY and NOVITA_BASE_URL to env.example so users can discover the configuration variables. Also add novita to the AI_PROVIDER options list. --- env.example | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/env.example b/env.example index 243860a..a9bc5ff 100644 --- a/env.example +++ b/env.example @@ -1,6 +1,6 @@ # AI Provider Configuration # AI_PROVIDER: Which provider to use -# Options: bedrock, openai, anthropic, google, vertexai, azure, ollama, openrouter, deepseek, siliconflow, gateway +# Options: bedrock, openai, anthropic, google, vertexai, azure, ollama, openrouter, deepseek, siliconflow, gateway, novita # Default: bedrock AI_PROVIDER=bedrock @@ -167,3 +167,8 @@ AI_MODEL=global.anthropic.claude-sonnet-4-5-20250929-v1:0 # Get your API key from: https://www.qiniu.com/ai/models # QINIU_API_KEY=your_qiniu_api_key # QINIU_BASE_URL=https://api.qnaigc.com/v1 # Optional, default + +# Novita AI Configuration (Optional) +# Get your API key from: https://novita.ai/dashboard/key +# NOVITA_API_KEY=your_novita_api_key +# NOVITA_BASE_URL=https://api.novita.ai/openai # Optional, default From 3ca46f44c1b6de82ca286c53ec10b2f6491af152 Mon Sep 17 00:00:00 2001 From: Alex-wuhu Date: Sun, 29 Mar 2026 01:05:40 +0800 Subject: [PATCH 3/3] fix: add novita case to validate-model route Adds the missing 'novita' case to the OpenAI-compatible provider block in the validate-model API route, fixing 400 errors when users test their Novita API key in the UI. Co-Authored-By: Claude Opus 4.6 --- app/api/validate-model/route.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/api/validate-model/route.ts b/app/api/validate-model/route.ts index 884fb44..d996467 100644 --- a/app/api/validate-model/route.ts +++ b/app/api/validate-model/route.ts @@ -345,11 +345,12 @@ export async function POST(req: Request) { break } - // GLM, Qwen, Kimi, Qiniu - OpenAI compatible + // GLM, Qwen, Kimi, Qiniu, Novita - OpenAI compatible case "glm": case "qwen": case "kimi": - case "qiniu": { + case "qiniu": + case "novita": { const baseURL = baseUrl || PROVIDER_INFO[provider as ProviderName]?.defaultBaseUrl ||