From f1349ec4554cb597241a4925f25bb798dd3d3a8b Mon Sep 17 00:00:00 2001 From: xiangfei258 <504223065@qq.com> Date: Thu, 11 Jun 2026 20:35:33 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=98=BF=E9=87=8C?= =?UTF-8?q?=E4=BA=91=E7=99=BE=E7=82=BC=E5=B7=A5=E5=85=B7=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E7=BB=8F=20LangGraph=20v3=20=E6=B5=81=E5=BC=8F=E7=B4=AF?= =?UTF-8?q?=E7=A7=AF=E4=B8=A2=E5=A4=B1=20tool=5Fcall=20id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 百炼(alibaba provider)的 OpenAI 兼容流经 LangGraph v3 event stream 累积工具调用时会丢失 tool_call.id,空 id 写入 checkpoint 后导致工具结果 无法按 tool_call_id 关联、工具状态永远停留在"进行中"。 实测确认 ainvoke 与 stream_mode=messages 累积均正常,仅 astream_events v3 协议丢失 id;升级 langchain-core 至 1.4.4 仍未修复(属上游问题 langchain#37420 / langchainjs#10937 / langgraphjs#2496)。 与已有的 SiliconFlow MiniMax 修复同源,将 alibaba 加入禁流式名单, 工具调用阶段禁用流式(正文回答仍流式)以拿到完整 tool_call。 --- backend/package/yuxi/agents/models.py | 11 ++++++++++- docs/develop-guides/changelog.md | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/package/yuxi/agents/models.py b/backend/package/yuxi/agents/models.py index dcb82657..94bbdad9 100644 --- a/backend/package/yuxi/agents/models.py +++ b/backend/package/yuxi/agents/models.py @@ -6,8 +6,17 @@ from yuxi.utils import get_docker_safe_url from yuxi.utils.logging_config import logger +# 这些提供商的 OpenAI 兼容流式接口,在 LangGraph v3 事件流累积工具调用时会丢失 +# tool_call 的关键字段(siliconflow MiniMax 丢 name、alibaba 百炼丢 id),空值会被写入 +# checkpoint,导致工具结果无法按 tool_call_id 关联、工具状态永远停留在“进行中”。 +# 对这些提供商在工具调用阶段禁用流式(正文回答仍流式)以拿到完整 tool_call。 +# 该缺陷属 LangChain v3 流式协议上游问题(langchain#37420 / langchainjs#10937 / +# langgraphjs#2496),截至 langchain-core 1.4.4 仍未修复,待上游修复后可移除本处理。 +_NON_STREAMING_TOOL_CALL_PROVIDERS = ("siliconflow", "alibaba") + + def _requires_non_streaming_tool_calls(provider_id: str, model_id: str) -> bool: - return provider_id.startswith("siliconflow") + return provider_id.startswith(_NON_STREAMING_TOOL_CALL_PROVIDERS) def load_chat_model(fully_specified_name: str, **kwargs) -> BaseChatModel: diff --git a/docs/develop-guides/changelog.md b/docs/develop-guides/changelog.md index 3dc4524b..a8bee6bf 100644 --- a/docs/develop-guides/changelog.md +++ b/docs/develop-guides/changelog.md @@ -61,7 +61,7 @@ - 优化智能体对话页细节:状态面板隐藏空 section,待办名称限制为 20 个中文汉字以内,模型选择器展示供应商名称,并收紧附件状态标签与文件编辑浮动操作样式。 - 标准化 Agent run/SSE 执行链路:run 创建时持久化输入消息并提交后入队,worker 统一写入 Redis Stream envelope,SSE 输出 `event/data/id`、心跳注释、`Last-Event-ID` 回放和终止 `end` 事件;前端强制使用 run API 并支持 ask_user_question 中断后以 resume run 恢复;事件 envelope 构造收敛到统一 helper,前端优先使用 envelope 一级 `thread_id` 路由。 - Agent run SSE 新增 `verbose=false` 精简模式:默认仍返回完整事件载荷;精简模式仅在 SSE 输出前重建最小 payload,跳过 `metadata` 和空 `yuxi.agent_state`,将同一 data 内的 `request_id` 外提为单个字段,移除 chunk 中重复的 `meta`、`metadata`、`thread_id`、`response`、空 `namespace` 和图片 base64 等调试字段,保留消息增量、工具调用、工具结果、非空 Agent state、终止状态和 SSE 游标,前端订阅默认使用精简模式。 -- 修复 SiliconFlow MiniMax 工具调用流式兼容:MiniMax 在 OpenAI 兼容流中会在参数增量 chunk 返回空 `function.name`,LangGraph v3 event stream 会将空名称写入最终工具调用并导致工具执行失败;该模型默认对工具调用禁用流式模型响应,保留 LangGraph v3 运行事件并避免 agent-chat 中出现空工具名。 +- 修复 SiliconFlow MiniMax 与阿里云百炼工具调用流式兼容:二者的 OpenAI 兼容流经 LangGraph v3 event stream 累积工具调用时会丢失关键字段(MiniMax 在参数增量 chunk 返回空 `function.name`,百炼丢失 `tool_call.id`),空值被写入 checkpoint 后会导致工具执行失败或工具结果无法按 `tool_call_id` 关联、工具状态永远停留在“进行中”;这两类提供商默认对工具调用禁用流式模型响应(正文回答仍流式),保留 LangGraph v3 运行事件并拿到完整 tool_call。该缺陷属 LangChain v3 流式协议上游问题(参见 langchain#37420、langchainjs#10937、langgraphjs#2496),截至 langchain-core 1.4.4 仍未修复,待上游修复后可移除对应提供商的禁流式处理。 - 收敛后端模块边界:文档解析从 `plugins.parser` 移动到 `knowledge.parser`,内容审查从 `plugins.guard` 移动到 `services.guard`。 - 收敛文件服务边界:文件预览判断抽为独立服务,Viewer 文件系统的 workspace 分支复用用户 workspace 服务,线程运行时上下文解析从泛化 `filesystem_service` 拆出为 agent runtime helper。 - 升级 DeepAgents 到 0.6.7 并适配新版文件系统协议:SubAgentMiddleware 改为显式 subagent spec,Skills prompt 补齐新版占位符;sandbox/skills backend 复用新版 `ReadResult`、`GlobResult`、`GrepResult` 等协议类型,文件权限在 backend 层明确区分 skills、uploads、outputs 与 workspace,保留最小 `CustomCompositeBackend` 以避免非 route glob 误扫其他 route;Agent 上下文压缩改为复用 DeepAgents SummarizationMiddleware,历史摘要与大工具结果统一 offload 到 outputs。