From a8ccaf684709b6d46fab16bf23ce78db6a89d400 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Thu, 17 Oct 2024 13:44:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Agents=20=E9=A1=B5=E9=9D=A2=E6=94=B9?= =?UTF-8?q?=E7=89=88=20#198?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/App.tsx | 2 + src/renderer/src/components/app/Sidebar.tsx | 2 +- src/renderer/src/hooks/useAgents.ts | 11 ++ src/renderer/src/i18n/en-us.json | 3 +- src/renderer/src/i18n/zh-cn.json | 3 +- src/renderer/src/i18n/zh-tw.json | 3 +- .../src/pages/agents/AgentEditPage.tsx | 157 ++++++++++++++++++ src/renderer/src/pages/agents/AgentsPage.tsx | 69 +++----- .../pages/agents/components/AddAgentPopup.tsx | 40 +---- .../agents/components/ManageAgentsPopup.tsx | 109 ------------ .../src/pages/agents/components/MyAgents.tsx | 98 +++++++++++ .../pages/agents/components/UserAgents.tsx | 57 ------- 12 files changed, 309 insertions(+), 245 deletions(-) create mode 100644 src/renderer/src/pages/agents/AgentEditPage.tsx delete mode 100644 src/renderer/src/pages/agents/components/ManageAgentsPopup.tsx create mode 100644 src/renderer/src/pages/agents/components/MyAgents.tsx delete mode 100644 src/renderer/src/pages/agents/components/UserAgents.tsx diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 030473a2..c0a4cc0c 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -9,6 +9,7 @@ import Sidebar from './components/app/Sidebar' import TopViewContainer from './components/TopView' import AntdProvider from './context/AntdProvider' import { ThemeProvider } from './context/ThemeProvider' +import AgentEditPage from './pages/agents/AgentEditPage' import AgentsPage from './pages/agents/AgentsPage' import AppsPage from './pages/apps/AppsPage' import FilesPage from './pages/files/FilesPage' @@ -30,6 +31,7 @@ function App(): JSX.Element { } /> } /> } /> + } /> } /> } /> } /> diff --git a/src/renderer/src/components/app/Sidebar.tsx b/src/renderer/src/components/app/Sidebar.tsx index 4c12316b..27b02277 100644 --- a/src/renderer/src/components/app/Sidebar.tsx +++ b/src/renderer/src/components/app/Sidebar.tsx @@ -54,7 +54,7 @@ const Sidebar: FC = () => { to('/agents')}> - + diff --git a/src/renderer/src/hooks/useAgents.ts b/src/renderer/src/hooks/useAgents.ts index 2e91c846..87a4753b 100644 --- a/src/renderer/src/hooks/useAgents.ts +++ b/src/renderer/src/hooks/useAgents.ts @@ -15,3 +15,14 @@ export function useAgents() { updateAgents: (agents: Agent[]) => dispatch(updateAgents(agents)) } } + +export function useAgent(id: string) { + const agents = useSelector((state: RootState) => state.agents.agents) + const dispatch = useDispatch() + const agent = agents.find((a) => a.id === id) + + return { + agent, + updateAgent: (agent: Agent) => dispatch(updateAgent(agent)) + } +} diff --git a/src/renderer/src/i18n/en-us.json b/src/renderer/src/i18n/en-us.json index 77c1159b..7f65d0a1 100644 --- a/src/renderer/src/i18n/en-us.json +++ b/src/renderer/src/i18n/en-us.json @@ -28,7 +28,8 @@ "warning": "Warning", "back": "Back", "chat": "Chat", - "close": "Close" + "close": "Close", + "cancel": "Cancel" }, "button": { "add": "Add", diff --git a/src/renderer/src/i18n/zh-cn.json b/src/renderer/src/i18n/zh-cn.json index 26507c6a..784ab0d8 100644 --- a/src/renderer/src/i18n/zh-cn.json +++ b/src/renderer/src/i18n/zh-cn.json @@ -28,7 +28,8 @@ "warning": "警告", "back": "返回", "chat": "聊天", - "close": "关闭" + "close": "关闭", + "cancel": "取消" }, "button": { "add": "添加", diff --git a/src/renderer/src/i18n/zh-tw.json b/src/renderer/src/i18n/zh-tw.json index 1a332115..f136458f 100644 --- a/src/renderer/src/i18n/zh-tw.json +++ b/src/renderer/src/i18n/zh-tw.json @@ -28,7 +28,8 @@ "warning": "警告", "back": "返回", "chat": "聊天", - "close": "關閉" + "close": "關閉", + "cancel": "取消" }, "button": { "add": "添加", diff --git a/src/renderer/src/pages/agents/AgentEditPage.tsx b/src/renderer/src/pages/agents/AgentEditPage.tsx new file mode 100644 index 00000000..15856523 --- /dev/null +++ b/src/renderer/src/pages/agents/AgentEditPage.tsx @@ -0,0 +1,157 @@ +import { LoadingOutlined, ThunderboltOutlined } from '@ant-design/icons' +import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' +import EmojiPicker from '@renderer/components/EmojiPicker' +import { useAgent, useAgents } from '@renderer/hooks/useAgents' +import { fetchGenerate } from '@renderer/services/api' +import { syncAgentToAssistant } from '@renderer/services/assistant' +import { Agent } from '@renderer/types' +import { getLeadingEmoji } from '@renderer/utils' +import { Button, Form, FormInstance, Input, Popover } from 'antd' +import TextArea from 'antd/es/input/TextArea' +import { FC, useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { useNavigate, useParams } from 'react-router' +import styled from 'styled-components' + +type FieldType = { + id: string + name: string + prompt: string +} + +const AgentEditPage: FC = () => { + const { t } = useTranslation() + const { id } = useParams() + const { agent } = useAgent(id!) + const [form] = Form.useForm() + const formRef = useRef(null) + const { addAgent, updateAgent } = useAgents() + const [emoji, setEmoji] = useState(agent?.emoji) + const [loading, setLoading] = useState(false) + const navigate = useNavigate() + + const onFinish = (values: FieldType) => { + const _emoji = emoji || getLeadingEmoji(values.name) + + if (values.name.trim() === '' || values.prompt.trim() === '') { + return + } + + const _agent = { + ...agent, + name: values.name, + emoji: _emoji, + prompt: values.prompt + } as Agent + + updateAgent(_agent) + syncAgentToAssistant(_agent) + + navigate(-1) + } + + const handleButtonClick = async () => { + const prompt = `你是一个专业的 prompt 优化助手,我会给你一段prompt,你需要帮我优化它,仅回复优化后的 prompt 不要添加任何解释,使用 [CRISPE提示框架] 回复。` + + const name = formRef.current?.getFieldValue('name') + const content = formRef.current?.getFieldValue('prompt') + const promptText = content || name + + if (!promptText) { + return + } + + if (content) { + navigator.clipboard.writeText(content) + } + + setLoading(true) + + try { + const prefixedContent = `请帮我优化下面这段 prompt,使用 CRISPE 提示框架,请使用 Markdown 格式回复,不要使用 codeblock: ${promptText}` + const generatedText = await fetchGenerate({ prompt, content: prefixedContent }) + formRef.current?.setFieldValue('prompt', generatedText) + } catch (error) { + console.error('Error fetching data:', error) + } + + setLoading(false) + } + + useEffect(() => { + if (agent) { + form.setFieldsValue({ + name: agent.name, + prompt: agent.prompt + }) + } + }, [agent, form]) + + return ( + + + {t('agents.edit.title')} + + +
+ + } arrow placement="rightBottom"> + + + + + + +
+ +