返回 VideoClaw
modelRegistry.ts
根目录 / video-claw / video-claw / frontend / lib / modelRegistry.ts
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
45 lines TYPESCRIPT