diff --git a/web/pages/Assistants.tsx b/web/pages/Assistants.tsx index 4a264f2..49bf9ad 100644 --- a/web/pages/Assistants.tsx +++ b/web/pages/Assistants.tsx @@ -65,6 +65,7 @@ export const AssistantsPage: React.FC = () => { const [activeTab, setActiveTab] = useState(TabValue.GLOBAL); const [debugOpen, setDebugOpen] = useState(false); const [hotwordInput, setHotwordInput] = useState(''); + const [toolPickerOpen, setToolPickerOpen] = useState(false); // Publish Modal State const [isPublishModalOpen, setIsPublishModalOpen] = useState(false); @@ -235,6 +236,11 @@ export const AssistantsPage: React.FC = () => { const systemTools = tools.filter((t) => t.enabled !== false && t.category === 'system'); const queryTools = tools.filter((t) => t.enabled !== false && t.category === 'query'); + const selectedToolIds = selectedAssistant?.tools || []; + const activeSystemTools = systemTools.filter((tool) => selectedToolIds.includes(tool.id)); + const activeQueryTools = queryTools.filter((tool) => selectedToolIds.includes(tool.id)); + const availableSystemTools = systemTools.filter((tool) => !selectedToolIds.includes(tool.id)); + const availableQueryTools = queryTools.filter((tool) => !selectedToolIds.includes(tool.id)); const isExternalConfig = selectedAssistant?.configMode === 'dify' || selectedAssistant?.configMode === 'fastgpt'; const isNoneConfig = selectedAssistant?.configMode === 'none' || !selectedAssistant?.configMode; @@ -742,6 +748,20 @@ export const AssistantsPage: React.FC = () => { {activeTab === TabValue.TOOLS && selectedAssistant.configMode === 'platform' && (
+
+

+ 已启用工具 +

+ +
+

@@ -749,35 +769,33 @@ export const AssistantsPage: React.FC = () => {

- {systemTools.map(tool => ( -
( +
toggleTool(tool.id)} - className={`p-4 rounded-xl border transition-all cursor-pointer group relative flex items-start space-x-3 ${selectedAssistant.tools?.includes(tool.id) ? 'bg-primary/10 border-primary/40 shadow-[0_0_15px_rgba(6,182,212,0.1)]' : 'bg-card/30 border-white/5 hover:bg-white/5 hover:border-white/10'}`} + className="p-4 rounded-xl border border-primary/40 bg-primary/10 shadow-[0_0_15px_rgba(6,182,212,0.1)] relative flex items-start space-x-3" > -
+ +
{renderToolIcon(tool.icon)}
-
- {tool.name} -
- {selectedAssistant.tools?.includes(tool.id) &&
} -
-
+
{tool.name}

{tool.description}

- {selectedAssistant.tools?.includes(tool.id) && ( - - )}
))} + {activeSystemTools.length === 0 && ( +
+ 暂未启用系统指令工具 +
+ )}
@@ -788,37 +806,98 @@ export const AssistantsPage: React.FC = () => {
- {queryTools.map(tool => ( -
( +
toggleTool(tool.id)} - className={`p-4 rounded-xl border transition-all cursor-pointer group relative flex items-start space-x-3 ${selectedAssistant.tools?.includes(tool.id) ? 'bg-blue-500/10 border-blue-500/40 shadow-[0_0_15px_rgba(59,130,246,0.1)]' : 'bg-card/30 border-white/5 hover:bg-white/5 hover:border-white/10'}`} + className="p-4 rounded-xl border border-blue-500/40 bg-blue-500/10 shadow-[0_0_15px_rgba(59,130,246,0.1)] relative flex items-start space-x-3" > -
+ +
{renderToolIcon(tool.icon)}
-
- {tool.name} -
- {selectedAssistant.tools?.includes(tool.id) &&
} -
-
+
{tool.name}

{tool.description}

- {selectedAssistant.tools?.includes(tool.id) && ( - - )}
))} + {activeQueryTools.length === 0 && ( +
+ 暂未启用信息查询工具 +
+ )}
+ + {toolPickerOpen && ( +
+
+

添加工具

+ +
+
+
+ 系统指令可选 +
+
+ {availableSystemTools.map((tool) => ( + + ))} + {availableSystemTools.length === 0 && ( +
没有可添加的系统指令工具
+ )} +
+
+
+
+ 信息查询可选 +
+
+ {availableQueryTools.map((tool) => ( + + ))} + {availableQueryTools.length === 0 && ( +
没有可添加的信息查询工具
+ )} +
+
+
+ )}
提示:此处仅导入工具库中的已有工具。移除仅对当前小助手生效,不会删除工具库。 diff --git a/web/pages/ToolLibrary.tsx b/web/pages/ToolLibrary.tsx index 426cce8..f3d27cf 100644 --- a/web/pages/ToolLibrary.tsx +++ b/web/pages/ToolLibrary.tsx @@ -92,6 +92,57 @@ export const ToolLibraryPage: React.FC = () => { const matchesCategory = categoryFilter === 'all' || tool.category === categoryFilter; return matchesSearch && matchesCategory; }); + const systemTools = filteredTools.filter((tool) => tool.category === 'system'); + const queryTools = filteredTools.filter((tool) => tool.category === 'query'); + + const renderToolCard = (tool: Tool) => ( +
+
+
+ {iconMap[tool.icon] || } +
+
+
+ {tool.name} + {tool.isSystem ? SYSTEM : CUSTOM} +
+
+ + {tool.category === 'system' ? 'SYSTEM' : 'QUERY'} + + ID: {tool.id} +
+

{tool.description}

+
+
+ +
+ system/query 仅表示执行类型 +
+ + +
+
+
+ ); const handleSaveTool = async () => { if (!toolName.trim()) { @@ -202,70 +253,51 @@ export const ToolLibraryPage: React.FC = () => {
-
- {!isLoading && filteredTools.map((tool) => ( -
-
-
- {iconMap[tool.icon] || } -
-
-
- {tool.name} - {tool.isSystem ? SYSTEM : CUSTOM} + {isLoading ? ( +
+ +

加载中...

+
+ ) : filteredTools.length === 0 ? ( +
+ +

未找到相关工具

+
+ ) : ( +
+ {(categoryFilter === 'all' || categoryFilter === 'system') && ( +
+
+

System Command

+ {systemTools.length} tools
-
- - {tool.category === 'system' ? 'SYSTEM' : 'QUERY'} - - ID: {tool.id} + {systemTools.length === 0 ? ( +
当前筛选条件下无系统指令工具。
+ ) : ( +
+ {systemTools.map(renderToolCard)} +
+ )} +
+ )} + + {(categoryFilter === 'all' || categoryFilter === 'query') && ( +
+
+

Information Query

+ {queryTools.length} tools
-

{tool.description}

-
-
- -
- system/query 仅表示执行类型 -
- - -
-
-
- ))} - - {!isLoading && filteredTools.length === 0 && ( -
- -

未找到相关工具

-
- )} - - {isLoading && ( -
- -

加载中...

-
- )} -
+ {queryTools.length === 0 ? ( +
当前筛选条件下无信息查询工具。
+ ) : ( +
+ {queryTools.map(renderToolCard)} +
+ )} + + )} +
+ )}