diff --git a/src/lib/provider-catalog.ts b/src/lib/provider-catalog.ts index 06f208f5d2..cc71f3b415 100644 --- a/src/lib/provider-catalog.ts +++ b/src/lib/provider-catalog.ts @@ -96,6 +96,38 @@ export const PROVIDER_CATALOG: Array = [ 2, ), }, + { + id: 'atlascloud', + name: 'Atlas Cloud', + description: 'OpenAI-compatible model access through the Atlas Cloud API.', + authTypes: ['api-key'], + docsUrl: 'https://www.atlascloud.ai/docs', + configExample: JSON.stringify( + { + auth: { + profiles: { + 'atlascloud:default': { + provider: 'atlascloud', + apiKey: 'ATLASCLOUD_API_KEY', + }, + }, + }, + custom_providers: [ + { + name: 'atlascloud', + base_url: 'https://api.atlascloud.ai/v1', + api_mode: 'openai', + }, + ], + model: { + provider: 'atlascloud', + default: 'qwen/qwen3.5-flash', + }, + }, + null, + 2, + ), + }, { id: 'minimax', name: 'MiniMax', diff --git a/src/server/hermes-config-migration.test.ts b/src/server/hermes-config-migration.test.ts index 0caaae1538..8ca389143a 100644 --- a/src/server/hermes-config-migration.test.ts +++ b/src/server/hermes-config-migration.test.ts @@ -71,4 +71,35 @@ describe('normalizeHermesConfigState', () => { source: 'nested', }) }) + + it('recognizes Atlas Cloud API key config and default model', () => { + const state = normalizeHermesConfigState({ + paths, + config: { + model: { provider: 'atlascloud', default: 'qwen/qwen3.5-flash' }, + custom_providers: [ + { + name: 'atlascloud', + base_url: 'https://api.atlascloud.ai/v1', + api_mode: 'openai', + }, + ], + }, + env: { ATLASCLOUD_API_KEY: 'atlas-test-key-123456' }, + authProfiles: {}, + localProviders: [], + localModels: [], + }) + + expect(state.activeProvider).toBe('atlascloud') + expect(state.activeModel).toBe('qwen/qwen3.5-flash') + const atlascloud = state.providers.find((p) => p.id === 'atlascloud') + expect(atlascloud?.configured).toBe(true) + expect(atlascloud?.authenticated).toBe(true) + expect(atlascloud?.isDefault).toBe(true) + expect(atlascloud?.authSource).toBe('env') + expect(atlascloud?.envKeys).toContain('ATLASCLOUD_API_KEY') + expect(atlascloud?.models.map((model) => model.id)).toContain('qwen/qwen3.5-flash') + expect(atlascloud?.models.map((model) => model.id)).toContain('deepseek-ai/deepseek-v4-pro') + }) }) diff --git a/src/server/hermes-config-migration.ts b/src/server/hermes-config-migration.ts index fd9a196773..135212bab8 100644 --- a/src/server/hermes-config-migration.ts +++ b/src/server/hermes-config-migration.ts @@ -88,6 +88,16 @@ export const HERMES_PROVIDER_CATALOG: Array = [ { id: 'openai-codex', name: 'OpenAI Codex', kind: 'oauth', envKeys: [], models: [] }, { id: 'anthropic', name: 'Anthropic', kind: 'api_key', envKeys: ['ANTHROPIC_API_KEY'], models: [] }, { id: 'openrouter', name: 'OpenRouter', kind: 'api_key', envKeys: ['OPENROUTER_API_KEY'], models: [] }, + { + id: 'atlascloud', + name: 'Atlas Cloud', + kind: 'api_key', + envKeys: ['ATLASCLOUD_API_KEY'], + models: [ + { id: 'qwen/qwen3.5-flash', name: 'Qwen3.5 Flash' }, + { id: 'deepseek-ai/deepseek-v4-pro', name: 'DeepSeek V4 Pro' }, + ], + }, { id: 'zai', name: 'Z.AI / GLM', kind: 'api_key', envKeys: ['GLM_API_KEY'], models: [] }, { id: 'kimi-coding', name: 'Kimi', kind: 'api_key', envKeys: ['KIMI_API_KEY'], models: [] }, { id: 'minimax', name: 'MiniMax', kind: 'api_key', envKeys: ['MINIMAX_API_KEY'], models: [] },