From 7ffc7a792002080532d44aa29c25eade7b112bf2 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Thu, 22 Jan 2026 11:40:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(web/config):=20=E9=87=8D=E6=9E=84=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=BE=A7=E8=BE=B9=E6=A0=8F=E4=B8=BA=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构 AgentConfigSidebar 组件,将工具选择逻辑抽象为通用选择组件 - 支持显示选项名称和描述 - 根据选项数量自动切换显示模式(卡片列表或弹窗) - 统一处理工具、知识库等多选配置项 - 优化样式和交互体验 --- src/agents/chatbot/graph.py | 4 +- src/agents/common/context.py | 4 +- .../middlewares/runtime_config_middleware.py | 5 +- src/agents/deep_agent/graph.py | 7 +- src/agents/reporter/graph.py | 1 - src/services/chat_stream_service.py | 8 +- web/src/components/AgentConfigSidebar.vue | 388 +++++++++++------- 7 files changed, 248 insertions(+), 169 deletions(-) diff --git a/src/agents/chatbot/graph.py b/src/agents/chatbot/graph.py index 05184a0b..691b1b9c 100644 --- a/src/agents/chatbot/graph.py +++ b/src/agents/chatbot/graph.py @@ -20,7 +20,9 @@ class ChatbotAgent(BaseAgent): async def get_graph(self, **kwargs): """构建图""" context = self.context_schema() - all_mcp_tools = await get_tools_from_all_servers() # 因为异步加载,无法放在 RuntimeConfigMiddleware 的 __init__ 中 + all_mcp_tools = ( + await get_tools_from_all_servers() + ) # 因为异步加载,无法放在 RuntimeConfigMiddleware 的 __init__ 中 # 使用 create_agent 创建智能体 # 注意:tools 参数由 RuntimeConfigMiddleware 在 wrap_model_call 中动态设置 diff --git a/src/agents/common/context.py b/src/agents/common/context.py index 5d9b09d9..a193a407 100644 --- a/src/agents/common/context.py +++ b/src/agents/common/context.py @@ -75,7 +75,9 @@ class BaseContext: default_factory=list, metadata={ "name": "知识库", - "options": lambda: [k["name"] for k in knowledge_base.get_retrievers().values()], + "options": lambda: [ + {"name": k["name"], "description": k["description"]} for k in knowledge_base.get_retrievers().values() + ], "description": "知识库列表,可以在左侧知识库页面中创建知识库。", "type": "list", # Explicitly mark as list type for frontend if needed }, diff --git a/src/agents/common/middlewares/runtime_config_middleware.py b/src/agents/common/middlewares/runtime_config_middleware.py index 08dcf493..051ecebc 100644 --- a/src/agents/common/middlewares/runtime_config_middleware.py +++ b/src/agents/common/middlewares/runtime_config_middleware.py @@ -5,10 +5,10 @@ from typing import Any from langchain.agents.middleware import AgentMiddleware, ModelRequest, ModelResponse -from src.utils.logging_config import logger from src.agents.common import load_chat_model -from src.agents.common.tools import get_kb_based_tools, get_buildin_tools +from src.agents.common.tools import get_kb_based_tools from src.services.mcp_service import get_enabled_mcp_tools +from src.utils.logging_config import logger def _is_system_message(msg: Any) -> bool: @@ -82,7 +82,6 @@ class RuntimeConfigMiddleware(AgentMiddleware): request = request.override(model=model, tools=enabled_tools, messages=messages) return await handler(request) - async def get_tools_from_context(self, context) -> list: """从上下文配置中获取工具列表""" # 1. 基础工具 (从 context.tools 中筛选) diff --git a/src/agents/deep_agent/graph.py b/src/agents/deep_agent/graph.py index 5aef2922..460e7952 100644 --- a/src/agents/deep_agent/graph.py +++ b/src/agents/deep_agent/graph.py @@ -4,7 +4,12 @@ from deepagents.middleware.filesystem import FilesystemMiddleware from deepagents.middleware.patch_tool_calls import PatchToolCallsMiddleware from deepagents.middleware.subagents import SubAgentMiddleware from langchain.agents import create_agent -from langchain.agents.middleware import ModelRequest, ModelRetryMiddleware, SummarizationMiddleware, TodoListMiddleware, dynamic_prompt +from langchain.agents.middleware import ( + ModelRequest, + SummarizationMiddleware, + TodoListMiddleware, + dynamic_prompt, +) from src.agents.common import BaseAgent, load_chat_model from src.agents.common.middlewares import RuntimeConfigMiddleware, inject_attachment_context diff --git a/src/agents/reporter/graph.py b/src/agents/reporter/graph.py index 447254a3..2d25e820 100644 --- a/src/agents/reporter/graph.py +++ b/src/agents/reporter/graph.py @@ -2,7 +2,6 @@ from dataclasses import dataclass, field from typing import Annotated from langchain.agents import create_agent -from langchain.agents.middleware import ModelRetryMiddleware from src.agents.common import BaseAgent, BaseContext, load_chat_model from src.agents.common.middlewares import ( diff --git a/src/services/chat_stream_service.py b/src/services/chat_stream_service.py index da693746..11e27c12 100644 --- a/src/services/chat_stream_service.py +++ b/src/services/chat_stream_service.py @@ -7,7 +7,8 @@ from collections.abc import AsyncIterator from langchain.messages import AIMessage, AIMessageChunk, HumanMessage from langgraph.types import Command -from src import config as conf, knowledge_base +from src import config as conf +from src import knowledge_base from src.agents import agent_manager from src.plugins.guard import content_guard from src.repositories.agent_config_repository import AgentConfigRepository @@ -307,7 +308,6 @@ async def stream_agent_chat( "agent_config": agent_config, } - try: conv_repo = ConversationRepository(db) @@ -347,9 +347,7 @@ async def stream_agent_chat( filtered_knowledge_names = [kb for kb in requested_knowledge_names if kb in accessible_kb_names] blocked_knowledge_names = [kb for kb in requested_knowledge_names if kb not in accessible_kb_names] if blocked_knowledge_names: - logger.warning( - f"用户 {user_id} 无权访问知识库: {blocked_knowledge_names}, 已自动过滤" - ) + logger.warning(f"用户 {user_id} 无权访问知识库: {blocked_knowledge_names}, 已自动过滤") input_context["agent_config"]["knowledges"] = filtered_knowledge_names full_msg = None diff --git a/web/src/components/AgentConfigSidebar.vue b/web/src/components/AgentConfigSidebar.vue index 1bb5fd2d..67adfea0 100644 --- a/web/src/components/AgentConfigSidebar.vue +++ b/web/src/components/AgentConfigSidebar.vue @@ -57,7 +57,10 @@ -
+
- -
-
- 已选择 {{ getSelectedCount(key) }} 项 - - 清空 - -
-
-
-
- {{ option }} -
- - + +
+ +
+
+ 已选择 {{ getSelectedCount(key) }} 项 + + 清空 + +
+
+
+
+ {{ getOptionLabel(option) }} +
+ + +
+ + + +
+
+
+ 已选择 {{ getSelectedCount(key) }} 项 + + + 清空 + +
+ + + 选择... + +
+ + + +
+ + {{ getOptionLabelFromValue(key, val) }} + +
+
@@ -251,20 +300,21 @@
- + + -
-