From 6b0a1a42ad489f84ddf4978450171da9279c14a7 Mon Sep 17 00:00:00 2001 From: icarus Date: Sat, 13 Sep 2025 22:42:57 +0800 Subject: [PATCH] refactor(types): rename Agent type to AssistantPreset for clarity The type was renamed to better reflect its purpose as a preset configuration for assistants rather than representing an active agent. This change improves code readability and maintainability by using more accurate terminology throughout the codebase. --- .../components/Popups/AddAssistantPopup.tsx | 8 +++--- src/renderer/src/hooks/useAgents.ts | 10 ++++---- src/renderer/src/pages/agents/AgentsPage.tsx | 10 ++++---- .../pages/agents/components/AddAgentPopup.tsx | 8 +++--- .../src/pages/agents/components/AgentCard.tsx | 6 ++--- .../agents/components/ImportAgentPopup.tsx | 10 ++++---- src/renderer/src/pages/agents/index.ts | 25 +++++++++++-------- src/renderer/src/services/AssistantService.ts | 4 +-- src/renderer/src/store/agents.ts | 11 ++++---- src/renderer/src/types/index.ts | 2 +- 10 files changed, 50 insertions(+), 44 deletions(-) diff --git a/src/renderer/src/components/Popups/AddAssistantPopup.tsx b/src/renderer/src/components/Popups/AddAssistantPopup.tsx index eecad5ec9c..75759232ee 100644 --- a/src/renderer/src/components/Popups/AddAssistantPopup.tsx +++ b/src/renderer/src/components/Popups/AddAssistantPopup.tsx @@ -5,7 +5,7 @@ import { useTimer } from '@renderer/hooks/useTimer' import { useSystemAgents } from '@renderer/pages/agents' import { createAssistantFromAgent } from '@renderer/services/AssistantService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import { Agent, Assistant } from '@renderer/types' +import { Assistant, AssistantPreset } from '@renderer/types' import { uuid } from '@renderer/utils' import { Divider, Input, InputRef, Modal, Tag } from 'antd' import { take } from 'lodash' @@ -37,7 +37,7 @@ const PopupContainer: React.FC = ({ resolve }) => { const { setTimeoutTimer } = useTimer() const agents = useMemo(() => { - const allAgents = [...userAgents, ...systemAgents] as Agent[] + const allAgents = [...userAgents, ...systemAgents] as AssistantPreset[] const list = [defaultAssistant, ...allAgents.filter((agent) => !assistants.map((a) => a.id).includes(agent.id))] const filtered = searchText ? list.filter( @@ -48,7 +48,7 @@ const PopupContainer: React.FC = ({ resolve }) => { : list if (searchText.trim()) { - const newAgent: Agent = { + const newAgent: AssistantPreset = { id: 'new', name: searchText.trim(), prompt: '', @@ -67,7 +67,7 @@ const PopupContainer: React.FC = ({ resolve }) => { }, [agents.length, searchText]) const onCreateAssistant = useCallback( - async (agent: Agent) => { + async (agent: AssistantPreset) => { if (loadingRef.current) { return } diff --git a/src/renderer/src/hooks/useAgents.ts b/src/renderer/src/hooks/useAgents.ts index 238f04ec5c..dc1e02994e 100644 --- a/src/renderer/src/hooks/useAgents.ts +++ b/src/renderer/src/hooks/useAgents.ts @@ -1,6 +1,6 @@ import { useAppDispatch, useAppSelector } from '@renderer/store' import { addAgent, removeAgent, updateAgent, updateAgents, updateAgentSettings } from '@renderer/store/agents' -import { Agent, AssistantSettings } from '@renderer/types' +import { AssistantPreset, AssistantSettings } from '@renderer/types' export function useAgents() { const agents = useAppSelector((state) => state.agents.agents) @@ -8,19 +8,19 @@ export function useAgents() { return { agents, - updateAgents: (agents: Agent[]) => dispatch(updateAgents(agents)), - addAgent: (agent: Agent) => dispatch(addAgent(agent)), + updateAgents: (agents: AssistantPreset[]) => dispatch(updateAgents(agents)), + addAgent: (agent: AssistantPreset) => dispatch(addAgent(agent)), removeAgent: (id: string) => dispatch(removeAgent({ id })) } } export function useAgent(id: string) { - const agent = useAppSelector((state) => state.agents.agents.find((a) => a.id === id) as Agent) + const agent = useAppSelector((state) => state.agents.agents.find((a) => a.id === id) as AssistantPreset) const dispatch = useAppDispatch() return { agent, - updateAgent: (agent: Agent) => dispatch(updateAgent(agent)), + updateAgent: (agent: AssistantPreset) => dispatch(updateAgent(agent)), updateAgentSettings: (settings: Partial) => { dispatch(updateAgentSettings({ assistantId: agent.id, settings })) } diff --git a/src/renderer/src/pages/agents/AgentsPage.tsx b/src/renderer/src/pages/agents/AgentsPage.tsx index ccf5197157..7fed6089d2 100644 --- a/src/renderer/src/pages/agents/AgentsPage.tsx +++ b/src/renderer/src/pages/agents/AgentsPage.tsx @@ -7,7 +7,7 @@ import CustomTag from '@renderer/components/Tags/CustomTag' import { useAgents } from '@renderer/hooks/useAgents' import { useNavbarPosition } from '@renderer/hooks/useSettings' import { createAssistantFromAgent } from '@renderer/services/AssistantService' -import { Agent } from '@renderer/types' +import { AssistantPreset } from '@renderer/types' import { uuid } from '@renderer/utils' import { Button, Empty, Flex, Input } from 'antd' import { omit } from 'lodash' @@ -28,7 +28,7 @@ const AgentsPage: FC = () => { const [search, setSearch] = useState('') const [searchInput, setSearchInput] = useState('') const [activeGroup, setActiveGroup] = useState('我的') - const [agentGroups, setAgentGroups] = useState>({}) + const [agentGroups, setAgentGroups] = useState>({}) const [isSearchExpanded, setIsSearchExpanded] = useState(false) const systemAgents = useSystemAgents() const { agents: userAgents } = useAgents() @@ -40,7 +40,7 @@ const AgentsPage: FC = () => { 我的: userAgents, 精选: [], ...systemAgentsGroupList - } as Record + } as Record setAgentGroups(agentsGroupList) }, [systemAgents, userAgents]) @@ -49,7 +49,7 @@ const AgentsPage: FC = () => { if (!search.trim()) { return agentGroups[activeGroup] || [] } - const uniqueAgents = new Map() + const uniqueAgents = new Map() Object.entries(agentGroups).forEach(([, agents]) => { agents.forEach((agent) => { if ( @@ -66,7 +66,7 @@ const AgentsPage: FC = () => { const { t, i18n } = useTranslation() const onAddAgentConfirm = useCallback( - (agent: Agent) => { + (agent: AssistantPreset) => { window.modal.confirm({ title: agent.name, content: ( diff --git a/src/renderer/src/pages/agents/components/AddAgentPopup.tsx b/src/renderer/src/pages/agents/components/AddAgentPopup.tsx index 2550e82f11..8919fa66e5 100644 --- a/src/renderer/src/pages/agents/components/AddAgentPopup.tsx +++ b/src/renderer/src/pages/agents/components/AddAgentPopup.tsx @@ -11,7 +11,7 @@ import { fetchGenerate } from '@renderer/services/ApiService' import { getDefaultModel } from '@renderer/services/AssistantService' import { estimateTextTokens } from '@renderer/services/TokenService' import { useAppSelector } from '@renderer/store' -import { Agent, KnowledgeBase } from '@renderer/types' +import { AssistantPreset, KnowledgeBase } from '@renderer/types' import { getLeadingEmoji, uuid } from '@renderer/utils' import { Button, Form, FormInstance, Input, Modal, Popover, Select, SelectProps } from 'antd' import TextArea from 'antd/es/input/TextArea' @@ -21,7 +21,7 @@ import stringWidth from 'string-width' import styled from 'styled-components' interface Props { - resolve: (data: Agent | null) => void + resolve: (data: AssistantPreset | null) => void } type FieldType = { @@ -77,7 +77,7 @@ const PopupContainer: React.FC = ({ resolve }) => { return } - const _agent: Agent = { + const _agent: AssistantPreset = { id: uuid(), name: values.name, knowledge_bases: values.knowledge_base_ids @@ -272,7 +272,7 @@ export default class AddAgentPopup { TopView.hide('AddAgentPopup') } static show() { - return new Promise((resolve) => { + return new Promise((resolve) => { TopView.show( { diff --git a/src/renderer/src/pages/agents/components/AgentCard.tsx b/src/renderer/src/pages/agents/components/AgentCard.tsx index 020bd35c73..56ecebfc97 100644 --- a/src/renderer/src/pages/agents/components/AgentCard.tsx +++ b/src/renderer/src/pages/agents/components/AgentCard.tsx @@ -3,7 +3,7 @@ import CustomTag from '@renderer/components/Tags/CustomTag' import { useAgents } from '@renderer/hooks/useAgents' import AssistantSettingsPopup from '@renderer/pages/settings/AssistantSettings' import { createAssistantFromAgent } from '@renderer/services/AssistantService' -import type { Agent } from '@renderer/types' +import type { AssistantPreset } from '@renderer/types' import { getLeadingEmoji } from '@renderer/utils' import { Button, Dropdown } from 'antd' import { t } from 'i18next' @@ -14,7 +14,7 @@ import styled from 'styled-components' import ManageAgentsPopup from './ManageAgentsPopup' interface Props { - agent: Agent + agent: AssistantPreset activegroup?: string onClick: () => void getLocalizedGroupName: (group: string) => string @@ -26,7 +26,7 @@ const AgentCard: FC = ({ agent, onClick, activegroup, getLocalizedGroupNa const cardRef = useRef(null) const handleDelete = useCallback( - (agent: Agent) => { + (agent: AssistantPreset) => { window.modal.confirm({ centered: true, content: t('agents.delete.popup.content'), diff --git a/src/renderer/src/pages/agents/components/ImportAgentPopup.tsx b/src/renderer/src/pages/agents/components/ImportAgentPopup.tsx index c2ec140517..25b0e69df3 100644 --- a/src/renderer/src/pages/agents/components/ImportAgentPopup.tsx +++ b/src/renderer/src/pages/agents/components/ImportAgentPopup.tsx @@ -3,14 +3,14 @@ import { useAgents } from '@renderer/hooks/useAgents' import { useTimer } from '@renderer/hooks/useTimer' import { getDefaultModel } from '@renderer/services/AssistantService' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import { Agent } from '@renderer/types' +import { AssistantPreset } from '@renderer/types' import { uuid } from '@renderer/utils' import { Button, Flex, Form, Input, Modal, Radio } from 'antd' import { useState } from 'react' import { useTranslation } from 'react-i18next' interface Props { - resolve: (value: Agent[] | null) => void + resolve: (value: AssistantPreset[] | null) => void } const PopupContainer: React.FC = ({ resolve }) => { @@ -25,7 +25,7 @@ const PopupContainer: React.FC = ({ resolve }) => { const onFinish = async (values: { url?: string }) => { setLoading(true) try { - let agents: Agent[] = [] + let agents: AssistantPreset[] = [] if (importType === 'url') { if (!values.url) { @@ -58,7 +58,7 @@ const PopupContainer: React.FC = ({ resolve }) => { throw new Error(t('agents.import.error.invalid_format')) } - const newAgent: Agent = { + const newAgent: AssistantPreset = { id: uuid(), name: agent.name, emoji: agent.emoji || '🤖', @@ -133,7 +133,7 @@ const PopupContainer: React.FC = ({ resolve }) => { export default class ImportAgentPopup { static show() { - return new Promise((resolve) => { + return new Promise((resolve) => { TopView.show( { diff --git a/src/renderer/src/pages/agents/index.ts b/src/renderer/src/pages/agents/index.ts index 2a190c6b86..2c85f894c6 100644 --- a/src/renderer/src/pages/agents/index.ts +++ b/src/renderer/src/pages/agents/index.ts @@ -2,19 +2,24 @@ import { loggerService } from '@logger' import { useRuntime } from '@renderer/hooks/useRuntime' import { useSettings } from '@renderer/hooks/useSettings' import store from '@renderer/store' -import { Agent } from '@renderer/types' +import { AssistantPreset } from '@renderer/types' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' const logger = loggerService.withContext('useSystemAgents') -let _agents: Agent[] = [] +let _agents: AssistantPreset[] = [] export const getAgentsFromSystemAgents = (systemAgents: any) => { - const agents: Agent[] = [] + const agents: AssistantPreset[] = [] for (let i = 0; i < systemAgents.length; i++) { for (let j = 0; j < systemAgents[i].group.length; j++) { - const agent = { ...systemAgents[i], group: systemAgents[i].group[j], topics: [], type: 'agent' } as Agent + const agent = { + ...systemAgents[i], + group: systemAgents[i].group[j], + topics: [], + type: 'agent' + } as AssistantPreset agents.push(agent) } } @@ -23,7 +28,7 @@ export const getAgentsFromSystemAgents = (systemAgents: any) => { export function useSystemAgents() { const { defaultAgent } = useSettings() - const [agents, setAgents] = useState([]) + const [agents, setAgents] = useState([]) const { resourcesPath } = useRuntime() const { agentssubscribeUrl } = store.getState().settings const { i18n } = useTranslation() @@ -40,7 +45,7 @@ export function useSystemAgents() { if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`) } - const agentsData = (await response.json()) as Agent[] + const agentsData = (await response.json()) as AssistantPreset[] setAgents(agentsData) return } catch (error) { @@ -54,7 +59,7 @@ export function useSystemAgents() { try { const fileName = currentLanguage === 'zh-CN' ? 'agents-zh.json' : 'agents-en.json' const localAgentsData = await window.api.fs.read(`${resourcesPath}/data/${fileName}`, 'utf-8') - _agents = JSON.parse(localAgentsData) as Agent[] + _agents = JSON.parse(localAgentsData) as AssistantPreset[] } catch (error) { logger.error('Failed to load local agents:', error as Error) } @@ -74,8 +79,8 @@ export function useSystemAgents() { return agents } -export function groupByCategories(data: Agent[]) { - const groupedMap = new Map() +export function groupByCategories(data: AssistantPreset[]) { + const groupedMap = new Map() data.forEach((item) => { item.group?.forEach((category) => { if (!groupedMap.has(category)) { @@ -84,7 +89,7 @@ export function groupByCategories(data: Agent[]) { groupedMap.get(category)?.push(item) }) }) - const result: Record = {} + const result: Record = {} Array.from(groupedMap.entries()).forEach(([category, items]) => { result[category] = items }) diff --git a/src/renderer/src/services/AssistantService.ts b/src/renderer/src/services/AssistantService.ts index 734866f65f..ede66091b0 100644 --- a/src/renderer/src/services/AssistantService.ts +++ b/src/renderer/src/services/AssistantService.ts @@ -12,7 +12,7 @@ import i18n from '@renderer/i18n' import store from '@renderer/store' import { addAssistant } from '@renderer/store/assistants' import type { - Agent, + AssistantPreset, Assistant, AssistantSettings, Model, @@ -185,7 +185,7 @@ export function getAssistantById(id: string) { return assistants.find((a) => a.id === id) } -export async function createAssistantFromAgent(agent: Agent) { +export async function createAssistantFromAgent(agent: AssistantPreset) { const assistantId = uuid() const topic = getDefaultTopic(assistantId) diff --git a/src/renderer/src/store/agents.ts b/src/renderer/src/store/agents.ts index 11bc493959..e3307004c5 100644 --- a/src/renderer/src/store/agents.ts +++ b/src/renderer/src/store/agents.ts @@ -1,9 +1,10 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit' import { DEFAULT_CONTEXTCOUNT, DEFAULT_TEMPERATURE } from '@renderer/config/constant' -import { Agent, AssistantSettings } from '@renderer/types' +import { AssistantPreset, AssistantSettings } from '@renderer/types' export interface AgentsState { - agents: Agent[] + /** @deprecated They are actually assistant presets. */ + agents: AssistantPreset[] } const initialState: AgentsState = { @@ -14,16 +15,16 @@ const assistantsSlice = createSlice({ name: 'agents', initialState, reducers: { - updateAgents: (state, action: PayloadAction) => { + updateAgents: (state, action: PayloadAction) => { state.agents = action.payload }, - addAgent: (state, action: PayloadAction) => { + addAgent: (state, action: PayloadAction) => { state.agents.push(action.payload) }, removeAgent: (state, action: PayloadAction<{ id: string }>) => { state.agents = state.agents.filter((c) => c.id !== action.payload.id) }, - updateAgent: (state, action: PayloadAction) => { + updateAgent: (state, action: PayloadAction) => { state.agents = state.agents.map((c) => (c.id === action.payload.id ? action.payload : c)) }, updateAgentSettings: ( diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 3b28d8a96d..a08d3a65f2 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -130,7 +130,7 @@ export type AssistantSettings = { toolUseMode: 'function' | 'prompt' } -export type Agent = Omit & { +export type AssistantPreset = Omit & { group?: string[] }