Files

1 line
22 KiB
JSON

{"repo": "ageless-h/my-ai-job", "files": {"src/features/ai-config/constants/model-catalog.ts": {"eaa0c650469eca4181bc6a2cd3f8a066f3db4e38": {"t": 1785595984.9927795, "n": 21277, "h": "1b85ce56a588e3b7", "c": "// -*- coding: utf-8 -*-\nimport type { ApiFormat } from '@/core/ai/direct-ai-client';\n\nexport type ModelProtocol = ApiFormat | 'bedrock-converse-stream';\n\nexport interface ModelCatalogModel {\n id: string;\n name: string;\n}\n\nexport interface ModelProviderTemplate {\n id: string;\n name: string;\n baseUrl: string;\n apiFormat: ModelProtocol;\n models: ModelCatalogModel[];\n source: 'internal/provider-template';\n}\n\nexport interface ModelProtocolVariant extends ModelCatalogModel {\n protocol: ModelProtocol;\n source: 'internal/model-protocol-variant';\n}\n\nexport type ModelProviderApiKeyLinkType = 'official' | 'invite';\n\nexport interface ModelProviderApiKeyLink {\n apiKeyUrl: string;\n websiteUrl?: string;\n linkType: ModelProviderApiKeyLinkType;\n}\n\nexport const MODEL_PROVIDER_API_KEY_LINKS: Record<string, ModelProviderApiKeyLink> = {\n deepseek: {\n websiteUrl: 'https://platform.deepseek.com',\n apiKeyUrl: 'https://platform.deepseek.com/api_keys',\n linkType: 'official',\n },\n 'zhipu-glm': {\n websiteUrl: 'https://open.bigmodel.cn',\n apiKeyUrl:\n 'https://www.bigmodel.cn/invite?icode=ZKDHiDm%2B22bog0HN3roPmlwpqjqOwPB5EXW6OL4DgqY%3D',\n linkType: 'invite',\n },\n 'zhipu-glm-en': {\n websiteUrl: 'https://z.ai',\n apiKeyUrl: 'https://z.ai/subscribe?ic=XIHRXQOONY',\n linkType: 'invite',\n },\n 'qwen-coder': {\n websiteUrl: 'https://bailian.console.aliyun.com',\n apiKeyUrl: 'https://bailian.console.aliyun.com/#/api-key',\n linkType: 'official',\n },\n 'kimi-k2-5': {\n websiteUrl: 'https://platform.moonshot.cn/console',\n apiKeyUrl: 'https://platform.moonshot.cn/console/api-keys',\n linkType: 'official',\n },\n 'kimi-for-coding': {\n websiteUrl: 'https://www.kimi.com/coding/docs/',\n apiKeyUrl: 'https://platform.moonshot.cn/console/api-keys',\n linkType: 'official',\n },\n stepfun: {\n websiteUrl: 'https://platform.stepfun.ai',\n apiKeyUrl: 'https://platform.stepfun.ai/interface-key',\n linkType: 'official',\n },\n minimax: {\n websiteUrl: 'https://platform.minimaxi.com',\n apiKeyUrl: 'https://platform.minimaxi.com/subscribe/coding-plan?code=A7pKgCYnhi&source=link',\n linkType: 'invite',\n },\n 'minimax-en': {\n websiteUrl: 'https://platform.minimax.io',\n apiKeyUrl: 'https://platform.minimax.io/subscribe/coding-plan',\n linkType: 'official',\n },\n 'kat-coder': {\n websiteUrl: 'https://console.streamlake.ai',\n apiKeyUrl: 'https://console.streamlake.ai/console/api-key',\n linkType: 'official',\n },\n longcat: {\n websiteUrl: 'https://longcat.chat/platform',\n apiKeyUrl: 'https://longcat.chat/platform/api_keys',\n linkType: 'official',\n },\n doubaoseed: {\n websiteUrl: 'https://www.volcengine.com/product/doubao',\n apiKeyUrl: 'https://www.volcengine.com/product/doubao',\n linkType: 'official',\n },\n bailing: {\n websiteUrl: 'https://alipaytbox.yuque.com/sxs0ba/ling/get_started',\n apiKeyUrl: 'https://alipaytbox.yuque.com/sxs0ba/ling/get_started',\n linkType: 'official',\n },\n 'xiaomi-mimo': {\n websiteUrl: 'https://platform.xiaomimimo.com',\n apiKeyUrl: 'https://platform.xiaomimimo.com/#/console/api-keys',\n linkType: 'official',\n },\n aihubmix: {\n websiteUrl: 'https://aihubmix.com',\n apiKeyUrl: 'https://aihubmix.com',\n linkType: 'official',\n },\n dmxapi: {\n websiteUrl: 'https://www.dmxapi.cn',\n apiKeyUrl: 'https://www.dmxapi.cn/register?aff=23hi',\n linkType: 'invite',\n },\n openrouter: {\n websiteUrl: 'https://openrouter.ai',\n apiKeyUrl: 'https://openrouter.ai/keys',\n linkType: 'official',\n },\n modelscope: {\n websiteUrl: 'https://modelscope.cn',\n apiKeyUrl: 'https://modelscope.cn/my/myaccesstoken',\n linkType: 'official',\n },\n siliconflow: {\n websiteUrl: 'https://siliconflow.cn',\n apiKeyUrl: 'https://cloud.siliconflow.cn/i/h0tOXH3L',\n linkType: 'invite',\n },\n 'siliconflow-en': {\n websiteUrl: 'https://siliconflow.com',\n apiKeyUrl: 'https://cloud.siliconflow.cn/i/h0tOXH3L',\n linkType: 'invite',\n },\n 'novita-ai': {\n websiteUrl: 'https://novita.ai',\n apiKeyUrl: 'https://novita.ai',\n linkType: 'official',\n },\n nvidia: {\n websiteUrl: 'https://build.nvidia.com',\n apiKeyUrl: 'https://build.nvidia.com/settings/api-keys',\n linkType: 'official',\n },\n packycode: {\n websiteUrl: 'https://www.packyapi.com',\n apiKeyUrl: 'https://www.packyapi.com/register?aff=MFve',\n linkType: 'invite',\n },\n cubence: {\n websiteUrl: 'https://cubence.com',\n apiKeyUrl: 'https://cubence.com/signup?code=SCUWJBM3',\n linkType: 'invite',\n },\n aigocode: {\n websiteUrl: 'https://aigocode.com',\n apiKeyUrl: 'https://aigocode.com/invite/AFQXZTHN',\n linkType: 'invite',\n },\n rightcode: {\n websiteUrl: 'https://www.right.codes',\n apiKeyUrl: 'https://www.right.codes/register?aff=66a66d17',\n linkType: 'invite',\n },\n aicodemirror: {\n websiteUrl: 'https://www.aicodemirror.com',\n apiKeyUrl: 'https://www.aicodemirror.com/register?invitecode=O4YZKX',\n linkType: 'invite',\n },\n aicoding: {\n websiteUrl: 'https://aicoding.sh',\n apiKeyUrl: 'https://aicoding.sh/i/cjxJp2',\n linkType: 'invite',\n },\n crazyrouter: {\n websiteUrl: 'https://www.crazyrouter.com',\n apiKeyUrl: 'https://crazyrouter.com/register?aff=Xlnc',\n linkType: 'invite',\n },\n sssaicode: {\n websiteUrl: 'https://www.sssaicode.com',\n apiKeyUrl: 'https://www.sssaicode.com/register?ref=8991ME',\n linkType: 'invite',\n },\n compshare: {\n websiteUrl: 'https://www.compshare.cn',\n apiKeyUrl: 'https://passport.compshare.cn/register?referral_code=GylGEfB4q05FiZIUaNkbvk',\n linkType: 'invite',\n },\n micu: {\n websiteUrl: 'https://www.openclaudecode.cn',\n apiKeyUrl: 'https://www.openclaudecode.cn/register?aff=yCKx',\n linkType: 'invite',\n },\n 'ctok-ai': {\n websiteUrl: 'https://ctok.ai',\n apiKeyUrl: 'https://ctok.ai',\n linkType: 'official',\n },\n 'x-code': {\n websiteUrl: 'https://x-code.cc',\n apiKeyUrl: 'https://x-code.cc/register?aff=OsFA',\n linkType: 'invite',\n },\n 'aws-bedrock': {\n websiteUrl: 'https://aws.amazon.com/bedrock/',\n apiKeyUrl: 'https://aws.amazon.com/bedrock/',\n linkType: 'official',\n },\n 'openai-compatible': {\n websiteUrl: 'https://platform.openai.com/',\n apiKeyUrl: 'https://platform.openai.com/api-keys',\n linkType: 'official',\n },\n};\n\nexport const MODEL_PROVIDER_INVITE_LINK_IDS = Object.keys(MODEL_PROVIDER_API_KEY_LINKS).filter(\n (id) => MODEL_PROVIDER_API_KEY_LINKS[id]?.linkType === 'invite'\n);\n\nexport const SUPPORTED_DIRECT_MODEL_PROTOCOLS: ApiFormat[] = [\n 'completions',\n 'responses',\n 'anthropic-messages',\n 'google-generative-ai',\n];\n\nexport const MODEL_PROVIDER_TEMPLATES: ModelProviderTemplate[] = [\n {\n id: 'deepseek',\n name: 'DeepSeek',\n baseUrl: 'https://api.deepseek.com/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [\n { id: 'deepseek-chat', name: 'DeepSeek V3.2' },\n { id: 'deepseek-reasoner', name: 'DeepSeek R1' },\n ],\n },\n {\n id: 'zhipu-glm',\n name: 'Zhipu GLM',\n baseUrl: 'https://open.bigmodel.cn/api/paas/v4',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'glm-5', name: 'GLM-5' }],\n },\n {\n id: 'zhipu-glm-en',\n name: 'Zhipu GLM en',\n baseUrl: 'https://api.z.ai/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'glm-5', name: 'GLM-5' }],\n },\n {\n id: 'qwen-coder',\n name: 'Qwen Coder',\n baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'qwen3.5-plus', name: 'Qwen3.5 Plus' }],\n },\n {\n id: 'kimi-k2-5',\n name: 'Kimi k2.5',\n baseUrl: 'https://api.moonshot.cn/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'kimi-k2.5', name: 'Kimi K2.5' }],\n },\n {\n id: 'kimi-for-coding',\n name: 'Kimi For Coding',\n baseUrl: 'https://api.kimi.com/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'kimi-for-coding', name: 'Kimi For Coding' }],\n },\n {\n id: 'stepfun',\n name: 'StepFun',\n baseUrl: 'https://api.stepfun.ai/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'step-3.5-flash', name: 'Step 3.5 Flash' }],\n },\n {\n id: 'minimax',\n name: 'MiniMax',\n baseUrl: 'https://api.minimaxi.com/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'MiniMax-M2.5', name: 'MiniMax M2.5' }],\n },\n {\n id: 'minimax-en',\n name: 'MiniMax en',\n baseUrl: 'https://api.minimax.io/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'MiniMax-M2.5', name: 'MiniMax M2.5' }],\n },\n {\n id: 'kat-coder',\n name: 'KAT-Coder',\n baseUrl: 'https://vanchin.streamlake.ai/api/gateway/v1/endpoints/${ENDPOINT_ID}/openai',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'KAT-Coder-Pro', name: 'KAT-Coder Pro' }],\n },\n {\n id: 'longcat',\n name: 'Longcat',\n baseUrl: 'https://api.longcat.chat/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'LongCat-Flash-Chat', name: 'LongCat Flash Chat' }],\n },\n {\n id: 'doubaoseed',\n name: 'DouBaoSeed',\n baseUrl: 'https://ark.cn-beijing.volces.com/api/v3',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [\n {\n id: 'doubao-seed-2-0-code-preview-latest',\n name: 'DouBao Seed Code Preview',\n },\n ],\n },\n {\n id: 'bailing',\n name: 'BaiLing',\n baseUrl: 'https://api.tbox.cn/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'Ling-2.5-1T', name: 'Ling 2.5 1T' }],\n },\n {\n id: 'xiaomi-mimo',\n name: 'Xiaomi MiMo',\n baseUrl: 'https://api.xiaomimimo.com/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'mimo-v2-flash', name: 'MiMo V2 Flash' }],\n },\n {\n id: 'aihubmix',\n name: 'AiHubMix',\n baseUrl: 'https://aihubmix.com',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n ],\n },\n {\n id: 'dmxapi',\n name: 'DMXAPI',\n baseUrl: 'https://www.dmxapi.cn',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n ],\n },\n {\n id: 'openrouter',\n name: 'OpenRouter',\n baseUrl: 'https://openrouter.ai/api/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [\n { id: 'anthropic/claude-opus-4.6', name: 'Claude Opus 4.6' },\n { id: 'anthropic/claude-sonnet-4.6', name: 'Claude Sonnet 4.6' },\n ],\n },\n {\n id: 'modelscope',\n name: 'ModelScope',\n baseUrl: 'https://api-inference.modelscope.cn/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'ZhipuAI/GLM-5', name: 'GLM-5' }],\n },\n {\n id: 'siliconflow',\n name: 'SiliconFlow',\n baseUrl: 'https://api.siliconflow.cn/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'Pro/MiniMaxAI/MiniMax-M2.5', name: 'MiniMax M2.5' }],\n },\n {\n id: 'siliconflow-en',\n name: 'SiliconFlow en',\n baseUrl: 'https://api.siliconflow.com/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'MiniMaxAI/MiniMax-M2.5', name: 'MiniMax M2.5' }],\n },\n {\n id: 'novita-ai',\n name: 'Novita AI',\n baseUrl: 'https://api.novita.ai/openai',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'zai-org/glm-5', name: 'GLM-5' }],\n },\n {\n id: 'nvidia',\n name: 'Nvidia',\n baseUrl: 'https://integrate.api.nvidia.com/v1',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [{ id: 'moonshotai/kimi-k2.5', name: 'Kimi K2.5' }],\n },\n {\n id: 'packycode',\n name: 'PackyCode',\n baseUrl: 'https://www.packyapi.com',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n ],\n },\n {\n id: 'cubence',\n name: 'Cubence',\n baseUrl: 'https://api.cubence.com',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n ],\n },\n {\n id: 'aigocode',\n name: 'AIGoCode',\n baseUrl: 'https://api.aigocode.com',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n ],\n },\n {\n id: 'rightcode',\n name: 'RightCode',\n baseUrl: 'https://www.right.codes/claude',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n ],\n },\n {\n id: 'aicodemirror',\n name: 'AICodeMirror',\n baseUrl: 'https://api.aicodemirror.com/api/claudecode',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n ],\n },\n {\n id: 'aicoding',\n name: 'AICoding',\n baseUrl: 'https://api.aicoding.sh',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n ],\n },\n {\n id: 'crazyrouter',\n name: 'CrazyRouter',\n baseUrl: 'https://crazyrouter.com/v1',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n ],\n },\n {\n id: 'sssaicode',\n name: 'SSSAiCode',\n baseUrl: 'https://node-hk.sssaicode.com/api',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n ],\n },\n {\n id: 'compshare',\n name: 'Compshare',\n baseUrl: 'https://api.modelverse.cn/v1',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [{ id: 'claude-opus-4-6', name: 'Claude Opus 4.6' }],\n },\n {\n id: 'micu',\n name: 'Micu',\n baseUrl: 'https://www.openclaudecode.cn',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [{ id: 'claude-opus-4-6', name: 'Claude Opus 4.6' }],\n },\n {\n id: 'x-code',\n name: 'X-Code API',\n baseUrl: 'https://x-code.cc/v1',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n ],\n },\n {\n id: 'ctok-ai',\n name: 'CTok.ai',\n baseUrl: 'https://api.ctok.ai',\n apiFormat: 'anthropic-messages',\n source: 'internal/provider-template',\n models: [{ id: 'claude-opus-4-6', name: 'Claude Opus 4.6' }],\n },\n {\n id: 'aws-bedrock',\n name: 'AWS Bedrock',\n baseUrl: 'https://bedrock-runtime.us-west-2.amazonaws.com',\n apiFormat: 'bedrock-converse-stream',\n source: 'internal/provider-template',\n models: [\n {\n id: 'anthropic.claude-opus-4-6-20250514-v1:0',\n name: 'Claude Opus 4.6',\n },\n { id: 'anthropic.claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },\n {\n id: 'anthropic.claude-haiku-4-5-20251022-v1:0',\n name: 'Claude Haiku 4.5',\n },\n ],\n },\n {\n id: 'openai-compatible',\n name: 'OpenAI Compatible',\n baseUrl: '',\n apiFormat: 'completions',\n source: 'internal/provider-template',\n models: [],\n },\n];\n\nexport const MODEL_PROTOCOL_VARIANTS: ModelProtocolVariant[] = [\n {\n id: 'MiniMax-M2.5',\n name: 'MiniMax M2.5',\n protocol: 'completions',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'glm-5',\n name: 'GLM-5',\n protocol: 'completions',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'kimi-k2.5',\n name: 'Kimi K2.5',\n protocol: 'completions',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'step-3.5-flash',\n name: 'Step 3.5 Flash',\n protocol: 'completions',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'gpt-5.4',\n name: 'GPT-5.4',\n protocol: 'responses',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'claude-sonnet-4-5-20250929',\n name: 'Claude Sonnet 4.5',\n protocol: 'anthropic-messages',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'claude-opus-4-5-20251101',\n name: 'Claude Opus 4.5',\n protocol: 'anthropic-messages',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'claude-opus-4-6',\n name: 'Claude Opus 4.6',\n protocol: 'anthropic-messages',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'claude-haiku-4-5-20251001',\n name: 'Claude Haiku 4.5',\n protocol: 'anthropic-messages',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'gemini-claude-opus-4-5-thinking',\n name: 'Antigravity - Claude Opus 4.5',\n protocol: 'anthropic-messages',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'gemini-claude-sonnet-4-5-thinking',\n name: 'Antigravity - Claude Sonnet 4.5',\n protocol: 'anthropic-messages',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'gemini-2.5-flash-lite',\n name: 'Gemini 2.5 Flash Lite',\n protocol: 'google-generative-ai',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'gemini-3-flash-preview',\n name: 'Gemini 3 Flash Preview',\n protocol: 'google-generative-ai',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'gemini-3-pro-preview',\n name: 'Gemini 3 Pro Preview',\n protocol: 'google-generative-ai',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'global.anthropic.claude-opus-4-6-v1',\n name: 'Claude Opus 4.6 (Bedrock)',\n protocol: 'bedrock-converse-stream',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'global.anthropic.claude-sonnet-4-6',\n name: 'Claude Sonnet 4.6 (Bedrock)',\n protocol: 'bedrock-converse-stream',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'global.anthropic.claude-haiku-4-5-20251001-v1:0',\n name: 'Claude Haiku 4.5 (Bedrock)',\n protocol: 'bedrock-converse-stream',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'us.amazon.nova-pro-v1:0',\n name: 'Amazon Nova Pro',\n protocol: 'bedrock-converse-stream',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'us.meta.llama4-maverick-17b-instruct-v1:0',\n name: 'Meta Llama 4 Maverick',\n protocol: 'bedrock-converse-stream',\n source: 'internal/model-protocol-variant',\n },\n {\n id: 'us.deepseek.r1-v1:0',\n name: 'DeepSeek R1 (Bedrock)',\n protocol: 'bedrock-converse-stream',\n source: 'internal/model-protocol-variant',\n },\n];\n\nexport function isSupportedDirectModelProtocol(apiFormat: ModelProtocol): apiFormat is ApiFormat {\n return SUPPORTED_DIRECT_MODEL_PROTOCOLS.includes(apiFormat as ApiFormat);\n}\n\nexport function getModelProviderTemplateById(presetId: string): ModelProviderTemplate | null {\n return MODEL_PROVIDER_TEMPLATES.find((item) => item.id === presetId) || null;\n}\n\nexport function getModelProviderApiKeyLink(templateId: string): ModelProviderApiKeyLink | null {\n const key = `${templateId || ''}`.trim();\n if (!key) {\n return null;\n }\n return MODEL_PROVIDER_API_KEY_LINKS[key] || null;\n}\n\nexport function getModelProviderInviteLinks(): Array<{\n id: string;\n name: string;\n apiKeyUrl: string;\n}> {\n return MODEL_PROVIDER_TEMPLATES.filter((item) =>\n MODEL_PROVIDER_INVITE_LINK_IDS.includes(item.id)\n ).map((item) => ({\n id: item.id,\n name: item.name,\n apiKeyUrl: MODEL_PROVIDER_API_KEY_LINKS[item.id]?.apiKeyUrl || '',\n }));\n}\n\nexport function getModelSuggestionsByProtocol(protocol: ModelProtocol): ModelCatalogModel[] {\n const fromVariants = MODEL_PROTOCOL_VARIANTS.filter((item) => item.protocol === protocol).map(\n (item) => ({ id: item.id, name: item.name })\n );\n const merged: ModelCatalogModel[] = [];\n const seen = new Set<string>();\n for (const item of fromVariants) {\n const key = `${item.id}`.trim();\n if (!key || seen.has(key)) {\n continue;\n }\n seen.add(key);\n merged.push(item);\n }\n return merged;\n}\n"}}}}