From 6809f67f700592ef1bb418c21b35c2fb072bc364 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Mon, 6 Apr 2026 12:09:22 +0800 Subject: [PATCH] =?UTF-8?q?refactor(chatbot):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E8=AF=8D=E5=92=8C=E5=BE=85=E5=8A=9E=E4=BA=8B?= =?UTF-8?q?=E9=A1=B9=E4=B8=AD=E9=97=B4=E4=BB=B6=EF=BC=8C=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=8F=90=E7=A4=BA=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yuxi/agents/buildin/chatbot/graph.py | 8 +++----- .../yuxi/agents/buildin/chatbot/prompt.py | 18 ++++++++++++++---- backend/package/yuxi/services/mcp_service.py | 1 + web/src/apis/auth_api.js | 2 +- web/src/views/LoginView.vue | 5 +++-- web/src/views/OIDCCallbackView.vue | 5 +---- 6 files changed, 23 insertions(+), 16 deletions(-) diff --git a/backend/package/yuxi/agents/buildin/chatbot/graph.py b/backend/package/yuxi/agents/buildin/chatbot/graph.py index 6716dbe0..d7dcdc2d 100644 --- a/backend/package/yuxi/agents/buildin/chatbot/graph.py +++ b/backend/package/yuxi/agents/buildin/chatbot/graph.py @@ -16,7 +16,7 @@ from yuxi.agents.middlewares.skills_middleware import SkillsMiddleware from yuxi.services.mcp_service import get_tools_from_all_servers from yuxi.services.subagent_service import get_subagents_from_names -from .prompt import PROMPT +from .prompt import TODO_MID_PROMPT, build_prompt_with_context async def _build_middlewares(context): @@ -54,7 +54,7 @@ async def _build_middlewares(context): SkillsMiddleware(), # Skills 中间件(提示词注入、依赖展开、动态激活) subagents_middleware, summary_middleware, - TodoListMiddleware(system_prompt="任务结束前,应该检查维护的待办事项列表是否结束。"), + TodoListMiddleware(system_prompt=TODO_MID_PROMPT), # 待办事项中间件 PatchToolCallsMiddleware(), ModelRetryMiddleware(), # 模型重试中间件 ] @@ -82,12 +82,10 @@ class ChatbotAgent(BaseAgent): context = context or self.context_schema() # 获取上下文配置 - system_prompt = f"{PROMPT.strip()}\n\n{context.system_prompt or ''}" - # 使用 create_agent 创建智能体 graph = create_agent( model=load_chat_model(fully_specified_name=context.model), - system_prompt=system_prompt.strip(), + system_prompt=build_prompt_with_context(context), middleware=await _build_middlewares(context), state_schema=BaseState, checkpointer=await self._get_checkpointer(), diff --git a/backend/package/yuxi/agents/buildin/chatbot/prompt.py b/backend/package/yuxi/agents/buildin/chatbot/prompt.py index a7370760..f0149114 100644 --- a/backend/package/yuxi/agents/buildin/chatbot/prompt.py +++ b/backend/package/yuxi/agents/buildin/chatbot/prompt.py @@ -7,9 +7,12 @@ from yuxi.utils.paths import ( ) PROMPT = f""" -你是一个人工智能助手 “语析”,专门用来回答用户的问题。请根据用户提供的信息,尽可能详细地回答问题。 +你是一个交互式智能体“语析“。 + +专门用来回答用户的问题。请根据用户提供的信息,尽可能详细地回答问题。 如果你不确定答案,可以说你不知道,但请尽量提供相关的信息或建议。请保持礼貌和专业。 +<| 文件系统约束 |> 系统主要工作路径为 {VIRTUAL_PATH_PREFIX},但必须遵守规范: - {VIRTUAL_PATH_WORKSPACE}:用于存放工作文件(用户目录,不要轻易写入) - {VIRTUAL_PATH_OUTPUTS}:用于写入的文件夹 @@ -18,10 +21,17 @@ PROMPT = f""" 非必要不写入其他路径 -如果启用了知识库,除了使用知识库工具之外, -当需要精准获取信息的时候,或者 query_kb 中没有找到相关的内容,还可以直接访问知识库文件系统 +<| 知识库访问 |> +当 query_kb 中没有找到相关的内容,或者需要进一步基于检索到的内容获取更加详细的上下文的时候,还可以直接访问知识库文件系统 (路径为 {VIRTUAL_KBS_PATH})来获取信息。 -源文件可能无法解析,可以在 {VIRTUAL_KBS_PATH}//parsed/ 中找到解析后的 markdown 文件。 +源文件可能无法直接读取,可以在 {VIRTUAL_KBS_PATH}//parsed/ 中找到解析后的 markdown 文件。 +""" +TODO_MID_PROMPT = """ 你需要根据任务的复杂程度来使用 write_todos 来记录规划和待办事项,确保任务的每个步骤都被记录和跟踪。 """ + + +def build_prompt_with_context(context): + system_prompt = f"{PROMPT.strip()}\n\n{context.system_prompt or ''}" + return system_prompt.strip() diff --git a/backend/package/yuxi/services/mcp_service.py b/backend/package/yuxi/services/mcp_service.py index dde5fb52..54b680e5 100644 --- a/backend/package/yuxi/services/mcp_service.py +++ b/backend/package/yuxi/services/mcp_service.py @@ -180,6 +180,7 @@ def to_camel_case(s: str) -> str: s = s[0].lower() + s[1:] return s + async def _load_enabled_mcp_server_configs( *, names: list[str] | None = None, diff --git a/web/src/apis/auth_api.js b/web/src/apis/auth_api.js index 1bbb3a83..ce0cb095 100644 --- a/web/src/apis/auth_api.js +++ b/web/src/apis/auth_api.js @@ -77,5 +77,5 @@ async function exchangeOIDCCode(code) { export const authApi = { getOIDCConfig, getOIDCLoginUrl, - exchangeOIDCCode, + exchangeOIDCCode } diff --git a/web/src/views/LoginView.vue b/web/src/views/LoginView.vue index c8f56f08..97076f82 100644 --- a/web/src/views/LoginView.vue +++ b/web/src/views/LoginView.vue @@ -332,7 +332,7 @@ const healthChecking = ref(false) // OIDC 相关状态 const oidcEnabled = ref(false) const oidcLoading = ref(false) -const oidcChecking = ref(true) +const oidcChecking = ref(true) const oidcButtonText = ref('OIDC 登录') // 登录锁定相关状态 @@ -513,7 +513,8 @@ const handleOIDCLogin = async () => { const response = await authApi.getOIDCLoginUrl() if (response.login_url) { // 保存当前路径,以便登录后返回 - const redirectPath = sessionStorage.getItem('redirect') || router.currentRoute.value.query.redirect || '/' + const redirectPath = + sessionStorage.getItem('redirect') || router.currentRoute.value.query.redirect || '/' sessionStorage.setItem('oidc_redirect', redirectPath) // 跳转到 OIDC Provider diff --git a/web/src/views/OIDCCallbackView.vue b/web/src/views/OIDCCallbackView.vue index 09b2b7b0..88c57ce9 100644 --- a/web/src/views/OIDCCallbackView.vue +++ b/web/src/views/OIDCCallbackView.vue @@ -9,9 +9,7 @@
@@ -107,7 +105,6 @@ const handleCallback = async () => { router.push(redirectPath) } }, 500) - } catch (err) { console.error('OIDC 回调处理失败:', err) loading.value = false