import { LogoOpenAI, LogoOpenrouter, LogoOllama, LogoCerebras, LogoLongCat, LogoGoogle, LogoGrok, LogoGemini, LogoGemma, LogoDeepMind, LogoVertexAI, LogoDeepCogito, LogoQwen, LogoArcee, LogoAi2, LogoMoonshot, LogoZAI, LogoGLMV, LogoChatGLM, LogoNvidia, LogoMistral, LogoMeta, LogoPerplexity, LogoDeepSeek, LogoClaude, LogoAnthropic, LogoMorph, LogoNousResearch, LogoAi21, LogoWenxin, LogoBaiduCloud, LogoMinimax, LogoNova, LogoByteDance, LogoLiquid, LogoPaLM, LogoUpstage, LogoStepfun, LogoXiaomiMiMo, LogoRelace, LogoEssentialAI, LogoKwaipilot, LogoIBM, LogoInternLM, LogoHunyuan, LogoInception, LogoAya, LogoCohere, LogoAionLabs, LogoMicrosoft, LogoInflection, LogoVllm, LogoClosedRouter, } from '#components'; import { markRaw } from 'vue'; interface ModelConfig { Icon: any; keywords: RegExp[]; props?: Record; } const MODEL_MAPPINGS: ModelConfig[] = [ { Icon: markRaw(LogoOpenAI), keywords: [/gpt-3/], props: { type: 'gpt3' } }, { Icon: markRaw(LogoOpenAI), keywords: [/gpt-4/], props: { type: 'gpt4' } }, { Icon: markRaw(LogoOpenAI), keywords: [/gpt-5/], props: { type: 'gpt5' } }, // { Icon: Sora, keywords: ['sora'] }, { Icon: markRaw(LogoOpenAI), keywords: [/gpt-oss/], props: { type: 'oss' } }, { Icon: markRaw(LogoOpenAI), keywords: [/o1-/, /^o1/, /\/o1/, /o3-/, /^o3/, /\/o3/, /o4-/, /^o4/, /\/o4/], props: { type: 'o1' }, }, // { Icon: Dalle, keywords: ['dalle', 'dall-e'] }, { Icon: markRaw(LogoOpenAI), keywords: [ /text-embedding-/, /tts-/, /whisper-/, /codex/, /davinci/, /babbage/, /omni-moderation/, /text-moderation/, /text-adb/, /text-ada/, /computer-use/, ], props: { type: 'platform' }, }, { Icon: markRaw(LogoOpenAI), keywords: [/^gpt-/, /\/gpt-/, /openai/], }, { Icon: markRaw(LogoGrok), keywords: [/^grok-/, /^x-ai\//], }, { Icon: markRaw(LogoGemini), keywords: [/gemini-/], }, { Icon: markRaw(LogoGemma), keywords: [/gemma-/, /^gemma/, /\/gemma/, /translategemma/], }, { Icon: markRaw(LogoDeepMind), keywords: [/^imagen-/, /\/imagen-/, /^imagen\d\//, /\/imagen\d/] }, { Icon: markRaw(LogoVertexAI), keywords: [/^veo-/, /\/veo-/] }, { Icon: markRaw(LogoGoogle), keywords: [/google/, /learnlm/, /nano-banana/] }, { Icon: markRaw(LogoDeepCogito), keywords: [/^deepcogito-/, /\/deepcogito-/, /^cogito-/, /\/cogito-/] }, { Icon: markRaw(LogoQwen), keywords: [/qwen/, /qwq/, /qvq/, /wanx/, /wan\d/, /wan\d\.\d-/, /tongyi/], }, { Icon: markRaw(LogoArcee), keywords: [ /^trinity-/, /\/trinity-/, /afm-4.5b/, /caller-large/, /spotlight/, /maestro-reasoning/, /virtuoso-medium-v2/, /virtuoso-large/, /coder-large/, /arcee-blitz/, ], }, { Icon: markRaw(LogoAi2), keywords: [ /allenai\//, /olmo-/, /\/olmo-/, ] }, { Icon: markRaw(LogoOpenrouter), keywords: [ /openrouter\//, ] }, { Icon: markRaw(LogoMoonshot), keywords: [/kimi/, /moonshot/] }, { Icon: markRaw(LogoZAI), keywords: [/^glm-4/, /\/glm-4/, /zai-/, /-glm-4/, /glm-\d/] }, { Icon: markRaw(LogoGLMV), keywords: [/^glm-(.*)v/, /\/glm-(.*)v/] }, { Icon: markRaw(LogoChatGLM), keywords: [/^glm-/, /\/glm-/, /chatglm/] }, { Icon: markRaw(LogoNvidia), keywords: [/nvidia\//, /nemotron/, /openreasoning/, /nemoretriever/, /neva-/, /nv-/] }, { Icon: markRaw(LogoMistral), keywords: [ /mistral/, /mixtral/, /codestral/, /mathstral/, /\/mn-/, /pixtral/, /ministral/, /magistral/, /devstral/, /voxtral/, /leanstral/, ], }, { Icon: markRaw(LogoMeta), keywords: [/llama/, /\/l3/, /meta-llama\//] }, { Icon: markRaw(LogoPerplexity), keywords: [/pplx/, /sonar/, /perplexity\//] }, { Icon: markRaw(LogoDeepSeek), keywords: [/deepseek/] }, { Icon: markRaw(LogoClaude), keywords: [/claude/] }, { Icon: markRaw(LogoAnthropic), keywords: [/anthropic/], }, { Icon: markRaw(LogoMorph), keywords: [/^morph-/, /\/morph-/] }, { Icon: markRaw(LogoNousResearch), keywords: [/deephermes/, /hermes/, /genstruct/, /minos/] }, { Icon: markRaw(LogoAi21), keywords: [/jamba/, /^j2/, /ai21/] }, { Icon: markRaw(LogoWenxin), keywords: [/ernie/, /irag/] }, { Icon: markRaw(LogoBaiduCloud), keywords: [/baidu/, /qianfan/] }, { Icon: markRaw(LogoMinimax), keywords: [/minimax/, /abab/, /^image-/] }, { Icon: markRaw(LogoNova), keywords: [/^nova-/, /\/nova-/] }, { Icon: markRaw(LogoByteDance), keywords: [/bytedance/, /skylark/, /seed-/] }, { Icon: markRaw(LogoLiquid), keywords: [/liquid/, /lfm/] }, { Icon: markRaw(LogoPaLM), keywords: [/palm/] }, { Icon: markRaw(LogoUpstage), keywords: [/^solar-/, /\/solar/] }, { Icon: markRaw(LogoStepfun), keywords: [/step/] }, { Icon: markRaw(LogoXiaomiMiMo), keywords: [/^mimo-/, /\/mimo-/] }, { Icon: markRaw(LogoRelace), keywords: [/^relace-/, /\/relace-/] }, { Icon: markRaw(LogoEssentialAI), keywords: [/^rnj-/, /\/rnj-/] }, { Icon: markRaw(LogoKwaipilot), keywords: [/kat-/] }, { Icon: markRaw(LogoIBM), keywords: [/ibm/, /granite/] }, { Icon: markRaw(LogoInternLM), keywords: [/internlm/, /internvl/] }, { Icon: markRaw(LogoLongCat), keywords: [/longcat/] }, { Icon: markRaw(LogoHunyuan), keywords: [/hunyuan/] }, { Icon: markRaw(LogoInception), keywords: [/^inception\//, /^mercury/, /\/mercury/] }, { Icon: markRaw(LogoAya), keywords: [/aya/] }, { Icon: markRaw(LogoCohere), keywords: [/command/, /cohere\//] }, { Icon: markRaw(LogoAionLabs), keywords: [/aion-/] }, { Icon: markRaw(LogoMicrosoft), keywords: [/wizardlm/, /phi-/, /^phi-/, /-phi-/, /mai-/, /microsoft/] }, { Icon: markRaw(LogoInflection), keywords: [/inflection-/, /^inflection\//] } ]; export const providerIcons: Record = { ollama: markRaw(LogoOllama), google: markRaw(LogoGoogle), openai: markRaw(LogoOpenAI), azure: null, anthropic: markRaw(LogoAnthropic), cohere: markRaw(LogoCohere), huggingface: null, openrouter: markRaw(LogoOpenrouter), cerebras: markRaw(LogoCerebras), longcat: markRaw(LogoLongCat), inception: markRaw(LogoInception), mistral: markRaw(LogoMistral), vllm: markRaw(LogoVllm), closedrouter: markRaw(LogoClosedRouter), nvidia: markRaw(LogoNvidia), xiaomi: markRaw(LogoXiaomiMiMo), }; export function getModelConfig(modelId: string) { const cleanId = modelId.toLowerCase(); const match = MODEL_MAPPINGS.find(cfg => cfg.keywords.some(regex => regex.test(cleanId)) ); return match || { Icon: null, props: {} }; }