/** * 教师端 - 创建Agent页面 * 对应原始 index.html 的 create-agent section (4步向导) * 复用原始HTML的4步表单逻辑 */ import { useState, useEffect } from 'react'; import { Steps, Card, Form, Input, Select, Button, Space, Checkbox, message, Row, Col, Modal } from 'antd'; import { InfoCircleOutlined, AppstoreOutlined, DatabaseOutlined, BranchesOutlined, ArrowLeftOutlined, ArrowRightOutlined, CheckOutlined, } from '@ant-design/icons'; import { motion } from 'framer-motion'; import knowledgeService from '../../services/knowledgeService'; import agentService from '../../services/agentService'; import WorkflowEditor from '../../components/WorkflowEditor'; const { TextArea } = Input; const CreateAgent = () => { const [form] = Form.useForm(); const [currentStep, setCurrentStep] = useState(0); const [submitting, setSubmitting] = useState(false); // 创建Agent的loading const [aiGenerating, setAiGenerating] = useState(false); // AI生成工作流的loading const [selectedPlugins, setSelectedPlugins] = useState([]); const [selectedKnowledgeBases, setSelectedKnowledgeBases] = useState([]); const [knowledgeBases, setKnowledgeBases] = useState([]); const [workflow, setWorkflow] = useState(null); const [showWorkflowEditor, setShowWorkflowEditor] = useState(false); // 检查是否是编辑模式 const urlParams = new URLSearchParams(window.location.search); const isEditMode = urlParams.get('mode') === 'edit'; const [editingAgentId, setEditingAgentId] = useState(null); // 保存每个步骤的数据 const [formData, setFormData] = useState({ name: '', description: '', subject: '', instructor: '', type: 'general', }); // 加载知识库列表和编辑数据 useEffect(() => { loadKnowledgeBases(); // 如果是编辑模式,加载agent数据 if (isEditMode) { const editingAgentStr = localStorage.getItem('editingAgent'); if (editingAgentStr) { try { const editingAgent = JSON.parse(editingAgentStr); setEditingAgentId(editingAgent.id); // 设置表单数据 setFormData({ name: editingAgent.name || '', description: editingAgent.description || '', subject: editingAgent.subject || '', instructor: editingAgent.instructor || '', type: editingAgent.type || 'general', }); // 设置表单初始值 form.setFieldsValue({ name: editingAgent.name || '', description: editingAgent.description || '', subject: editingAgent.subject || '', instructor: editingAgent.instructor || '', type: editingAgent.type || 'general', }); // 设置其他数据 setSelectedPlugins(editingAgent.plugins || []); setSelectedKnowledgeBases(editingAgent.knowledgeBases || []); setWorkflow(editingAgent.workflow || null); // 清除localStorage localStorage.removeItem('editingAgent'); } catch (error) { console.error('加载编辑数据失败:', error); } } } }, [isEditMode]); const loadKnowledgeBases = async () => { try { const res = await knowledgeService.getKnowledgeBases(); setKnowledgeBases(res.data || []); } catch (error) { console.error('加载知识库失败:', error); } }; // 可用插件列表(对应原始HTML的插件选项) const availablePlugins = [ { id: 'code', name: '代码执行', icon: '💻', description: '允许学生编写和执行Python代码,实时获取结果', color: '#10b981', }, { id: 'visualization', name: '3D可视化', icon: '📊', description: '生成交互式3D图形,帮助学生理解数学概念', color: '#f97316', }, { id: 'mindmap', name: '思维导图', icon: '🗺️', description: '创建结构化的思维导图,帮助学生梳理知识点', color: '#8b5cf6', }, ]; // Agent类型选项 const agentTypes = [ { value: 'educational', label: '教育辅导' }, { value: 'programming', label: '编程辅助' }, { value: 'math', label: '数学辅导' }, { value: 'general', label: '通用助手' }, ]; // 步骤配置 const steps = [ { title: '基本信息', icon: , }, { title: '插件选择', icon: , }, { title: '知识库', icon: , }, { title: '工作流', icon: , }, ]; // 切换插件选择 const togglePlugin = (pluginId) => { setSelectedPlugins((prev) => prev.includes(pluginId) ? prev.filter((id) => id !== pluginId) : [...prev, pluginId] ); }; // 切换知识库选择 const toggleKnowledgeBase = (kbId) => { setSelectedKnowledgeBases((prev) => prev.includes(kbId) ? prev.filter((id) => id !== kbId) : [...prev, kbId] ); }; // 生成AI工作流 const handleGenerateAIWorkflow = async () => { try { setAiGenerating(true); const values = form.getFieldsValue(); const res = await agentService.generateAIWorkflow({ name: values.name, description: values.description, type: values.type, plugins: selectedPlugins, knowledgeBases: selectedKnowledgeBases, }); if (res.success) { setWorkflow(res.data.workflow); message.success('AI工作流生成成功'); } } catch (error) { message.error('生成工作流失败'); } finally { setAiGenerating(false); } }; // 下一步 const handleNext = async () => { try { // 验证当前步骤的表单 if (currentStep === 0) { await form.validateFields(['name', 'description', 'type']); // 保存第一步的表单数据 const values = form.getFieldsValue(); setFormData({ name: values.name, description: values.description, subject: values.subject || '', // subject 可能为空 instructor: values.instructor || '', // instructor 可能为空 type: values.type, }); } setCurrentStep(currentStep + 1); } catch (error) { message.error('请填写完整信息'); } }; // 上一步 const handlePrev = () => { setCurrentStep(currentStep - 1); // 返回第一步时,恢复表单数据 if (currentStep === 1) { setTimeout(() => { form.setFieldsValue(formData); }, 0); } }; // 提交创建或更新Agent const handleSubmit = async () => { try { setSubmitting(true); const agentData = { name: formData.name, description: formData.description, subject: formData.subject, instructor: formData.instructor, type: formData.type, plugins: selectedPlugins, knowledgeBases: selectedKnowledgeBases, workflow: workflow || { nodes: [], edges: [], }, }; console.log('发送Agent数据:', agentData); let res; if (isEditMode && editingAgentId) { // 更新Agent res = await agentService.updateAgent(editingAgentId, agentData); if (res.success) { message.success('Agent更新成功!'); // 跳转回列表页 window.location.href = '/teacher/agents'; } } else { // 创建新Agent res = await agentService.createAgent(agentData); if (res.success) { message.success('Agent创建成功!'); // 重置表单 form.resetFields(); setCurrentStep(0); setSelectedPlugins([]); setSelectedKnowledgeBases([]); setWorkflow(null); setFormData({ name: '', description: '', subject: '', instructor: '', type: 'general', }); } } if (!res.success) { message.error(res.message || '操作失败'); } } catch (error) { console.error('操作失败:', error); message.error(error.response?.data?.message || '操作失败'); } finally { setSubmitting(false); } }; // 渲染步骤内容 const renderStepContent = () => { switch (currentStep) { case 0: // 步骤1: 基本信息 return (