import type { ProviderConfig, ModelInfo } from './types' import miphamModelsSnapshot from './mipham-models.json' with { type: 'json' } // Build MiphamAI provider from synced model definitions. // Source of truth: Engine GET /v1/mipham-models → packages/shared/src/mipham-models.json // Run `bun run scripts/sync-mipham-models.ts` to update from Engine. const MIPHAM_MODELS: ModelInfo[] = miphamModelsSnapshot.models.map((m) => ({ id: m.id, name: m.name, providerId: m.providerId, contextWindow: m.contextWindow, maxOutput: m.maxOutput, vision: m.vision, status: m.status as 'active' | 'upcoming' | 'deprecated', })) const MIPHAM_PROVIDER: ProviderConfig = { id: miphamModelsSnapshot.provider.id, name: miphamModelsSnapshot.provider.name, protocol: miphamModelsSnapshot.provider.protocol as 'openai-compatible', baseUrl: miphamModelsSnapshot.provider.baseUrl, apiKey: miphamModelsSnapshot.provider.apiKey, models: MIPHAM_MODELS, status: miphamModelsSnapshot.provider.status as 'active' | 'upcoming', } // Providers: alphabetical by id. Models: Lite/Flash → Text → Vision → Code → Pro/Think export const DEFAULT_PROVIDERS: ProviderConfig[] = [ { id: 'anthropic', name: 'Anthropic Claude', protocol: 'anthropic', apiKey: '${ANTHROPIC_API_KEY}', models: [ { id: 'claude-haiku-4-5-20251001', name: 'Claude Haiku 4.5', providerId: 'anthropic', contextWindow: 200_000, maxOutput: 32_000, vision: true, status: 'active', }, { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6', providerId: 'anthropic', contextWindow: 1_000_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'claude-opus-4-8', name: 'Claude Opus 4.8', providerId: 'anthropic', contextWindow: 1_000_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'claude-fable-5', name: 'Claude Fable 5', providerId: 'anthropic', contextWindow: 1_000_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'claude-mythos-5', name: 'Claude Mythos 5', providerId: 'anthropic', contextWindow: 1_000_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'claude-sonnet-5', name: 'Claude Sonnet 5', providerId: 'anthropic', contextWindow: 1_000_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'claude-opus-5', name: 'Claude Opus 5', providerId: 'anthropic', contextWindow: 1_000_000, maxOutput: 128_000, vision: true, status: 'active', }, ], }, { id: 'deepseek', name: 'DeepSeek', protocol: 'openai-compatible', baseUrl: 'https://api.deepseek.com/v1', apiKey: '${DEEPSEEK_API_KEY}', models: [ { id: 'deepseek-v4-flash', name: 'DeepSeek V4 Flash', providerId: 'deepseek', contextWindow: 1_000_000, maxOutput: 384_000, vision: false, status: 'active', }, { id: 'deepseek-v4-pro', name: 'DeepSeek V4 Pro', providerId: 'deepseek', contextWindow: 1_000_000, maxOutput: 384_000, vision: false, status: 'active', }, ], }, { id: 'google', name: 'Google Gemini', protocol: 'openai-compatible', baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai', apiKey: '${GEMINI_API_KEY}', models: [ { id: 'gemini-3.0-flash', name: 'Gemini 3.0 Flash', providerId: 'google', contextWindow: 1_000_000, maxOutput: 64_000, vision: true, status: 'active', }, { id: 'gemini-3.0-pro', name: 'Gemini 3.0 Pro', providerId: 'google', contextWindow: 1_000_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro', providerId: 'google', contextWindow: 1_000_000, maxOutput: 64_000, vision: true, status: 'active', }, ], }, { id: 'doubao', name: '豆包 (字节跳动)', protocol: 'openai-compatible', baseUrl: 'https://ark.cn-beijing.volces.com/api/v3', apiKey: '${DOUBAO_API_KEY}', models: [ { id: 'doubao-seed-1.6-flash', name: '豆包 Seed 1.6 Flash', providerId: 'doubao', contextWindow: 256_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'doubao-seed-2.0-mini', name: '豆包 Seed 2.0 Mini', providerId: 'doubao', contextWindow: 256_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'doubao-seed-2.0-lite', name: '豆包 Seed 2.0 Lite', providerId: 'doubao', contextWindow: 256_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'doubao-seed-1.6', name: '豆包 Seed 1.6', providerId: 'doubao', contextWindow: 256_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'doubao-seed-2.0-pro', name: '豆包 Seed 2.0 Pro', providerId: 'doubao', contextWindow: 256_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'doubao-seed-2.0-code', name: '豆包 Seed 2.0 Code', providerId: 'doubao', contextWindow: 256_000, maxOutput: 128_000, vision: true, status: 'active', }, ], }, { id: 'hunyuan', name: '腾讯混元', protocol: 'openai-compatible', baseUrl: 'https://api.hunyuan.cloud.tencent.com/v1', apiKey: '${HUNYUAN_API_KEY}', models: [ { id: 'hunyuan-lite', name: '混元 Lite (免费)', providerId: 'hunyuan', contextWindow: 256_000, maxOutput: 6_000, vision: false, status: 'active', }, { id: 'hunyuan-turbos-latest', name: '混元 TurboS', providerId: 'hunyuan', contextWindow: 32_000, maxOutput: 16_000, vision: false, status: 'active', }, { id: 'hunyuan-2.0-instruct-20251111', name: '混元 2.0 Instruct', providerId: 'hunyuan', contextWindow: 144_000, maxOutput: 16_000, vision: false, status: 'active', }, { id: 'hunyuan-t1-vision-20250916', name: '混元 T1 Vision', providerId: 'hunyuan', contextWindow: 32_000, maxOutput: 64_000, vision: true, status: 'active', }, { id: 'hunyuan-a13b', name: '混元 A13B', providerId: 'hunyuan', contextWindow: 224_000, maxOutput: 32_000, vision: false, status: 'active', }, { id: 'hunyuan-2.0-thinking-20251109', name: '混元 2.0 Think', providerId: 'hunyuan', contextWindow: 192_000, maxOutput: 64_000, vision: false, status: 'active', }, { id: 'hunyuan-t1-latest', name: '混元 T1 (推理)', providerId: 'hunyuan', contextWindow: 32_000, maxOutput: 64_000, vision: false, status: 'active', }, { id: 'hy3-preview', name: '混元 Hy3 Preview', providerId: 'hunyuan', contextWindow: 256_000, maxOutput: 128_000, vision: false, status: 'active', }, ], }, { id: 'kimi', name: 'Kimi (月之暗面)', protocol: 'openai-compatible', baseUrl: 'https://api.moonshot.cn/v1', apiKey: '${KIMI_API_KEY}', models: [ { id: 'kimi-latest', name: 'Kimi Latest', providerId: 'kimi', contextWindow: 128_000, maxOutput: 16_000, vision: true, status: 'active', }, { id: 'kimi-k3', name: 'Kimi K3', providerId: 'kimi', contextWindow: 1_000_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'moonshot-v1-8k', name: 'Moonshot v1 8K', providerId: 'kimi', contextWindow: 8_000, maxOutput: 4_000, vision: false, status: 'active', }, { id: 'moonshot-v1-32k', name: 'Moonshot v1 32K', providerId: 'kimi', contextWindow: 32_000, maxOutput: 4_000, vision: false, status: 'active', }, { id: 'moonshot-v1-128k', name: 'Moonshot v1 128K', providerId: 'kimi', contextWindow: 128_000, maxOutput: 4_000, vision: false, status: 'active', }, ], }, { id: 'minimax', name: 'MiniMax (国内)', protocol: 'openai-compatible', baseUrl: 'https://api.minimaxi.com/v1', apiKey: '${MINIMAX_API_KEY}', models: [ { id: 'MiniMax-M2.7', name: 'MiniMax M2.7', providerId: 'minimax', contextWindow: 204_800, maxOutput: 64_000, vision: false, status: 'active', }, { id: 'MiniMax-M2', name: 'MiniMax M2', providerId: 'minimax', contextWindow: 204_800, maxOutput: 64_000, vision: false, status: 'active', }, { id: 'MiniMax-Text-01', name: 'MiniMax Text 01', providerId: 'minimax', contextWindow: 1_000_000, maxOutput: 64_000, vision: false, status: 'active', }, ], }, { id: 'minimax-global', name: 'MiniMax (国际)', protocol: 'openai-compatible', baseUrl: 'https://api.minimax.io/v1', apiKey: '${MINIMAX_GLOBAL_API_KEY}', models: [ { id: 'MiniMax-M2.7', name: 'MiniMax M2.7', providerId: 'minimax-global', contextWindow: 204_800, maxOutput: 64_000, vision: false, status: 'active', }, { id: 'MiniMax-M2', name: 'MiniMax M2', providerId: 'minimax-global', contextWindow: 204_800, maxOutput: 64_000, vision: false, status: 'active', }, { id: 'MiniMax-Text-01', name: 'MiniMax Text 01', providerId: 'minimax-global', contextWindow: 1_000_000, maxOutput: 64_000, vision: false, status: 'active', }, ], }, MIPHAM_PROVIDER, { id: 'ollama', name: 'Ollama (本地)', protocol: 'openai-compatible', baseUrl: 'http://localhost:11434/v1', apiKey: 'ollama-local', models: [], // 动态发现,初值为空 }, { id: 'openai', name: 'OpenAI', protocol: 'openai-compatible', baseUrl: 'https://api.openai.com/v1', apiKey: '${OPENAI_API_KEY}', models: [ { id: 'gpt-5.4-mini', name: 'GPT-5.4 Mini', providerId: 'openai', contextWindow: 400_000, maxOutput: 32_000, vision: true, status: 'active', }, { id: 'gpt-5.4', name: 'GPT-5.4', providerId: 'openai', contextWindow: 1_050_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'gpt-5.5', name: 'GPT-5.5', providerId: 'openai', contextWindow: 1_050_000, maxOutput: 128_000, vision: true, status: 'active', }, { id: 'gpt-5.3-codex', name: 'GPT-5.3 Codex', providerId: 'openai', contextWindow: 400_000, maxOutput: 64_000, vision: false, status: 'active', }, { id: 'gpt-6-astra', name: 'GPT-6 Astra', providerId: 'openai', contextWindow: 1_050_000, maxOutput: 128_000, vision: true, status: 'active', }, ], }, { id: 'qwen', name: '通义千问', protocol: 'openai-compatible', baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1', apiKey: '${QWEN_API_KEY}', models: [ { id: 'qwen-plus', name: 'Qwen Plus', providerId: 'qwen', contextWindow: 128_000, maxOutput: 32_000, vision: true, status: 'active', }, { id: 'qwen-max', name: 'Qwen Max', providerId: 'qwen', contextWindow: 128_000, maxOutput: 32_000, vision: true, status: 'active', }, ], }, ] export const PROTOCOL_LABELS: Record = { 'openai-compatible': 'OpenAI Compatible', anthropic: 'Anthropic', custom: 'Custom Protocol', } export const TOOL_CATEGORIES = [ 'file', 'exec', 'agent', 'network', 'system', 'artifact', 'scheduling', ] as const export const CONFIG_FILE_NAME = 'config.yml' export const MIPHAM_DIR = '.mipham' export const MEMORY_DIR = 'memory' /** 预置 Ollama 模型 — 与 ollama list 结果合并去重后展示 */ export const OLLAMA_PRESET_MODELS = [ { id: 'om-v5-flash', source: 'MiphamAI' }, { id: 'om-v5-pro', source: 'MiphamAI' }, { id: 'om-v5-visual', source: 'MiphamAI' }, { id: 'om-v5-apex', source: 'MiphamAI' }, { id: 'deepseek-r1:70b', source: '热门' }, { id: 'deepseek-v3', source: '热门' }, { id: 'qwen2.5:72b', source: '热门' }, { id: 'qwen3', source: '热门' }, ] as const // ── Artifact Constants ── export const ARTIFACTS_DIR = 'artifacts' export const ARTIFACT_PORT = 9876 export const ARTIFACT_MAX_PORT_TRIES = 10 export const ARTIFACT_MAX_SIZE = 5 * 1024 * 1024 // 5MB export const ARTIFACT_ALLOWED_EXTENSIONS = ['.html', '.svg']