import { Tag } from "antd"; import { AudioLines, Check, Film, Image, MessageSquareText } from "lucide-react"; import { ModelIcon } from "@/components/model-picker"; import { cn } from "@/lib/utils"; import { filterModelsByCapability, modelDisplayName, modelOptionName, resolveModelChannel, type AiConfig, type ModelCapability, } from "@/stores/use-config-store"; import { useUserStore } from "@/stores/use-user-store"; type DefaultModelKey = "imageModel" | "videoModel" | "textModel" | "audioModel"; const groups: Array<{ capability: ModelCapability; modelKey: DefaultModelKey; title: string; description: string; icon: typeof Image; }> = [ { capability: "image", modelKey: "imageModel", title: "默认生图模型", description: "图片生成、图像编辑与视觉探索", icon: Image }, { capability: "video", modelKey: "videoModel", title: "默认视频模型", description: "文生视频、图生视频与镜头延展", icon: Film }, { capability: "text", modelKey: "textModel", title: "默认文本模型", description: "提示词改写、脚本与结构化文本", icon: MessageSquareText }, { capability: "audio", modelKey: "audioModel", title: "默认音频模型", description: "语音、音效与音乐生成", icon: AudioLines }, ]; export function ModelDefaultGrid({ config, onChange }: { config: AiConfig; onChange: (key: DefaultModelKey, model: string) => void }) { const creditsEnabled = useUserStore((state) => state.features.creditsEnabled); return (
{groups.map((group) => { const models = filterModelsByCapability(config.models, group.capability, config.channels); const Icon = group.icon; return (

{group.title}

{group.description}

{models.length} 个可用
{models.length ? (
{models.map((model) => { const channel = resolveModelChannel(config, model); const selected = config[group.modelKey] === model; const cost = channel.modelCosts?.find((item) => item.model === modelOptionName(model)); return ( ); })}
) : (
当前渠道中没有可用的{capabilityLabel(group.capability)}模型
)}
); })}
); } function capabilityLabel(capability: ModelCapability) { return { image: "图片", video: "视频", text: "文本", audio: "音频" }[capability]; } function formatPrice(microcredits: number) { return (microcredits / 1_000_000).toLocaleString("zh-CN", { maximumFractionDigits: 6 }); }