From 3cf6855dfe16229448898194213a446379278a3a Mon Sep 17 00:00:00 2001 From: sp mac bookpro 2605 Date: Mon, 1 Jun 2026 13:06:32 +0800 Subject: [PATCH] refactor: split AgentEditor into module files; remove redundant local images --- .gitignore | 1 + public/avatars/avatar-01.png | Bin 7637 -> 0 bytes public/avatars/avatar-02.png | Bin 7614 -> 0 bytes public/avatars/avatar-03.png | Bin 7232 -> 0 bytes public/avatars/avatar-04.png | Bin 6506 -> 0 bytes public/avatars/avatar-05.png | Bin 11776 -> 0 bytes public/avatars/avatar-06.png | Bin 7424 -> 0 bytes public/avatars/avatar-07.png | Bin 9172 -> 0 bytes public/avatars/avatar-08.png | Bin 7039 -> 0 bytes public/avatars/avatar-09.png | Bin 7479 -> 0 bytes public/avatars/avatar-10.png | Bin 8595 -> 0 bytes public/avatars/avatar-11.png | Bin 8132 -> 0 bytes public/avatars/avatar-12.png | Bin 9115 -> 0 bytes public/default_bot_icon.jpg | Bin 6549 -> 0 bytes src/pages/AgentEditor.tsx | 1039 ----------------- .../AgentEditor/components/AvatarSelector.tsx | 66 ++ .../components/CapabilitySettings.tsx | 287 +++++ src/pages/AgentEditor/components/Header.tsx | 61 + .../AgentEditor/components/InitModal.tsx | 231 ++++ .../components/ModelCheckboxDropdown.tsx | 64 + .../AgentEditor/components/PreviewPane.tsx | 38 + .../AgentEditor/components/PromptEditor.tsx | 60 + src/pages/AgentEditor/constants.ts | 41 + src/pages/AgentEditor/hooks/useAgentEditor.ts | 218 ++++ src/pages/AgentEditor/index.tsx | 124 ++ 25 files changed, 1191 insertions(+), 1039 deletions(-) delete mode 100644 public/avatars/avatar-01.png delete mode 100644 public/avatars/avatar-02.png delete mode 100644 public/avatars/avatar-03.png delete mode 100644 public/avatars/avatar-04.png delete mode 100644 public/avatars/avatar-05.png delete mode 100644 public/avatars/avatar-06.png delete mode 100644 public/avatars/avatar-07.png delete mode 100644 public/avatars/avatar-08.png delete mode 100644 public/avatars/avatar-09.png delete mode 100644 public/avatars/avatar-10.png delete mode 100644 public/avatars/avatar-11.png delete mode 100644 public/avatars/avatar-12.png delete mode 100644 public/default_bot_icon.jpg delete mode 100644 src/pages/AgentEditor.tsx create mode 100644 src/pages/AgentEditor/components/AvatarSelector.tsx create mode 100644 src/pages/AgentEditor/components/CapabilitySettings.tsx create mode 100644 src/pages/AgentEditor/components/Header.tsx create mode 100644 src/pages/AgentEditor/components/InitModal.tsx create mode 100644 src/pages/AgentEditor/components/ModelCheckboxDropdown.tsx create mode 100644 src/pages/AgentEditor/components/PreviewPane.tsx create mode 100644 src/pages/AgentEditor/components/PromptEditor.tsx create mode 100644 src/pages/AgentEditor/constants.ts create mode 100644 src/pages/AgentEditor/hooks/useAgentEditor.ts create mode 100644 src/pages/AgentEditor/index.tsx diff --git a/.gitignore b/.gitignore index bb18b22..a5954e1 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ dist .env .env.local tsconfig.tsbuildinfo +.vscode diff --git a/public/avatars/avatar-01.png b/public/avatars/avatar-01.png deleted file mode 100644 index 811b3abf9313f54eea62c8bf9649c3eb08fb6b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7637 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 diff --git a/public/avatars/avatar-03.png b/public/avatars/avatar-03.png deleted file mode 100644 index 6030539e4a78a9eb136490d3b904aa0f4872244d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7232 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

3a-3=vt=RkT@KY>6l(EhNiD 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 DEryca diff --git a/public/avatars/avatar-05.png b/public/avatars/avatar-05.png deleted file mode 100644 index cfed182c1ac4995352c4fb537ccffbe0905b2e56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11776 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 diff --git a/public/avatars/avatar-06.png b/public/avatars/avatar-06.png deleted file mode 100644 index a53ea55cfc4070c1257b7f0a9194e7cb3868f092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7424 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 diff --git a/public/avatars/avatar-07.png b/public/avatars/avatar-07.png deleted file mode 100644 index 7350004b8cb30f1ca561aa278902b726d6367389..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9172 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�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 Ghy5F|rQC=B diff --git a/public/avatars/avatar-11.png b/public/avatars/avatar-11.png deleted file mode 100644 index 60805351e8e88d44b2d85179a57a0f120b48a318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8132 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 diff --git a/public/avatars/avatar-12.png b/public/avatars/avatar-12.png deleted file mode 100644 index 9ec21d6ce56640477b8bcdf09a3c6f3232254d14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9115 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 z 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 diff --git a/src/pages/AgentEditor.tsx b/src/pages/AgentEditor.tsx deleted file mode 100644 index 49508c0..0000000 --- a/src/pages/AgentEditor.tsx +++ /dev/null @@ -1,1039 +0,0 @@ -import { useEffect, useRef, useState } from 'react'; -import { Button, Form, Input, InputNumber, Modal, Upload, App as AntApp, List, Popconfirm, Tag, Switch, Select, Collapse, Checkbox, Dropdown } from 'antd'; -import type { UploadFile } from 'antd/es/upload/interface'; -import { useNavigate, useParams } from 'react-router-dom'; -import { Agent, AgentAPI, ImageAPI, KnowledgeStatus, SkillType, Team, TeamAPI, AiModel, ModelAPI } from '../api'; -import { DEFAULT_RH_40X40_GRAY } from '../constants'; -import SkillEditor from '../components/SkillEditor'; -import McpPanel from '../components/McpPanel'; -import ChatPreview from '../components/ChatPreview'; -import { ArrowLeftOutlined, SaveOutlined, FileTextOutlined, RocketOutlined, ToolOutlined, DatabaseOutlined, SettingOutlined, UploadOutlined, DownOutlined } from '@ant-design/icons'; - -const STATUS_TAG: Record = { - pending: { color: 'default', text: '待处理' }, - indexing: { color: 'processing', text: '索引中…' }, - ready: { color: 'success', text: '已就绪' }, - failed: { color: 'error', text: '失败' }, -}; - -const TYPE_TAG: Record = { - prompt: { color: 'blue', icon: '📝', label: 'Prompt' }, - http: { color: 'green', icon: '🌐', label: 'HTTP' }, - js: { color: 'volcano', icon: '⚙️', label: 'JS' }, -}; - -const DEFAULT_AVATAR = '/default_bot_icon.jpg'; - -const PRESET_AVATARS: string[] = Array.from({ length: 12 }, (_, index) => `/avatars/avatar-${String(index + 1).padStart(2, '0')}.png`); - -const isImageUrl = (url: string) => url?.startsWith('http') || url?.startsWith('/'); -const parseModelSelections = (value?: string | string[]) => - Array.isArray(value) - ? value - : String(value || '') - .split(',') - .map((item) => item.trim()) - .filter(Boolean); - -function ModelCheckboxDropdown({ - value = [], - onChange, - models, -}: { - value?: string[]; - onChange?: (value: string[]) => void; - models: AiModel[]; -}) { - const [open, setOpen] = useState(false); - const summary = value.length ? `${value.length} 个已选` : '选择模型'; - - return ( - ( -

e.stopPropagation()}> - onChange?.(checked.map((item) => String(item)))} - className="agent-model-checkbox-group" - > - {models.map((m) => { - const inputPrice = 2 * m.model_ratio; - const outputPrice = inputPrice * m.completion_ratio; - return ( - -
-
- {m.model_name} - {m.model_name} -
-
- 输入: ${inputPrice.toFixed(2)}/M - 输出: ${outputPrice.toFixed(2)}/M -
-
-
- ); - })} -
-
- )} - > - - - ); -} - -export default function AgentEditor() { - const { id } = useParams(); - const isNew = !id; - const navigate = useNavigate(); - const { message } = AntApp.useApp(); - const [form] = Form.useForm(); - const [initForm] = Form.useForm(); - const [agent, setAgent] = useState(null); - const [saving, setSaving] = useState(false); - const [teams, setTeams] = useState([]); - const [models, setModels] = useState([]); - const [autoSaveStatus, setAutoSaveStatus] = useState<'saved' | 'dirty' | 'saving' | 'error'>('saved'); - const [initModalOpen, setInitModalOpen] = useState(isNew); - const [selectedAvatar, setSelectedAvatar] = useState(DEFAULT_AVATAR); - const [avatarSelectorOpen, setAvatarSelectorOpen] = useState(false); - const [avatarUploading, setAvatarUploading] = useState(false); - - // 监听名称变化以同步头像首字母 - const [agentName, setAgentName] = useState(''); - - // skill editor - const [skillEditorOpen, setSkillEditorOpen] = useState(false); - const [editingSkillId, setEditingSkillId] = useState(null); - - const pollTimer = useRef(null); - const hydratingRef = useRef(false); - - const refresh = async (force = false) => { - if (!id) return; - const data = await AgentAPI.detail(id); - setAgent(data); - if (force || autoSaveStatus !== 'dirty') { - hydratingRef.current = true; - form.setFieldsValue(data); - window.setTimeout(() => { - hydratingRef.current = false; - }, 0); - setAutoSaveStatus('saved'); - setAgentName(data.name); - setSelectedAvatar(data.avatar || DEFAULT_AVATAR); - } - - // 若有索引中文件 → 启动轮询 - const indexing = data.knowledge?.some((k) => k.status === 'pending' || k.status === 'indexing'); - if (indexing && !pollTimer.current) { - pollTimer.current = window.setInterval(refresh, 2000); - } else if (!indexing && pollTimer.current) { - window.clearInterval(pollTimer.current); - pollTimer.current = null; - } - }; - - useEffect(() => { - TeamAPI.list() - .then(setTeams) - .catch(() => setTeams([])); - ModelAPI.list() - .then(setModels) - .catch(() => setModels([])); - if (isNew) { - setInitModalOpen(true); - setSelectedAvatar(DEFAULT_AVATAR); - setAgentName(''); - form.setFieldsValue({ - name: '', - description: '', - prompt: 'You are a helpful AI assistant.', - model: '', - temperature: 0.7, - visibility: 'private', - teamId: null, - }); - } else { - setInitModalOpen(false); - refresh(true); - } - return () => { - if (pollTimer.current) { - window.clearInterval(pollTimer.current); - pollTimer.current = null; - } - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [id]); - - const handleInitConfirm = async () => { - const values = await initForm.validateFields(); - setSaving(true); - try { - const created = await AgentAPI.create({ - ...values, - avatar: selectedAvatar, - prompt: 'You are a helpful AI assistant.', - temperature: 0.7, - visibility: 'private', - }); - message.success('初始化成功'); - setInitModalOpen(false); - navigate(`/agents/${created.id}`, { replace: true }); - } catch (e) { - message.error('创建失败'); - } finally { - setSaving(false); - } - }; - - const handleSave = async (silent = false) => { - if (isNew) return; // 初始弹窗未确认前不触发自动保存 - const values = await form.validateFields(); - if (!silent) setSaving(true); - setAutoSaveStatus('saving'); - try { - await AgentAPI.update(id!, values); - if (!silent) message.success('已保存'); - await refresh(true); - setAutoSaveStatus('saved'); - } catch (e) { - setAutoSaveStatus('error'); - if (!silent) message.error('保存失败'); - } finally { - if (!silent) setSaving(false); - } - }; - - const beforeUploadKnowledge = async (file: UploadFile) => { - if (!id) { - message.warning('请先保存智能体基础信息后再上传'); - return Upload.LIST_IGNORE; - } - try { - await AgentAPI.uploadKnowledge(id, [file as unknown as File]); - message.success(`${file.name} 已上传,正在建索引…`); - refresh(); - } catch (e: any) { - message.error('上传失败:' + (e?.message ?? e)); - } - return Upload.LIST_IGNORE; - }; - - const uploadAvatar = async (file: File) => { - setAvatarUploading(true); - try { - const res = await ImageAPI.upload([file]); - const url = res.files?.[0]?.url; - if (!url) { - throw new Error('未获取到图片地址'); - } - return url; - } finally { - setAvatarUploading(false); - } - }; - - const beforeUploadInitAvatar = async (file: UploadFile) => { - try { - const url = await uploadAvatar(file as unknown as File); - setSelectedAvatar(url); - message.success('头像上传成功'); - } catch (e: any) { - message.error('头像上传失败:' + (e?.message ?? e)); - } - return Upload.LIST_IGNORE; - }; - - const beforeUploadEditAvatar = async (file: UploadFile) => { - if (!id) return Upload.LIST_IGNORE; - try { - const url = await uploadAvatar(file as unknown as File); - await AgentAPI.update(id, { avatar: url }); - message.success('头像已更新'); - setAvatarSelectorOpen(false); - refresh(); - } catch (e: any) { - message.error('头像上传失败:' + (e?.message ?? e)); - } - return Upload.LIST_IGNORE; - }; - - const liveAgent = { ...(agent ?? {}), ...(form.getFieldsValue() as Agent) } as Agent; - const currentName = liveAgent?.name || agentName || '未命名智能体'; - - return ( - <> -
- {/* Header */} -
-
-
-
- - {autoSaveStatus === 'saving' - ? '正在保存...' - : autoSaveStatus === 'dirty' - ? '有未保存更改' - : autoSaveStatus === 'error' - ? '保存失败' - : '已保存'} - - - -
-
- - {/* Main Content */} -
- {/* Left Column: Personalization (System Prompt) */} -
-
-
-
-

个性化

-

定义这个智能体的身份、语气、边界和输出规范,让它更像一个稳定的角色,而不是随机回复的模型。

-
- - - System Prompt - -
- -
-
提示词是这个智能体最重要的灵魂设定
-
可以从身份定位、擅长任务、回应风格、拒答边界和输出格式这五个维度去描述,让预览区的表现更稳定。
-
- -
{ - if (hydratingRef.current) return; - setAutoSaveStatus('dirty'); - }} - > -
-
建议写清楚角色设定、目标用户、语气和回答结构。
-
- - - -
-
-
- 提示:写得越具体,预览区里的回答风格越稳定。 -
-
-
-
- - {/* Middle Column: Capabilities & Basic Info */} -
-
-
-
-

能力与设置

-

这里决定它用什么模型、拥有哪些知识和技能,以及它会以怎样的方式被别人看到。

-
- - - Capability - -
- -
{ - if (hydratingRef.current) return; - setAutoSaveStatus('dirty'); - }} - > -
-
-
setAvatarSelectorOpen(true)} - > - {isImageUrl(agent?.avatar || selectedAvatar) ? ( - avatar - ) : ( - (agentName?.charAt(0) || '?').toUpperCase() - )} -
- 更换形象 -
-
-
-
{currentName}
-
{liveAgent?.description || '补充基础资料后,这里会更像一个完整可运营的产品角色。'}
- -
-
-
- - - - 基础设置 -
- ), - children: ( -
-
-
- 名称、描述和可见性决定了这个智能体如何被理解和管理。 -
-
- - setAgentName(e.target.value)} - style={{ borderRadius: 12, height: 42 }} - /> - - - - -
- - ({ value: t.id, label: t.name }))} - /> - -
-
- ), - }, - ]} - /> - -
-
- - 模型设置 -
-
- ({ value: parseModelSelections(value) })} - normalize={(value) => - Array.isArray(value) ? value.map((item) => String(item).trim()).filter(Boolean).join(', ') : '' - } - > - - - -
-
- - - - 知识库 ({agent?.knowledge?.length ?? 0}) -
- ), - children: ( -
-
- 上传文档以增强 AI 知识 - - - -
- ( - AgentAPI.deleteKnowledge(id!, item.id).then(refresh)} - > - - , - ]} - > -
- {item.originalName} - - {(item.size / 1024).toFixed(1)} KB ·{' '} - - {STATUS_TAG[item.status].text} - - -
-
- )} - /> -
- ), - }, - { - key: 'skills', - collapsible: 'disabled', - label: ( -
- - 技能 & 工具 (开发中) -
- ), - children: null, - } - ]} - /> - -
-
-
- - 联网搜索 -
- - - -
-
启用后,智能体可以在回答时通过 DuckDuckGo 搜索实时信息。
-
- -
-
- - {/* Right Column: Preview */} -
-
-
-
-

预览

-

一边调整人设和能力,一边看对话气质是否符合你的预期。

-
- - - Live Preview - -
-
-
当前预览角色
-
{currentName} 会基于左侧 Prompt 与中栏设置立即更新。你可以直接在这里检查语气、头像和整体观感。
-
-
- -
-
-
- - - {!isNew && ( - setSkillEditorOpen(false)} - onSaved={refresh} - /> - )} - - - navigate('/marketplace')} - footer={null} - width={720} - centered - maskClosable={false} - destroyOnHidden - > -
-
-
- - 第一步 · 定义智能体形象 -
-
先给你的智能体一个更完整的开场
-
先决定它的形象、名字和一句话定位。确认后会进入三栏工作台,继续完成个性化、能力配置和实时预览。
-
- -
-
-
- {isImageUrl(selectedAvatar) ? ( - avatar - ) : ( - (agentName?.charAt(0) || '?').toUpperCase() - )} -
-
-
{agentName || '你的新智能体'}
-
这里会实时映射你输入的名字与选择的形象。
-
-
- -
{ - if (changed.name !== undefined) setAgentName(changed.name); - }} - className="agent-editor-modal-card" - style={{ padding: 20 }} - > - - 智能体名称 - - } - rules={[{ required: true, message: '请输入智能体名称' }]} - > - - - - - 描述(选填) - - } - > - - - -
- {['客服助理', '内容创作', '数据分析', '私人教练'].map((label) => ( - { - // 给 initForm 赋值(因为第一步向导是 initForm,不是主页面的 form) - initForm.setFieldsValue({ description: label }); - }} - style={{ - padding: '6px 10px', - borderRadius: 999, - background: 'var(--color-surface-2)', - color: 'var(--color-text-secondary)', - fontSize: 12.5, - cursor: 'pointer', - transition: 'all 0.2s', - }} - onMouseEnter={(e) => { - e.currentTarget.style.background = 'var(--color-border)'; - e.currentTarget.style.color = 'var(--color-text)'; - }} - onMouseLeave={(e) => { - e.currentTarget.style.background = 'var(--color-surface-2)'; - e.currentTarget.style.color = 'var(--color-text-secondary)'; - }} - > - {label} - - ))} -
- -
- - -
-
-
- -
-
选择你的智能体形象
-
-
默认会使用系统头像,你也可以上传自己的图片替换。
- - - -
-
- {[DEFAULT_AVATAR, ...PRESET_AVATARS].map((url) => ( -
setSelectedAvatar(url)} - className={`relative aspect-square rounded-full cursor-pointer transition-all duration-300 overflow-hidden border-2 ${selectedAvatar === url ? 'scale-110 shadow-lg z-10' : 'border-transparent opacity-70 hover:opacity-100 hover:scale-105'}`} - style={{ borderColor: selectedAvatar === url ? 'var(--color-brand)' : 'transparent' }} - > - preset - {selectedAvatar === url && ( -
-
-
-
-
- )} -
- ))} -
-
-
- - setAvatarSelectorOpen(false)} - footer={null} - width={520} - centered - > -
-
-
点击即可更换
- - - -
-
- {/* 默认与内置图片 */} - {[DEFAULT_AVATAR, ...PRESET_AVATARS].map((url) => ( -
{ - await AgentAPI.update(id!, { avatar: url }); - setAvatarSelectorOpen(false); - refresh(); - }} - className={`relative aspect-square rounded-full cursor-pointer transition-all duration-300 overflow-hidden border-2 ${agent?.avatar === url ? 'scale-110 shadow-lg z-10' : 'border-transparent opacity-70 hover:opacity-100 hover:scale-105'}`} - style={{ borderColor: agent?.avatar === url ? 'var(--color-brand)' : 'transparent' }} - > - preset - {agent?.avatar === url && ( -
-
-
-
-
- )} -
- ))} -
-
- - - ); -} diff --git a/src/pages/AgentEditor/components/AvatarSelector.tsx b/src/pages/AgentEditor/components/AvatarSelector.tsx new file mode 100644 index 0000000..2010a7f --- /dev/null +++ b/src/pages/AgentEditor/components/AvatarSelector.tsx @@ -0,0 +1,66 @@ +import { Modal, Button, Upload } from 'antd'; +import { UploadOutlined } from '@ant-design/icons'; +import { Agent, AgentAPI } from '../../../api'; +import { DEFAULT_AVATAR, PRESET_AVATARS } from '../constants'; + +interface AvatarSelectorProps { + open: boolean; + onCancel: () => void; + agent: Agent | null; + avatarUploading: boolean; + beforeUploadEditAvatar: (file: any) => Promise; + onAvatarChange: () => Promise; +} + +export default function AvatarSelector({ + open, + onCancel, + agent, + avatarUploading, + beforeUploadEditAvatar, + onAvatarChange, +}: AvatarSelectorProps) { + return ( + +
+
+
+ 点击即可更换 +
+ + + +
+
+ {[DEFAULT_AVATAR, ...PRESET_AVATARS].map((url) => ( +
{ + if (!agent?.id) return; + await AgentAPI.update(agent.id, { avatar: url }); + onCancel(); + await onAvatarChange(); + }} + className={`relative aspect-square rounded-full cursor-pointer transition-all duration-300 overflow-hidden border-2 ${agent?.avatar === url ? 'scale-110 shadow-lg z-10' : 'border-transparent opacity-70 hover:opacity-100 hover:scale-105'}`} + style={{ borderColor: agent?.avatar === url ? 'var(--color-brand)' : 'transparent' }} + > + preset + {agent?.avatar === url && ( +
+
+
+
+
+ )} +
+ ))} +
+
+ + ); +} diff --git a/src/pages/AgentEditor/components/CapabilitySettings.tsx b/src/pages/AgentEditor/components/CapabilitySettings.tsx new file mode 100644 index 0000000..c9ad4f7 --- /dev/null +++ b/src/pages/AgentEditor/components/CapabilitySettings.tsx @@ -0,0 +1,287 @@ +import { Form, Input, Select, Collapse, Button, List, Popconfirm, Tag, Switch, InputNumber } from 'antd'; +import { DatabaseOutlined, RocketOutlined, SettingOutlined, ToolOutlined } from '@ant-design/icons'; +import { Agent, Team, AgentAPI } from '../../../api'; +import { STATUS_TAG, isImageUrl, parseModelSelections } from '../constants'; +import ModelCheckboxDropdown from './ModelCheckboxDropdown'; + +interface CapabilitySettingsProps { + form: any; + agent: Agent | null; + teams: Team[]; + models: any[]; + currentName: string; + agentName: string; + selectedAvatar: string; + setAvatarSelectorOpen: (open: boolean) => void; + beforeUploadKnowledge: (file: any) => Promise; + markDirty: () => void; +} + +export default function CapabilitySettings({ + form, + agent, + teams, + models, + currentName, + agentName, + selectedAvatar, + setAvatarSelectorOpen, + beforeUploadKnowledge, + markDirty, +}: CapabilitySettingsProps) { + return ( +
+
+
+
+

能力与设置

+

+ 这里决定它用什么模型、拥有哪些知识和技能,以及它会以怎样的方式被别人看到。 +

+
+ + + Capability + +
+ +
+
+
+
setAvatarSelectorOpen(true)} + > + {isImageUrl(agent?.avatar || selectedAvatar) ? ( + avatar + ) : ( + (agentName?.charAt(0) || '?').toUpperCase() + )} +
+ 更换形象 +
+
+
+
+ {currentName} +
+
+ {agent?.description || '补充基础资料后,这里会更像一个完整可运营的产品角色。'} +
+ +
+
+
+ + + + 基础设置 +
+ ), + children: ( +
+
+
+ 名称、描述和可见性决定了这个智能体如何被理解和管理。 +
+
+ + + + + + +
+ + ({ value: t.id, label: t.name }))} + /> + +
+
+ ), + }, + ]} + /> + +
+
+ + 模型设置 +
+
+ ({ value: parseModelSelections(value) })} + normalize={(value) => + Array.isArray(value) ? value.map((item) => String(item).trim()).filter(Boolean).join(', ') : '' + } + > + + + +
+
+ + + + 知识库 ({agent?.knowledge?.length ?? 0}) +
+ ), + children: ( +
+
+ 上传文档以增强 AI 知识 + { + const files = e.target.files; + if (files) { + for (let i = 0; i < files.length; i++) { + await beforeUploadKnowledge(files[i]); + } + } + }} + /> + +
+ ( + agent && AgentAPI.deleteKnowledge(agent.id, item.id)} + > + + , + ]} + > +
+ {item.originalName} + + {(item.size / 1024).toFixed(1)} KB ·{' '} + + {STATUS_TAG[item.status].text} + + +
+
+ )} + /> +
+ ), + }, + { + key: 'skills', + collapsible: 'disabled', + label: ( +
+ + 技能 & 工具 (开发中) +
+ ), + children: null, + }, + ]} + /> + +
+
+
+ + 联网搜索 +
+ + + +
+
+ 启用后,智能体可以在回答时通过 DuckDuckGo 搜索实时信息。 +
+
+ +
+
+ ); +} diff --git a/src/pages/AgentEditor/components/Header.tsx b/src/pages/AgentEditor/components/Header.tsx new file mode 100644 index 0000000..906af88 --- /dev/null +++ b/src/pages/AgentEditor/components/Header.tsx @@ -0,0 +1,61 @@ +import { Button } from 'antd'; +import { ArrowLeftOutlined, FileTextOutlined, SaveOutlined, RocketOutlined } from '@ant-design/icons'; + +interface HeaderProps { + isNew: boolean; + currentName: string; + navigate: any; + autoSaveStatus: 'saved' | 'dirty' | 'saving' | 'error'; + saving: boolean; + onSave: () => Promise; +} + +export default function Header({ isNew, currentName, navigate, autoSaveStatus, saving, onSave }: HeaderProps) { + return ( +
+
+
+
+ + {autoSaveStatus === 'saving' + ? '正在保存...' + : autoSaveStatus === 'dirty' + ? '有未保存更改' + : autoSaveStatus === 'error' + ? '保存失败' + : '已保存'} + + + +
+
+ ); +} diff --git a/src/pages/AgentEditor/components/InitModal.tsx b/src/pages/AgentEditor/components/InitModal.tsx new file mode 100644 index 0000000..ead6b62 --- /dev/null +++ b/src/pages/AgentEditor/components/InitModal.tsx @@ -0,0 +1,231 @@ +import { Form, Input, Modal, Button, Upload } from 'antd'; +import { RocketOutlined, UploadOutlined } from '@ant-design/icons'; +import { DEFAULT_AVATAR, PRESET_AVATARS, isImageUrl } from '../constants'; + +interface InitModalProps { + open: boolean; + onCancel: () => void; + onConfirm: (values: any) => Promise; + avatarUploading: boolean; + selectedAvatar: string; + setSelectedAvatar: (url: string) => void; + agentName: string; + setAgentName: (name: string) => void; + saving: boolean; + beforeUploadInitAvatar: (file: any) => Promise; +} + +export default function InitModal({ + open, + onCancel, + onConfirm, + avatarUploading, + selectedAvatar, + setSelectedAvatar, + agentName, + setAgentName, + saving, + beforeUploadInitAvatar, +}: InitModalProps) { + const [initForm] = Form.useForm(); + + return ( + +
+
+
+ + 第一步 · 定义智能体形象 +
+
+ 先给你的智能体一个更完整的开场 +
+
+ 先决定它的形象、名字和一句话定位。确认后会进入三栏工作台,继续完成个性化、能力配置和实时预览。 +
+
+ +
+
+
+ {isImageUrl(selectedAvatar) ? ( + avatar + ) : ( + (agentName?.charAt(0) || '?').toUpperCase() + )} +
+
+
+ {agentName || '你的新智能体'} +
+
+ 这里会实时映射你输入的名字与选择的形象。 +
+
+
+ +
{ + if (changed.name !== undefined) setAgentName(changed.name); + }} + className="agent-editor-modal-card" + style={{ padding: 20 }} + > + + 智能体名称 + + } + rules={[{ required: true, message: '请输入智能体名称' }]} + > + + + + + 描述(选填) + + } + > + + + +
+ {['客服助理', '内容创作', '数据分析', '私人教练'].map((label) => ( + initForm.setFieldsValue({ description: label })} + style={{ + padding: '6px 10px', + borderRadius: 999, + background: 'var(--color-surface-2)', + color: 'var(--color-text-secondary)', + fontSize: 12.5, + cursor: 'pointer', + transition: 'all 0.2s', + }} + onMouseEnter={(e) => { + e.currentTarget.style.background = 'var(--color-border)'; + e.currentTarget.style.color = 'var(--color-text)'; + }} + onMouseLeave={(e) => { + e.currentTarget.style.background = 'var(--color-surface-2)'; + e.currentTarget.style.color = 'var(--color-text-secondary)'; + }} + > + {label} + + ))} +
+ +
+ + +
+
+
+ +
+
+ 选择你的智能体形象 +
+
+
+ 默认会使用系统头像,你也可以上传自己的图片替换。 +
+ + + +
+
+ {[DEFAULT_AVATAR, ...PRESET_AVATARS].map((url) => ( +
setSelectedAvatar(url)} + className={`relative aspect-square rounded-full cursor-pointer transition-all duration-300 overflow-hidden border-2 ${selectedAvatar === url ? 'scale-110 shadow-lg z-10' : 'border-transparent opacity-70 hover:opacity-100 hover:scale-105'}`} + style={{ borderColor: selectedAvatar === url ? 'var(--color-brand)' : 'transparent' }} + > + preset + {selectedAvatar === url && ( +
+
+
+
+
+ )} +
+ ))} +
+
+
+ + ); +} diff --git a/src/pages/AgentEditor/components/ModelCheckboxDropdown.tsx b/src/pages/AgentEditor/components/ModelCheckboxDropdown.tsx new file mode 100644 index 0000000..b911757 --- /dev/null +++ b/src/pages/AgentEditor/components/ModelCheckboxDropdown.tsx @@ -0,0 +1,64 @@ +import { useState } from 'react'; +import { Button, Checkbox, Dropdown } from 'antd'; +import { DownOutlined } from '@ant-design/icons'; +import { AiModel } from '../../../api'; +import { DEFAULT_RH_40X40_GRAY } from '../../../constants'; + +interface ModelCheckboxDropdownProps { + value?: string[]; + onChange?: (value: string[]) => void; + models: AiModel[]; +} + +export default function ModelCheckboxDropdown({ value = [], onChange, models }: ModelCheckboxDropdownProps) { + const [open, setOpen] = useState(false); + const summary = value.length ? `${value.length} 个已选` : '选择模型'; + + return ( + ( +
e.stopPropagation()}> + onChange?.(checked.map((item) => String(item)))} + className="agent-model-checkbox-group" + > + {models.map((m) => { + const inputPrice = 2 * m.model_ratio; + const outputPrice = inputPrice * m.completion_ratio; + return ( + +
+
+ {m.model_name} + {m.model_name} +
+
+ 输入: ${inputPrice.toFixed(2)}/M + 输出: ${outputPrice.toFixed(2)}/M +
+
+
+ ); + })} +
+
+ )} + > + +
+ ); +} diff --git a/src/pages/AgentEditor/components/PreviewPane.tsx b/src/pages/AgentEditor/components/PreviewPane.tsx new file mode 100644 index 0000000..a113b03 --- /dev/null +++ b/src/pages/AgentEditor/components/PreviewPane.tsx @@ -0,0 +1,38 @@ +import { RocketOutlined } from '@ant-design/icons'; +import { Agent } from '../../../api'; +import ChatPreview from '../../../components/ChatPreview'; + +interface PreviewPaneProps { + liveAgent: Agent; + agentId?: string; +} + +export default function PreviewPane({ liveAgent, agentId }: PreviewPaneProps) { + return ( +
+
+
+
+

预览

+

+ 一边调整人设和能力,一边看对话气质是否符合你的预期。 +

+
+ + + Live Preview + +
+
+
当前预览角色
+
+ {liveAgent?.name || '未命名智能体'} 会基于左侧 Prompt 与中栏设置立即更新。你可以直接在这里检查语气、头像和整体观感。 +
+
+
+ +
+
+
+ ); +} diff --git a/src/pages/AgentEditor/components/PromptEditor.tsx b/src/pages/AgentEditor/components/PromptEditor.tsx new file mode 100644 index 0000000..d752d26 --- /dev/null +++ b/src/pages/AgentEditor/components/PromptEditor.tsx @@ -0,0 +1,60 @@ +import { Form, Input } from 'antd'; +import { FileTextOutlined } from '@ant-design/icons'; + +interface PromptEditorProps { + form: any; + markDirty: () => void; +} + +export default function PromptEditor({ form, markDirty }: PromptEditorProps) { + return ( +
+
+
+
+

个性化

+

+ 定义这个智能体的身份、语气、边界和输出规范,让它更像一个稳定的角色,而不是随机回复的模型。 +

+
+ + + System Prompt + +
+ +
+
提示词是这个智能体最重要的灵魂设定
+
+ 可以从身份定位、擅长任务、回应风格、拒答边界和输出格式这五个维度去描述,让预览区的表现更稳定。 +
+
+ +
+
+
+ 建议写清楚角色设定、目标用户、语气和回答结构。 +
+
+ + + +
+
+
+ 提示:写得越具体,预览区里的回答风格越稳定。 +
+
+
+
+ ); +} diff --git a/src/pages/AgentEditor/constants.ts b/src/pages/AgentEditor/constants.ts new file mode 100644 index 0000000..9ccaf0a --- /dev/null +++ b/src/pages/AgentEditor/constants.ts @@ -0,0 +1,41 @@ +import { KnowledgeStatus, SkillType } from '../../api'; + +export const DEFAULT_AVATAR = 'https://static.svipdata.com/hoyidata/materials/B7lNeTYQM1_0/materials.jpg'; + +export const PRESET_AVATARS: string[] = [ + 'https://static.svipdata.com/hoyidata/materials/PkM0iQCaAY_0/materials.png', + 'https://static.svipdata.com/hoyidata/materials/tmPDm2FhJY_1/materials.png', + 'https://static.svipdata.com/hoyidata/materials/hNCyP4RvJL_2/materials.png', + 'https://static.svipdata.com/hoyidata/materials/l2OMyoIVff_3/materials.png', + 'https://static.svipdata.com/hoyidata/materials/CINYRp0JJS_4/materials.png', + 'https://static.svipdata.com/hoyidata/materials/oUFVVgRpJa_5/materials.png', + 'https://static.svipdata.com/hoyidata/materials/WZccHWHK40_6/materials.png', + 'https://static.svipdata.com/hoyidata/materials/sLmZKx5GoI_7/materials.png', + 'https://static.svipdata.com/hoyidata/materials/ZPHkYQHOE0_8/materials.png', + 'https://static.svipdata.com/hoyidata/materials/kpMcS2ekGq_9/materials.png', + 'https://static.svipdata.com/hoyidata/materials/1vkwcmV5MC_10/materials.png', + 'https://static.svipdata.com/hoyidata/materials/nLLWLA0eLZ_11/materials.png', +]; + +export const STATUS_TAG: Record = { + pending: { color: 'default', text: '待处理' }, + indexing: { color: 'processing', text: '索引中…' }, + ready: { color: 'success', text: '已就绪' }, + failed: { color: 'error', text: '失败' }, +}; + +export const TYPE_TAG: Record = { + prompt: { color: 'blue', icon: '📝', label: 'Prompt' }, + http: { color: 'green', icon: '🌐', label: 'HTTP' }, + js: { color: 'volcano', icon: '⚙️', label: 'JS' }, +}; + +export const isImageUrl = (url: string) => url?.startsWith('http') || url?.startsWith('/'); + +export const parseModelSelections = (value?: string | string[]) => + Array.isArray(value) + ? value + : String(value || '') + .split(',') + .map((item) => item.trim()) + .filter(Boolean); diff --git a/src/pages/AgentEditor/hooks/useAgentEditor.ts b/src/pages/AgentEditor/hooks/useAgentEditor.ts new file mode 100644 index 0000000..2112699 --- /dev/null +++ b/src/pages/AgentEditor/hooks/useAgentEditor.ts @@ -0,0 +1,218 @@ +import { useEffect, useRef, useState } from 'react'; +import { FormInstance } from 'antd'; +import { Agent, AgentAPI, Team, TeamAPI, AiModel, ModelAPI, ImageAPI } from '../../../api'; +import { DEFAULT_AVATAR } from '../constants'; + +interface UseAgentEditorOptions { + id?: string; + isNew: boolean; + form: FormInstance; + message: any; + navigate: any; +} + +export function useAgentEditor({ id, isNew, form, message, navigate }: UseAgentEditorOptions) { + const [agent, setAgent] = useState(null); + const [saving, setSaving] = useState(false); + const [teams, setTeams] = useState([]); + const [models, setModels] = useState([]); + const [autoSaveStatus, setAutoSaveStatus] = useState<'saved' | 'dirty' | 'saving' | 'error'>('saved'); + const [initModalOpen, setInitModalOpen] = useState(isNew); + const [selectedAvatar, setSelectedAvatar] = useState(DEFAULT_AVATAR); + const [avatarSelectorOpen, setAvatarSelectorOpen] = useState(false); + const [avatarUploading, setAvatarUploading] = useState(false); + const [agentName, setAgentName] = useState(''); + const [skillEditorOpen, setSkillEditorOpen] = useState(false); + const [editingSkillId, setEditingSkillId] = useState(null); + + const pollTimer = useRef(null); + const hydratingRef = useRef(false); + + const refresh = async (force = false) => { + if (!id) return; + const data = await AgentAPI.detail(id); + setAgent(data); + if (force || autoSaveStatus !== 'dirty') { + hydratingRef.current = true; + form.setFieldsValue(data); + window.setTimeout(() => { + hydratingRef.current = false; + }, 0); + setAutoSaveStatus('saved'); + setAgentName(data.name); + setSelectedAvatar(data.avatar || DEFAULT_AVATAR); + } + + const indexing = data.knowledge?.some((k) => k.status === 'pending' || k.status === 'indexing'); + if (indexing && !pollTimer.current) { + pollTimer.current = window.setInterval(refresh, 2000); + } else if (!indexing && pollTimer.current) { + window.clearInterval(pollTimer.current); + pollTimer.current = null; + } + }; + + useEffect(() => { + TeamAPI.list() + .then(setTeams) + .catch(() => setTeams([])); + ModelAPI.list() + .then(setModels) + .catch(() => setModels([])); + if (isNew) { + setInitModalOpen(true); + setSelectedAvatar(DEFAULT_AVATAR); + setAgentName(''); + form.setFieldsValue({ + name: '', + description: '', + prompt: 'You are a helpful AI assistant.', + model: '', + temperature: 0.7, + visibility: 'private', + teamId: null, + }); + } else { + setInitModalOpen(false); + refresh(true); + } + return () => { + if (pollTimer.current) { + window.clearInterval(pollTimer.current); + pollTimer.current = null; + } + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [id]); + + const handleInitConfirm = async (values: any) => { + setSaving(true); + try { + const created = await AgentAPI.create({ + ...values, + avatar: selectedAvatar, + prompt: 'You are a helpful AI assistant.', + temperature: 0.7, + visibility: 'private', + }); + message.success('初始化成功'); + setInitModalOpen(false); + navigate(`/agents/${created.id}`, { replace: true }); + } catch (e) { + message.error('创建失败'); + } finally { + setSaving(false); + } + }; + + const handleSave = async (silent = false) => { + if (isNew) return; + const values = await form.validateFields(); + if (!silent) setSaving(true); + setAutoSaveStatus('saving'); + try { + await AgentAPI.update(id!, values); + if (!silent) message.success('已保存'); + await refresh(true); + setAutoSaveStatus('saved'); + } catch (e) { + setAutoSaveStatus('error'); + if (!silent) message.error('保存失败'); + } finally { + if (!silent) setSaving(false); + } + }; + + const uploadAvatar = async (file: File) => { + setAvatarUploading(true); + try { + const res = await ImageAPI.upload([file]); + const url = res.files?.[0]?.url; + if (!url) { + throw new Error('未获取到图片地址'); + } + return url; + } finally { + setAvatarUploading(false); + } + }; + + const beforeUploadKnowledge = async (file: any) => { + if (!id) { + message.warning('请先保存智能体基础信息后再上传'); + return false; + } + try { + await AgentAPI.uploadKnowledge(id, [file as File]); + message.success(`${file.name} 已上传,正在建索引…`); + refresh(); + } catch (e: any) { + message.error('上传失败:' + (e?.message ?? e)); + } + return false; + }; + + const beforeUploadInitAvatar = async (file: any) => { + try { + const url = await uploadAvatar(file as File); + setSelectedAvatar(url); + message.success('头像上传成功'); + } catch (e: any) { + message.error('头像上传失败:' + (e?.message ?? e)); + } + return false; + }; + + const beforeUploadEditAvatar = async (file: any) => { + if (!id) return false; + try { + const url = await uploadAvatar(file as File); + await AgentAPI.update(id, { avatar: url }); + message.success('头像已更新'); + setAvatarSelectorOpen(false); + refresh(); + } catch (e: any) { + message.error('头像上传失败:' + (e?.message ?? e)); + } + return false; + }; + + const liveAgent = { ...(agent ?? {}), ...(form.getFieldsValue() as Agent) } as Agent; + const currentName = liveAgent?.name || agentName || '未命名智能体'; + + const markDirty = () => { + if (hydratingRef.current) return; + setAutoSaveStatus('dirty'); + }; + + return { + agent, + saving, + teams, + models, + autoSaveStatus, + initModalOpen, + setInitModalOpen, + selectedAvatar, + setSelectedAvatar, + avatarSelectorOpen, + setAvatarSelectorOpen, + avatarUploading, + agentName, + setAgentName, + skillEditorOpen, + setSkillEditorOpen, + editingSkillId, + setEditingSkillId, + hydratingRef, + refresh, + handleInitConfirm, + handleSave, + beforeUploadKnowledge, + beforeUploadInitAvatar, + beforeUploadEditAvatar, + liveAgent, + currentName, + markDirty, + }; +} diff --git a/src/pages/AgentEditor/index.tsx b/src/pages/AgentEditor/index.tsx new file mode 100644 index 0000000..4ed5393 --- /dev/null +++ b/src/pages/AgentEditor/index.tsx @@ -0,0 +1,124 @@ +import { useEffect, useRef, useState } from 'react'; +import { Form } from 'antd'; +import { useNavigate, useParams } from 'react-router-dom'; +import { App as AntApp } from 'antd'; +import SkillEditor from '../../components/SkillEditor'; +import { useAgentEditor } from './hooks/useAgentEditor'; +import Header from './components/Header'; +import PromptEditor from './components/PromptEditor'; +import CapabilitySettings from './components/CapabilitySettings'; +import PreviewPane from './components/PreviewPane'; +import InitModal from './components/InitModal'; +import AvatarSelector from './components/AvatarSelector'; + +export default function AgentEditor() { + const { id } = useParams(); + const isNew = !id; + const navigate = useNavigate(); + const { message } = AntApp.useApp(); + const [form] = Form.useForm(); + const pollTimer = useRef(null); + + const { + agent, + saving, + teams, + models, + autoSaveStatus, + initModalOpen, + setInitModalOpen, + selectedAvatar, + setSelectedAvatar, + avatarSelectorOpen, + setAvatarSelectorOpen, + avatarUploading, + agentName, + setAgentName, + skillEditorOpen, + setSkillEditorOpen, + editingSkillId, + setEditingSkillId, + refresh, + handleInitConfirm, + handleSave, + beforeUploadKnowledge, + beforeUploadInitAvatar, + beforeUploadEditAvatar, + liveAgent, + currentName, + markDirty, + } = useAgentEditor({ id, isNew, form, message, navigate }); + + useEffect(() => { + return () => { + if (pollTimer.current) { + window.clearInterval(pollTimer.current); + pollTimer.current = null; + } + }; + }, []); + + return ( + <> +
+
+ +
+ + + +
+ + {!isNew && ( + setSkillEditorOpen(false)} + onSaved={refresh} + /> + )} +
+ + navigate('/agents')} + onConfirm={handleInitConfirm} + avatarUploading={avatarUploading} + selectedAvatar={selectedAvatar} + setSelectedAvatar={setSelectedAvatar} + agentName={agentName} + setAgentName={setAgentName} + saving={saving} + beforeUploadInitAvatar={beforeUploadInitAvatar} + /> + + setAvatarSelectorOpen(false)} + agent={agent} + avatarUploading={avatarUploading} + beforeUploadEditAvatar={beforeUploadEditAvatar} + onAvatarChange={refresh} + /> + + ); +}