KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA

09. 把工具子系统放回 Harness — keel 龙骨

到这里,你已经完成了工具内部的完整链路:

到这里,你已经完成了工具内部的完整链路:

Model ToolCall
  -> Adapter
  -> Registry
  -> Input Schema
  -> Business/Policy
  -> Executor
  -> ToolResult
  -> Harness 下一轮

把两层架构边界放在一起看

Harness 负责 Tool Calling 负责
管理整次运行 管理工具子系统内部协议
状态、事件、预算、停止 工具契约、注册表、校验、执行器
取消、恢复、服务化 幂等、并行、流式、副作用
调度多个子系统 提供 ToolCall 和 ToolResult 接口

工具调用不是独立 Agent,它是 Harness 中的一段受控能力。

项目模块怎样对应

ollama_adapter.py -> 供应商响应转内部 ToolCall
contracts.py      -> ToolCall / ToolResult / ToolError
registry.py       -> 工具定义和白名单
executor.py       -> schema、策略、执行和输出校验
runner.py         -> 多轮模型—工具循环
tools.py          -> 领域工具实现

模块可以合并,但责任边界不能消失。

结业练习

增加 lookup_service_owner(service_name):

  1. 定义输入和输出 Pydantic 模型;
  2. 注册为 read 工具;
  3. 服务不存在时返回稳定业务错误;
  4. 让模型可以先查事件,再查负责人;
  5. 保证 max steps 和 deadline 生效;
  6. 为合法调用、参数错误、未知服务和权限拒绝写测试;
  7. 事件保留 run_id、call_id 和工具版本。

然后增加 notify_service_owner,但标为 external,让它返回 approval_required,不要直接执行。

完成后回到 Agent Harness 课程,把工具边界放进一次完整运行。

当工具已经获准执行,继续学习现实世界执行:那里详细处理幂等、长任务、未知结果、对账和补偿。若要判断动作是否应该获准,进入安全控制:那里展开身份、策略执行点、提示注入、审批绑定和隔离。

进入 keel 阅读