diff --git a/backend/package/yuxi/agents/base.py b/backend/package/yuxi/agents/base.py index dd610e38..ce80fdff 100644 --- a/backend/package/yuxi/agents/base.py +++ b/backend/package/yuxi/agents/base.py @@ -15,9 +15,9 @@ from langgraph.types import Command from yuxi import config as sys_config from yuxi.agents.context import BaseContext, resolve_agent_resource_options -from yuxi.utils.subagent_thread_utils import make_child_thread_id from yuxi.storage.postgres.manager import pg_manager from yuxi.utils import logger +from yuxi.utils.subagent_thread_utils import make_child_thread_id def _json_safe(value: Any) -> Any: @@ -79,9 +79,7 @@ def _subagent_route_for_namespace( return None -async def _collect_subagent_routes( - run, parent_thread_id: str, routes: dict[tuple[str, ...], dict[str, str]] -) -> None: +async def _collect_subagent_routes(run, parent_thread_id: str, routes: dict[tuple[str, ...], dict[str, str]]) -> None: subagents = getattr(run, "subagents", None) if subagents is None: return diff --git a/backend/package/yuxi/agents/buildin/chatbot/context.py b/backend/package/yuxi/agents/buildin/chatbot/context.py index 0f1728b6..b76450ca 100644 --- a/backend/package/yuxi/agents/buildin/chatbot/context.py +++ b/backend/package/yuxi/agents/buildin/chatbot/context.py @@ -10,7 +10,7 @@ class ChatBotContext(BaseContext): metadata={ "name": "子智能体", "options": [], - "description": "可选子智能体列表,只有被选中的子智能体会作为 task 工具候选。为空表示启用当前用户可见的全部子智能体。", + "description": "可选子智能体列表,为空表示启用当前用户可见的全部子智能体。", "type": "list", "kind": "subagents", }, diff --git a/backend/package/yuxi/agents/buildin/subagent/graph.py b/backend/package/yuxi/agents/buildin/subagent/graph.py index c1117bc4..a9c1ccfb 100644 --- a/backend/package/yuxi/agents/buildin/subagent/graph.py +++ b/backend/package/yuxi/agents/buildin/subagent/graph.py @@ -15,7 +15,6 @@ from yuxi.agents.middlewares.knowledge_base import KnowledgeBaseMiddleware from yuxi.agents.middlewares.skills import SkillsMiddleware from yuxi.agents.toolkits.service import resolve_configured_runtime_tools - _SUBAGENT_DISABLED_TOOLS = frozenset({"present_artifacts", "ask_user_question"}) diff --git a/backend/package/yuxi/agents/middlewares/subagent_task.py b/backend/package/yuxi/agents/middlewares/subagent_task.py index 759204c1..c0e61633 100644 --- a/backend/package/yuxi/agents/middlewares/subagent_task.py +++ b/backend/package/yuxi/agents/middlewares/subagent_task.py @@ -15,13 +15,13 @@ from langgraph.prebuilt.tool_node import ToolRuntime from langgraph.types import Command from yuxi.agents.context import build_agent_input_context -from yuxi.utils.subagent_thread_utils import make_child_thread_id from yuxi.repositories.agent_repository import SUB_AGENT_BACKEND_ID, AgentRepository from yuxi.repositories.agent_run_repository import AgentRunRepository from yuxi.repositories.user_repository import UserRepository from yuxi.storage.postgres.manager import pg_manager from yuxi.storage.postgres.models_business import Agent from yuxi.utils.datetime_utils import utc_isoformat +from yuxi.utils.subagent_thread_utils import make_child_thread_id _CHILD_STATE_INHERIT_KEYS: frozenset[str] = frozenset() _TERMINAL_RUN_STATUSES = {"completed", "failed", "cancelled", "interrupted"} @@ -195,11 +195,7 @@ def _state_for_child( skills_thread_id: str, continuing: bool = False, ) -> dict[str, Any]: - state = ( - {} - if continuing - else {key: runtime.state[key] for key in _CHILD_STATE_INHERIT_KEYS if key in runtime.state} - ) + state = {} if continuing else {key: runtime.state[key] for key in _CHILD_STATE_INHERIT_KEYS if key in runtime.state} state.update( { "parent_thread_id": parent_thread_id, diff --git a/backend/package/yuxi/repositories/agent_repository.py b/backend/package/yuxi/repositories/agent_repository.py index 09b7b6d8..fae6cb36 100644 --- a/backend/package/yuxi/repositories/agent_repository.py +++ b/backend/package/yuxi/repositories/agent_repository.py @@ -20,18 +20,19 @@ DEFAULT_SHARE_CONFIG = {"access_level": "global", "department_ids": [], "user_ui WEB_SEARCH_AGENT_SLUG = "web-search" WEB_SEARCH_AGENT_NAME = "网页检索" WEB_SEARCH_AGENT_DESCRIPTION = "围绕检索目标持续搜索网页,返回带引用来源的摘要资料。" -WEB_SEARCH_SYSTEM_PROMPT = """你是「网页检索」子智能体,由主智能体通过 task 工具调用,专注于面向目标的网页信息检索。 +WEB_SEARCH_SYSTEM_PROMPT = """你是「网页检索」子智能体,专注于面向目标的网页信息检索。 你的职责:围绕调用方给定的检索目标,使用网页搜索工具持续检索,直到收集到足以回答目标的信息。 工作方式: 1. 拆解目标,确定需要检索的关键问题与检索词。 -2. 多轮调用网页搜索工具:依据上一轮结果调整检索词、补充遗漏角度、交叉验证关键事实,直到信息充分或确认无法获取更多有效信息。 +2. 多轮调用搜索工具:依据上一轮结果调整检索词、补充遗漏角度、交叉验证关键事实,直到信息充分或确认无法获取更多有效信息。 3. 优先采信权威、时效性强且彼此印证的来源;对存在冲突的信息要说明分歧。 输出要求: - 返回一份结构化的摘要资料,按主题或要点组织。 -- 每条关键结论后使用 $INDEX 标注引用来源,$INDEX 从 1 开始递增。不单独成行,直接跟在结论后面。 +- 每条关键结论后使用 $INDEX 标注引用来源,$INDEX 从 1 开始递增。 +- 引用不单独成行,直接跟在结论后面。 - 在结尾汇总「参考来源」列表,逐条列出标题与 URL。 - 不要编造来源或链接;无法验证的信息要明确标注。""" ACCESS_LEVELS = {"global", "department", "user"} diff --git a/backend/package/yuxi/services/chat_service.py b/backend/package/yuxi/services/chat_service.py index a355258d..c6cd1a10 100644 --- a/backend/package/yuxi/services/chat_service.py +++ b/backend/package/yuxi/services/chat_service.py @@ -29,6 +29,7 @@ from yuxi.utils.question_utils import ( normalize_questions as _normalize_interrupt_questions, ) + def _build_state_files(attachments: list[dict]) -> dict: """将附件列表转换为 StateBackend 格式的 files 字典 diff --git a/backend/package/yuxi/utils/subagent_thread_utils.py b/backend/package/yuxi/utils/subagent_thread_utils.py index 74705a0f..27eb5ac2 100644 --- a/backend/package/yuxi/utils/subagent_thread_utils.py +++ b/backend/package/yuxi/utils/subagent_thread_utils.py @@ -2,7 +2,6 @@ from __future__ import annotations import hashlib - _CHILD_THREAD_ID_PREFIX = "subagent_" _CHILD_THREAD_ID_DIGEST_LENGTH = 64 - len(_CHILD_THREAD_ID_PREFIX) diff --git a/web/src/components/AgentChatComponent.vue b/web/src/components/AgentChatComponent.vue index 5ced6d69..d78daf9f 100644 --- a/web/src/components/AgentChatComponent.vue +++ b/web/src/components/AgentChatComponent.vue @@ -45,7 +45,10 @@