"use client"; import { Save } from "lucide-react"; import { Button } from "@/components/ui/Button"; import { SectionHeader } from "@/components/ui/SectionHeader"; import { Select } from "@/components/ui/Select"; import { StatusNote } from "@/components/ui/StatusNote"; import { TextInput } from "@/components/ui/TextInput"; import { KNOWN_PROVIDERS, TIER_LABELS, type RoutingDraft, } from "@/lib/settings/providers"; // 档位路由「模型」输入框的候选 model id(datalist 建议,仍可自由输入)。按 provider 分组。 const MODEL_SUGGESTIONS: Record = { anthropic: ["claude-opus-4", "claude-sonnet-4", "claude-3-5-haiku"], deepseek: ["deepseek-chat", "deepseek-reasoner"], kimi: ["moonshot-v1-128k", "moonshot-v1-32k", "kimi-k2"], openai: ["gpt-4o", "gpt-4o-mini", "o3-mini"], qwen: ["qwen-max", "qwen-plus", "qwen-turbo"], glm: ["glm-4-plus", "glm-4-air", "glm-4-flash"], gemini: ["gemini-2.0-flash", "gemini-1.5-pro"], "kimi-code-key": ["kimi-for-coding"], "kimi-code": ["kimi-for-coding"], }; interface RoutingPanelProps { routing: RoutingDraft[]; saving: boolean; onProviderChange: (tier: string, providerId: string) => void; onModelChange: (tier: string, model: string) => void; onSave: () => void; } // 能力档位路由面板:写手/分析/轻量三档各指向一个 provider+model(UX §6.10)。 export function RoutingPanel({ routing, saving, onProviderChange, onModelChange, onSave, }: RoutingPanelProps) { return (
写章、审稿和摘要提炼会分别读取对应档位;未完整填写的行不会覆盖现有路由。
    {routing.map((row) => ( ))}
); } interface RoutingRowProps { row: RoutingDraft; onProviderChange: (tier: string, providerId: string) => void; onModelChange: (tier: string, model: string) => void; } function RoutingRow({ row, onProviderChange, onModelChange }: RoutingRowProps) { const tierLabel = TIER_LABELS[row.tier] ?? row.tier; return (
  • {tierLabel}
    onModelChange(row.tier, e.target.value)} placeholder="model" className="w-full font-mono" list={`route-models-${row.tier}`} /> {(MODEL_SUGGESTIONS[row.provider] ?? []).map((m) => (
  • ); }