| 1 | import type { ProviderGroup } from '@/config/models'; |
| 2 | import { fetchApiModels } from '@/lib/workflowApi'; |
| 3 | |
| 4 | const PROVIDER_LABELS: Record<string, string> = { |
| 5 | dashscope: 'DashScope', |
| 6 | ark: 'ARK (Volcengine)', |
| 7 | deepseek: 'DeepSeek', |
| 8 | openai: 'OpenAI', |
| 9 | gemini: 'Gemini', |
| 10 | kling: 'Kling', |
| 11 | }; |
| 12 | |
| 13 | export function groupModelOptions( |
| 14 | models: Array<{ id: string; label?: string; provider?: string }>, |
| 15 | ): ProviderGroup[] { |
| 16 | const groups = new Map<string, ProviderGroup>(); |
| 17 | for (const model of models) { |
| 18 | const provider = model.provider || 'unknown'; |
| 19 | if (!groups.has(provider)) { |
| 20 | groups.set(provider, { |
| 21 | provider, |
| 22 | label: PROVIDER_LABELS[provider] || provider, |
| 23 | models: [], |
| 24 | }); |
| 25 | } |
| 26 | groups.get(provider)!.models.push({ |
| 27 | id: model.id, |
| 28 | label: model.label || model.id, |
| 29 | }); |
| 30 | } |
| 31 | return Array.from(groups.values()); |
| 32 | } |
| 33 | |
| 34 | export async function fetchModelGroupsByType( |
| 35 | modelType: 'llm' | 'vlm' | 't2i' | 'i2i' | 'video', |
| 36 | ): Promise<ProviderGroup[]> { |
| 37 | const models = await fetchApiModels({ modelType }); |
| 38 | return groupModelOptions(models); |
| 39 | } |
| 40 | |
| 41 | export async function fetchVideoModelGroupsByAbility(ability: string): Promise<ProviderGroup[]> { |
| 42 | const models = await fetchApiModels({ mediaType: 'video', ability, verifiedOnly: true }); |
| 43 | return groupModelOptions(models); |
| 44 | } |
| 45 |