跳到主要内容

14-多工具任务Agent实战任务书

核对日期:2026-05-18
官方资料:Agents https://docs.langchain.com/oss/javascript/langchain/agents;Tools https://docs.langchain.com/oss/javascript/langchain/tools;Human-in-the-loop https://docs.langchain.com/oss/javascript/langchain/human-in-the-loop;Middleware https://docs.langchain.com/oss/javascript/langchain/middleware

目标

src/projects/multi-tool-task-agent.ts 扩展成可控的多工具 Agent。它要能根据用户角色和任务风险动态暴露工具,对高风险操作做人类审批,对瞬时失败做有限重试,并记录审计日志。

机制

TypeScript 任务拆解

任务修改位置产物验收方式
工具风险分级tool metadatarisk: low/medium/high高风险工具默认隐藏
动态暴露toolsForRole按角色和意图返回工具employee 不见 manager 工具
HITL 审批send_external_reportapproval token + reason无审批 pending
重试策略runWithOneRetrytransient only retrypermanent error 不重试
审计日志context.traceactor/action/ok/detail每个工具调用都有记录

工具设计模板

interface ToolPolicy {
name: string;
risk: "low" | "medium" | "high";
requiredPermission?: string;
requiresApproval: boolean;
}

不要让模型自己决定 risk。risk 是业务策略,应来自配置或后端 policy。

审批状态

高风险工具至少记录:

字段用途
approvalId审批单 ID
approverId审批人
reason为什么需要执行
expiresAt防止审批长期复用
toolInputHash防止审批后改参数

Python 差异

Python 侧常用 LangGraph interrupt/resume 处理 HITL;TypeScript 侧也要把审批当状态恢复问题,而不是 UI 弹窗。语言不同,审批状态和审计字段必须一致。

Eval 数据集

用例输入预期
普通员工建工单employee + 工单请求不调用 create_ticket
manager 建工单manager + 工单请求调用 create_ticket
外发无审批manager + 外部报告pending approval
外发有审批approvals 包含工具名成功执行
transient 失败calendar 第一次失败只重试一次后成功

工程边界

  • Agent 不能直接拿全量工具列表。
  • 写工具必须幂等。
  • 审批必须绑定工具输入,避免审批 A 参数后执行 B 参数。
  • 审计日志不能只存在前端。

常见反模式

反模式后果
“模型判断是否危险”风险边界不可控
所有工具都暴露给 Agent误调用概率上升
审批不绑定输入参数被篡改后仍能执行
工具失败无限重试造成重复副作用或成本爆炸

练习任务

  1. 给每个工具增加 risk metadata。
  2. send_external_report 检查 toolInputHash
  3. 增加一个 permanent error 工具,确认不会重试。