diff --git a/apps/webuiapps/src/components/ChatPanel/index.tsx b/apps/webuiapps/src/components/ChatPanel/index.tsx index bd2f3ab..92442b5 100644 --- a/apps/webuiapps/src/components/ChatPanel/index.tsx +++ b/apps/webuiapps/src/components/ChatPanel/index.tsx @@ -1290,6 +1290,7 @@ const SettingsModal: React.FC<{ + diff --git a/apps/webuiapps/src/lib/__tests__/llmClient.test.ts b/apps/webuiapps/src/lib/__tests__/llmClient.test.ts index b91aade..e9dd605 100644 --- a/apps/webuiapps/src/lib/__tests__/llmClient.test.ts +++ b/apps/webuiapps/src/lib/__tests__/llmClient.test.ts @@ -135,6 +135,13 @@ describe('getDefaultProviderConfig()', () => { expect(cfg.model).toBe('kimi-k2-5'); }); + it('returns correct defaults for openrouter', () => { + const cfg = getDefaultProviderConfig('openrouter'); + expect(cfg.provider).toBe('openrouter'); + expect(cfg.baseUrl).toBe('https://openrouter.ai/api/v1'); + expect(cfg.model).toBe('minimax/MiniMax-M2.5'); + }); + it('returns consistent values for the same provider', () => { const a = getDefaultProviderConfig('openai'); const b = getDefaultProviderConfig('openai'); diff --git a/apps/webuiapps/src/lib/llmModels.ts b/apps/webuiapps/src/lib/llmModels.ts index 0b71d79..5a2cbc9 100644 --- a/apps/webuiapps/src/lib/llmModels.ts +++ b/apps/webuiapps/src/lib/llmModels.ts @@ -1,4 +1,11 @@ -export type LLMProvider = 'openai' | 'anthropic' | 'deepseek' | 'minimax' | 'z.ai' | 'kimi'; +export type LLMProvider = + | 'openai' + | 'anthropic' + | 'deepseek' + | 'minimax' + | 'z.ai' + | 'kimi' + | 'openrouter'; export type ModelCategory = 'flagship' | 'general' | 'coding' | 'lightweight' | 'thinking'; @@ -116,6 +123,23 @@ export const LLM_PROVIDER_CONFIGS: Record = { { id: 'kimi-k2-turbo', name: 'Kimi K2 Turbo', category: 'general' }, ], }, + + openrouter: { + displayName: 'OpenRouter', + baseUrl: 'https://openrouter.ai/api/v1', + defaultModel: 'minimax/MiniMax-M2.5', + models: [ + { id: 'minimax/MiniMax-M2.5', name: 'MiniMax M2.5', category: 'flagship' }, + { id: 'minimax/MiniMax-M2.5-highspeed', name: 'MiniMax M2.5 Highspeed', category: 'general' }, + { id: 'minimax/MiniMax-M2.7', name: 'MiniMax M2.7', category: 'flagship' }, + { id: 'minimax/MiniMax-M2.7-highspeed', name: 'MiniMax M2.7 Highspeed', category: 'general' }, + { id: 'minimax/MiniMax-M2.1', name: 'MiniMax M2.1', category: 'coding' }, + { id: 'anthropic/claude-sonnet-4-6', name: 'Claude Sonnet 4.6', category: 'general' }, + { id: 'openai/gpt-5.4', name: 'GPT-5.4', category: 'flagship' }, + { id: 'deepseek/deepseek-chat', name: 'DeepSeek Chat', category: 'general' }, + { id: 'google/gemini-2.5-pro', name: 'Gemini 2.5 Pro', category: 'flagship' }, + ], + }, }; export const PROVIDER_MODELS: Record = Object.fromEntries(