import { App, Button, Input, Switch } from "antd"; import { Plus, Save, ShieldAlert, Trash2 } from "lucide-react"; import { useEffect, useState } from "react"; import { getAdminResponseInterceptionSetting, updateAdminResponseInterceptionSetting, type ResponseInterceptionRule } from "@/services/api/response-interception"; import { AdminPageFrame } from "../components/admin-shell"; import { AdminStatusBadge, SettingsSectionCard } from "../components/admin-ui"; const emptyRule = (): ResponseInterceptionRule => ({ contains: "", replace: "" }); export default function ResponseInterceptionSettingsPage() { const { message } = App.useApp(); const [enabled, setEnabled] = useState(false); const [rules, setRules] = useState([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); useEffect(() => { let cancelled = false; void getAdminResponseInterceptionSetting() .then(({ setting }) => { if (cancelled) return; setEnabled(setting.enabled); setRules(setting.rules || []); }) .catch((error) => { if (!cancelled) message.error(error instanceof Error ? error.message : "读取模型响应拦截配置失败"); }) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, [message]); const updateRule = (index: number, field: keyof ResponseInterceptionRule, value: string) => { setRules((current) => current.map((rule, ruleIndex) => (ruleIndex === index ? { ...rule, [field]: value } : rule))); }; const save = async () => { const normalizedRules = rules.map((rule) => ({ contains: rule.contains.trim(), replace: rule.replace.trim() })); const invalidIndex = normalizedRules.findIndex((rule) => !rule.contains || !rule.replace); if (invalidIndex >= 0) { message.error(`请完整填写第 ${invalidIndex + 1} 条规则`); return; } setSaving(true); try { const { setting } = await updateAdminResponseInterceptionSetting({ enabled, rules: normalizedRules }); setEnabled(setting.enabled); setRules(setting.rules || []); message.success("模型响应拦截配置已保存"); } catch (error) { message.error(error instanceof Error ? error.message : "保存模型响应拦截配置失败"); } finally { setSaving(false); } }; return (
} title="用户可见错误" status={} footer={ <>
启用拦截规则
} >
上游响应包含 替换为
{rules.map((rule, index) => (
updateRule(index, "contains", event.target.value)} placeholder="例如:余额不足、429" /> updateRule(index, "replace", event.target.value)} placeholder="例如:网络异常,请重试" />
))}
); }