Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions apps/desktop/src/renderer/settings/provider-display-copy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,10 @@ export const PROVIDER_DISPLAY_COPY = {
'zh-TW': { name: 'DeepInfra', description: '開源模型託管推理 · OpenAI 相容', badge: 'API' },
en: { name: 'DeepInfra', description: 'Hosted open-model inference · OpenAI-compatible', badge: 'API' },
},
atlascloud: {
zh: { name: 'Atlas Cloud', description: '开源模型托管推理 · OpenAI 兼容', badge: 'API' },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Add the two supported Chinese locale entries instead of zh

UiCatalog is exactly Record<'zh-CN' | 'zh-TW' | 'en', ...>, so this zh key leaves both supported Chinese locales missing. On this exact head, tsc -p apps/desktop/tsconfig.renderer.json --noEmit fails here with TS2353/TS2352. If type checking is bypassed, the runtime behavior is also broken: providerDisplay('atlascloud', 'zh-CN') and zh-TW both fall back to the provider id plus “provider not registered” copy, while English works. Please provide separate zh-CN and zh-TW entries and cover them through the display-copy contract.

en: { name: 'Atlas Cloud', description: 'Hosted open-model inference · OpenAI-compatible', badge: 'API' },
},
cohere: {
'zh-CN': { name: 'Cohere', description: 'Cohere 官方接入', badge: 'API' },
'zh-TW': { name: 'Cohere', description: 'Cohere 官方 API 連線', badge: 'API' },
Expand Down
24 changes: 23 additions & 1 deletion packages/core/src/__tests__/llm-connections.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,12 @@ import {
lookupModelMetadata,
modelIdAliasesForProvider,
} from '../model-metadata.js';
import { PROVIDER_REGISTRY, providerFallbackModelIds } from '../provider-registry.js';
import {
CATALOG_PROVIDER_TYPES,
PROVIDER_REGISTRY,
RECOMMENDED_PROVIDER_TYPES,
providerFallbackModelIds,
} from '../provider-registry.js';
import {
authorizeConnectionModel,
effectiveBaseUrl,
Expand Down Expand Up @@ -70,6 +75,23 @@ test('slug validation returns stable issues and preserves format and length boun
}
});

test('Atlas Cloud is wired as a ready OpenAI-compatible provider', () => {
assert.deepEqual(PROVIDER_REGISTRY.atlascloud, {
label: 'Atlas Cloud',
baseUrl: 'https://api.atlascloud.ai/v1',
authKind: 'api_key',
fallbackModels: ['qwen/qwen3.8-max'],
status: 'ready',
runtimeAdapter: { kind: 'openai-compatible', name: 'provider' },
modelDiscovery: { kind: 'protocol', path: '/v1/models' },
category: 'overseas',
catalogGroup: 'api',
signupUrl: 'https://atlascloud.ai',
catalogOrder: 29.5,
});
assert.equal(CATALOG_PROVIDER_TYPES.includes('atlascloud'), true);
});

test('connection base URLs allow HTTP(S) and reject unsafe or malformed inputs', () => {
assert.equal(validateConnectionBaseUrl(undefined), null);
assert.equal(validateConnectionBaseUrl('https://api.example.com/v1'), null);
Expand Down
14 changes: 14 additions & 0 deletions packages/core/src/model-metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,20 @@ function buildStaticModelMetadata(active: ModelsDevMetadata): ModelsDevMetadata
thinkingOptions: { efforts: ['none', 'low', 'medium', 'high'], toggle: true },
},
},
atlascloud: {
// vision is pinned false rather than left undeclared: Atlas Cloud's
// OpenAI-compatible /v1/chat/completions rejects an image_url content
// part with HTTP 400 even for its vision-branded models (verified
// 2026-09-05 against qwen/qwen3.8-max and qwen/qwen3-vl-235b-a22b-
// thinking; a text-only parts array on the same models returns 200).
// Declaring vision here would make the runtime send attachments the
// endpoint cannot accept.
'qwen/qwen3.8-max': {
displayName: 'Qwen3.8 Max',
lifecycle: 'active',
capabilities: { chat: true, reasoning: true, functionCalling: true, vision: false },
},
},
groq: {
// Groq documents reasoning_effort only for the gpt-oss family
// (low/medium/high) and qwen3.6-27b (none/default); see
Expand Down
13 changes: 13 additions & 0 deletions packages/core/src/provider-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1352,6 +1352,19 @@ const providerRegistry = {
signupUrl: 'https://deepinfra.com/dash/api_keys',
catalogOrder: 29,
},
atlascloud: {
label: 'Atlas Cloud',
baseUrl: 'https://api.atlascloud.ai/v1',
authKind: 'api_key',
fallbackModels: ['qwen/qwen3.8-max'],
status: 'ready',
runtimeAdapter: { kind: 'openai-compatible', name: 'provider' },
modelDiscovery: { kind: 'protocol', path: '/v1/models' },
category: 'overseas',
catalogGroup: 'api',
signupUrl: 'https://atlascloud.ai',
catalogOrder: 29.5,
},
groq: {
label: groq.name,
baseUrl: 'https://api.groq.com/openai/v1',
Expand Down