diff --git a/.github/workflows/desktop-package-smoke.yml b/.github/workflows/desktop-package-smoke.yml index 2c2b8ca46..6493529bd 100644 --- a/.github/workflows/desktop-package-smoke.yml +++ b/.github/workflows/desktop-package-smoke.yml @@ -132,7 +132,7 @@ jobs: - name: Build optional Broker Packs on Windows run: pnpm broker-packs:build - timeout-minutes: 10 + timeout-minutes: 20 - name: Verify Broker Packs in compiled runtime run: pnpm exec tsx scripts/verify-broker-packs.ts --compiled diff --git a/package.json b/package.json index 0a0d99e5c..dcda02eb3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-alice", - "version": "0.92.1", + "version": "0.93.0", "description": "File-based trading agent engine", "type": "module", "imports": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 554d86881..bd1a1b5f1 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@traderalice/openalice-cli", - "version": "0.92.1", + "version": "0.93.0", "description": "OpenAlice local runtime and remote connection CLI", "type": "module", "bin": { diff --git a/src/ai-providers/model-semantics.ts b/src/ai-providers/model-semantics.ts index 1077eaf1d..47c4f5bac 100644 --- a/src/ai-providers/model-semantics.ts +++ b/src/ai-providers/model-semantics.ts @@ -320,6 +320,18 @@ export const MODEL_SEMANTICS_BY_VENDOR: Registry = { }, }, }, + 'atlas-cloud': { + 'deepseek-ai/deepseek-v4-pro': { + contextWindow: 1_000_000, + maxOutputTokens: 384_000, + reasoning: { + mode: 'optional', + efforts: ['high', 'max'], + defaultEffort: 'high', + interleaved: true, + }, + }, + }, longcat: { 'LongCat-2.0': { maxOutputTokens: 131_072, diff --git a/src/ai-providers/preset-catalog.spec.ts b/src/ai-providers/preset-catalog.spec.ts index 8c146b23c..6a8b64f3f 100644 --- a/src/ai-providers/preset-catalog.spec.ts +++ b/src/ai-providers/preset-catalog.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from 'vitest'; import { + ATLAS_CLOUD, CLAUDE_API, CLAUDE_OAUTH, CODEX_API, @@ -63,6 +64,21 @@ describe('LONGCAT preset', () => { }); }); +describe('ATLAS_CLOUD preset', () => { + it('uses the versioned OpenAI-compatible endpoint and nested model id', () => { + expect(ATLAS_CLOUD.regions?.[0]?.wires['openai-chat']).toBe('https://api.atlascloud.ai/v1'); + const parsed = ATLAS_CLOUD.zodSchema.parse({ + backend: 'vercel-ai-sdk', + provider: 'openai-compatible', + apiKey: 'test-key', + }) as { baseUrl?: string; model?: string }; + expect(parsed).toMatchObject({ + baseUrl: 'https://api.atlascloud.ai/v1', + model: 'deepseek-ai/deepseek-v4-pro', + }); + }); +}); + describe('credential form catalog', () => { it('uses native Claude Code aliases for subscription profiles', () => { expect(CLAUDE_OAUTH.models?.map((model) => model.id)).toEqual([ @@ -200,6 +216,7 @@ describe('credential form catalog', () => { deepseek: 'deepseek-v4-pro', longcat: 'LongCat-2.0', openrouter: 'openai/gpt-5.6-luna', + 'atlas-cloud': 'deepseek-ai/deepseek-v4-pro', // Runtime-direct provider: `auto` is Cursor routing, not a model API id. cursor: 'auto', }); @@ -254,6 +271,7 @@ describe('credential form catalog', () => { deepseek: 'deepseek', longcat: 'longcat', openrouter: 'openrouter', + 'atlas-cloud': 'atlas-cloud', }; for (const [presetId, vendor] of Object.entries(vendorByPreset)) { diff --git a/src/ai-providers/preset-catalog.ts b/src/ai-providers/preset-catalog.ts index 1d925e4d9..7989b5c08 100644 --- a/src/ai-providers/preset-catalog.ts +++ b/src/ai-providers/preset-catalog.ts @@ -544,6 +544,38 @@ export const LONGCAT: PresetDef = { writeOnlyFields: ['apiKey'], } +// ==================== Third-party: Atlas Cloud ==================== + +export const ATLAS_CLOUD: PresetDef = { + id: 'atlas-cloud', + label: 'Atlas Cloud', + description: 'Atlas Cloud models via its OpenAI-compatible API', + category: 'third-party', + defaultName: 'Atlas Cloud', + hint: 'Uses Atlas Cloud\'s OpenAI-compatible Chat Completions endpoint. This credential can drive OpenCode and Pi.', + zodSchema: z.object({ + backend: z.literal('vercel-ai-sdk'), + provider: z.literal('openai-compatible'), + baseUrl: z.string().default('https://api.atlascloud.ai/v1').describe('API endpoint'), + model: z.string().default('deepseek-ai/deepseek-v4-pro').describe('Model'), + apiKey: z.string().min(1).describe('Atlas Cloud API key'), + }), + regions: [{ + id: 'default', + label: 'Atlas Cloud (api.atlascloud.ai)', + wires: { 'openai-chat': 'https://api.atlascloud.ai/v1' }, + }], + models: withModelSemantics('atlas-cloud', [ + { id: 'deepseek-ai/deepseek-v4-pro', label: 'DeepSeek V4 Pro' }, + ]), + setup: { + apiKeyLabel: 'Atlas Cloud API key', + apiKeyHelp: 'Use an API key from the Atlas Cloud console.', + modelHelp: 'Choose a model available to the key, or paste another exact Atlas Cloud model ID.', + }, + writeOnlyFields: ['apiKey'], +} + // ==================== Runtime-direct: Cursor ==================== export const CURSOR_DASHBOARD: PresetDef = { @@ -615,6 +647,7 @@ export const PRESET_CATALOG: PresetDef[] = [ KIMI, DEEPSEEK, LONGCAT, + ATLAS_CLOUD, GEMINI, CURSOR_DASHBOARD, CUSTOM, @@ -640,5 +673,6 @@ export const DEFAULT_MODEL_BY_VENDOR: Record = { deepseek: 'deepseek-v4-pro', longcat: 'LongCat-2.0', openrouter: 'openai/gpt-5.6-luna', + 'atlas-cloud': 'deepseek-ai/deepseek-v4-pro', cursor: 'auto', }