import { useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { useUpdateModelPricing } from "@/lib/query/usage"; import type { ModelPricing } from "@/types/usage"; interface PricingEditModalProps { model: ModelPricing; isNew?: boolean; onClose: () => void; } export function PricingEditModal({ model, isNew = false, onClose, }: PricingEditModalProps) { const { t } = useTranslation(); const updatePricing = useUpdateModelPricing(); const [formData, setFormData] = useState({ modelId: model.modelId, displayName: model.displayName, inputCost: model.inputCostPerMillion, outputCost: model.outputCostPerMillion, cacheReadCost: model.cacheReadCostPerMillion, cacheCreationCost: model.cacheCreationCostPerMillion, }); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); // 验证模型 ID if (isNew && !formData.modelId.trim()) { toast.error(t("usage.modelIdRequired", "模型 ID 不能为空")); return; } // 验证非负数 const values = [ formData.inputCost, formData.outputCost, formData.cacheReadCost, formData.cacheCreationCost, ]; for (const value of values) { const num = parseFloat(value); if (isNaN(num) || num < 0) { toast.error(t("usage.invalidPrice", "价格必须为非负数")); return; } } try { await updatePricing.mutateAsync({ modelId: isNew ? formData.modelId : model.modelId, displayName: formData.displayName, inputCost: formData.inputCost, outputCost: formData.outputCost, cacheReadCost: formData.cacheReadCost, cacheCreationCost: formData.cacheCreationCost, }); toast.success( isNew ? t("usage.pricingAdded", "定价已添加") : t("usage.pricingUpdated", "定价已更新"), ); onClose(); } catch (error) { toast.error(String(error)); } }; return ( {isNew ? t("usage.addPricing", "新增定价") : `${t("usage.editPricing", "编辑定价")} - ${model.modelId}`}
{isNew && (
setFormData({ ...formData, modelId: e.target.value }) } placeholder="例如: claude-3-5-sonnet-20241022" required />
)}
setFormData({ ...formData, displayName: e.target.value }) } placeholder="例如: Claude 3.5 Sonnet" required />
setFormData({ ...formData, inputCost: e.target.value }) } required />
setFormData({ ...formData, outputCost: e.target.value }) } required />
setFormData({ ...formData, cacheReadCost: e.target.value }) } required />
setFormData({ ...formData, cacheCreationCost: e.target.value }) } required />
); }