From 1f9ed9f360099c2e46484834d61857087afc3988 Mon Sep 17 00:00:00 2001 From: binyangzhu000-sudo <224954946+binyangzhu000-sudo@users.noreply.github.com> Date: Mon, 20 Jul 2026 19:21:36 +0800 Subject: [PATCH] Add Atlas Cloud model provider preset --- src/main/config.ts | 20 ++++++++++--------- src/main/database/config-types.ts | 2 +- src/main/database/model-config.ts | 12 ++++++----- src/main/tools/api-tool.schemas.ts | 3 +++ src/main/tools/handlers/config-handlers.ts | 4 ++-- .../components/settings/ModelConfig.tsx | 20 ++++++++++++++++--- src/shared/config/default-configs.ts | 7 +++++++ src/types/ipc.ts | 2 +- 8 files changed, 49 insertions(+), 21 deletions(-) diff --git a/src/main/config.ts b/src/main/config.ts index 530304d..7f2462f 100644 --- a/src/main/config.ts +++ b/src/main/config.ts @@ -57,13 +57,14 @@ export function getConfig(): DeepBotConfig { } // 从环境变量读取配置 - const apiKey = process.env.AI_API_KEY || ''; - const baseUrl = process.env.AI_BASE_URL || ''; - const modelId = process.env.AI_MODEL_ID || ''; - const modelName = process.env.AI_MODEL_NAME || ''; - const providerName = process.env.AI_PROVIDER_NAME || ''; + const hasAtlasEnv = !!process.env.ATLASCLOUD_API_KEY; + const apiKey = process.env.AI_API_KEY || process.env.ATLASCLOUD_API_KEY || ''; + const baseUrl = process.env.AI_BASE_URL || (hasAtlasEnv ? process.env.ATLASCLOUD_API_BASE || 'https://api.atlascloud.ai/v1' : ''); + const modelId = process.env.AI_MODEL_ID || (hasAtlasEnv ? process.env.ATLASCLOUD_MODEL || 'qwen/qwen3.5-flash' : ''); + const modelName = process.env.AI_MODEL_NAME || modelId; + const providerName = process.env.AI_PROVIDER_NAME || (hasAtlasEnv ? 'atlascloud' : ''); const apiType = process.env.AI_API_TYPE || 'openai-completions'; // 默认 OpenAI 兼容 - const modelId2 = process.env.AI_MODEL_ID_2 || ''; // 快速模型(选填) + const modelId2 = process.env.AI_MODEL_ID_2 || (hasAtlasEnv ? process.env.ATLASCLOUD_MODEL_2 || '' : ''); // 快速模型(选填) // 如果没有配置,抛出错误 if (!apiKey || !baseUrl || !modelId) { @@ -99,9 +100,10 @@ export function hasConfig(): boolean { } // 检查环境变量 - const apiKey = process.env.AI_API_KEY || ''; - const baseUrl = process.env.AI_BASE_URL || ''; - const modelId = process.env.AI_MODEL_ID || ''; + const hasAtlasEnv = !!process.env.ATLASCLOUD_API_KEY; + const apiKey = process.env.AI_API_KEY || process.env.ATLASCLOUD_API_KEY || ''; + const baseUrl = process.env.AI_BASE_URL || (hasAtlasEnv ? process.env.ATLASCLOUD_API_BASE || 'https://api.atlascloud.ai/v1' : ''); + const modelId = process.env.AI_MODEL_ID || (hasAtlasEnv ? process.env.ATLASCLOUD_MODEL || 'qwen/qwen3.5-flash' : ''); return !!(apiKey && baseUrl && modelId); } diff --git a/src/main/database/config-types.ts b/src/main/database/config-types.ts index 394dd44..3897abe 100644 --- a/src/main/database/config-types.ts +++ b/src/main/database/config-types.ts @@ -33,7 +33,7 @@ export interface WorkspaceSettings { * 模型配置 */ export interface ModelConfig { - providerType: 'qwen' | 'deepseek' | 'gemini' | 'minimax' | 'custom' | 'anthropic'; // 提供商类型(用于 UI 下拉选择) + providerType: 'deepbot' | 'qwen' | 'deepseek' | 'gemini' | 'minimax' | 'atlascloud' | 'custom' | 'anthropic'; // 提供商类型(用于 UI 下拉选择) providerId: string; // 提供商 ID providerName: string; // 提供商名称 baseUrl: string; // API 地址 diff --git a/src/main/database/model-config.ts b/src/main/database/model-config.ts index e95327c..c429484 100644 --- a/src/main/database/model-config.ts +++ b/src/main/database/model-config.ts @@ -22,20 +22,22 @@ export function clearModelConfigCache(): void { * 仅在数据库中没有配置时使用 */ function getModelConfigFromEnv(): ModelConfig | null { - const apiKey = process.env.AI_API_KEY; - const baseUrl = process.env.AI_BASE_URL; - const modelId = process.env.AI_MODEL_ID; + const hasAtlasEnv = !!process.env.ATLASCLOUD_API_KEY; + const apiKey = process.env.AI_API_KEY || process.env.ATLASCLOUD_API_KEY; + const baseUrl = process.env.AI_BASE_URL || (hasAtlasEnv ? process.env.ATLASCLOUD_API_BASE || 'https://api.atlascloud.ai/v1' : undefined); + const modelId = process.env.AI_MODEL_ID || (hasAtlasEnv ? process.env.ATLASCLOUD_MODEL || 'qwen/qwen3.5-flash' : undefined); // 三个核心字段都必须有才能构建有效配置 if (!apiKey || !baseUrl || !modelId) return null; const apiType = process.env.AI_API_TYPE || 'openai-completions'; - const modelId2 = process.env.AI_MODEL_ID_2 || undefined; - const providerName = process.env.AI_PROVIDER_NAME || '自定义'; + const modelId2 = process.env.AI_MODEL_ID_2 || (hasAtlasEnv ? process.env.ATLASCLOUD_MODEL_2 || undefined : undefined); + const providerName = process.env.AI_PROVIDER_NAME || (hasAtlasEnv ? 'Atlas Cloud' : '自定义'); // 根据 apiType 推断 providerType const providerType = apiType === 'google-generative-ai' ? 'gemini' : apiType === 'anthropic-messages' ? 'anthropic' + : hasAtlasEnv ? 'atlascloud' : 'custom'; console.info('[ModelConfig] 使用环境变量中的模型配置(数据库中无配置)'); diff --git a/src/main/tools/api-tool.schemas.ts b/src/main/tools/api-tool.schemas.ts index 8a14926..d0f9d9d 100644 --- a/src/main/tools/api-tool.schemas.ts +++ b/src/main/tools/api-tool.schemas.ts @@ -57,11 +57,14 @@ export const SetWorkspaceConfigSchema = Type.Object({ */ export const SetModelConfigSchema = Type.Object({ providerType: Type.Optional(Type.Union([ + Type.Literal('deepbot', { description: 'DeepBot' }), Type.Literal('qwen', { description: '通义千问' }), Type.Literal('deepseek', { description: 'DeepSeek' }), Type.Literal('gemini', { description: 'Google Gemini' }), Type.Literal('minimax', { description: 'MiniMax' }), + Type.Literal('atlascloud', { description: 'Atlas Cloud' }), Type.Literal('custom', { description: '自定义提供商' }), + Type.Literal('anthropic', { description: 'Anthropic' }), ])), providerId: Type.Optional(Type.String({ diff --git a/src/main/tools/handlers/config-handlers.ts b/src/main/tools/handlers/config-handlers.ts index 88b2c4e..396bfab 100644 --- a/src/main/tools/handlers/config-handlers.ts +++ b/src/main/tools/handlers/config-handlers.ts @@ -160,7 +160,7 @@ export async function handleSetWorkspaceConfig( */ export async function handleSetModelConfig( params: Partial<{ - providerType: 'qwen' | 'deepseek' | 'gemini' | 'minimax' | 'custom' | 'anthropic'; + providerType: 'deepbot' | 'qwen' | 'deepseek' | 'gemini' | 'minimax' | 'atlascloud' | 'custom' | 'anthropic'; providerId: string; providerName: string; baseUrl: string; @@ -329,4 +329,4 @@ export async function handleSetWebSearchConfig( } catch (error) { return createErrorResponse(error, '设置 Web 搜索工具配置'); } -} \ No newline at end of file +} diff --git a/src/renderer/components/settings/ModelConfig.tsx b/src/renderer/components/settings/ModelConfig.tsx index cf5e07a..9e76fcb 100644 --- a/src/renderer/components/settings/ModelConfig.tsx +++ b/src/renderer/components/settings/ModelConfig.tsx @@ -12,8 +12,10 @@ import { showToast } from '../../utils/toast'; import { ApiKeyHelpModal } from './ApiKeyHelpModal'; import { getLanguage } from '../../i18n'; +type ModelProviderType = 'deepbot' | 'atlascloud' | 'gemini' | 'custom' | 'anthropic'; + interface ModelConfig { - providerType: 'deepbot' | 'gemini' | 'custom' | 'anthropic'; + providerType: ModelProviderType; providerId: string; providerName: string; baseUrl: string; @@ -124,7 +126,7 @@ export function ModelConfig({ onClose, tabId }: ModelConfigProps) { }; // 处理提供商类型变化 - const handleProviderTypeChange = (providerType: 'deepbot' | 'gemini' | 'custom' | 'anthropic') => { + const handleProviderTypeChange = (providerType: ModelProviderType) => { const preset = PROVIDER_PRESETS[providerType]; setConfig({ @@ -281,10 +283,11 @@ export function ModelConfig({ onClose, tabId }: ModelConfigProps) {