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):
- 定义输入和输出 Pydantic 模型;
- 注册为
read工具; - 服务不存在时返回稳定业务错误;
- 让模型可以先查事件,再查负责人;
- 保证 max steps 和 deadline 生效;
- 为合法调用、参数错误、未知服务和权限拒绝写测试;
- 事件保留
run_id、call_id和工具版本。
然后增加 notify_service_owner,但标为 external,让它返回 approval_required,不要直接执行。
完成后回到 Agent Harness 课程,把工具边界放进一次完整运行。
当工具已经获准执行,继续学习现实世界执行:那里详细处理幂等、长任务、未知结果、对账和补偿。若要判断动作是否应该获准,进入安全控制:那里展开身份、策略执行点、提示注入、审批绑定和隔离。