import { useEffect, useState, useCallback } from 'react'; import { Table, Button, Space, Modal, Form, Input, Select, Tag, message, } from 'antd'; import { PlusOutlined, UndoOutlined, CheckOutlined } from '@ant-design/icons'; import { promptApi, type PromptItem, type CreatePromptReq } from '../../api/ai/prompts'; import { AuthButton } from '../../components/AuthButton'; import { useThemeMode } from '../../hooks/useThemeMode'; const CATEGORIES = [ { value: 'lab_report_interpretation', label: '化验单解读' }, { value: 'health_trend_analysis', label: '趋势分析' }, { value: 'personalized_checkup_plan', label: '体检方案' }, { value: 'report_summary_generation', label: '报告摘要' }, ]; const CATEGORY_MAP: Record = Object.fromEntries( CATEGORIES.map((c) => [c.value, c.label]), ); export default function AiPromptList() { const [data, setData] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(1); const [loading, setLoading] = useState(false); const [categoryFilter, setCategoryFilter] = useState(); const [modalOpen, setModalOpen] = useState(false); const [form] = Form.useForm(); const isDark = useThemeMode(); const fetchData = useCallback( async (p = page) => { setLoading(true); try { const result = await promptApi.list({ page: p, page_size: 20, category: categoryFilter, }); setData(result.data); setTotal(result.total); } catch { message.error('加载 Prompt 列表失败'); } finally { setLoading(false); } }, [page, categoryFilter], ); useEffect(() => { fetchData(); }, [fetchData]); const handleCreate = async (values: CreatePromptReq) => { try { await promptApi.create(values); message.success('Prompt 创建成功'); setModalOpen(false); form.resetFields(); fetchData(); } catch { message.error('创建失败'); } }; const handleActivate = async (id: string) => { try { await promptApi.activate(id); message.success('已激活'); fetchData(); } catch { message.error('激活失败'); } }; const handleRollback = async (id: string) => { try { await promptApi.rollback(id); message.success('已回滚'); fetchData(); } catch { message.error('回滚失败'); } }; const columns = [ { title: '名称', dataIndex: 'name', key: 'name', width: 180, render: (name: string) => {name}, }, { title: '类别', dataIndex: 'category', key: 'category', width: 120, render: (v: string) => ( {CATEGORY_MAP[v] || v} ), }, { title: '版本', dataIndex: 'version', key: 'version', width: 70, render: (v: number) => `v${v}`, }, { title: '状态', dataIndex: 'is_active', key: 'is_active', width: 80, render: (v: boolean) => ( {v ? '启用' : '停用'} ), }, { title: '更新时间', dataIndex: 'updated_at', key: 'updated_at', width: 170, render: (v: string) => (v ? new Date(v).toLocaleString('zh-CN') : '-'), }, { title: '操作', key: 'actions', width: 160, render: (_: unknown, record: PromptItem) => ( {!record.is_active && ( )} ), }, ]; return (

AI Prompt 管理

管理 AI 分析提示词模板和版本