Observation 保留 dict 兼容性,但每个字段只保存一次。
obs.task = value 与 obs["task"] = value 写入同一权威状态;映射中的 step
与 step_id 均对应属性 step_id。别名矛盾、非法类型和删除 schema 字段会原子拒绝。
update 与 |= 先校验整次更新;扩展键支持 pop、del、setdefault、popitem。
clear 会删除必需 identity,因此拒绝。state/metadata 的嵌套修改在两种访问方式下一致。
构造输入防御性复制,to_dict 与 to_legacy_dict 返回独立快照。属性 action results
使用 canonical ToolResult,to_dict 序列化其 canonical shape;映射中的 action results
按需生成 legacy projection,以兼容既有 reducer。请通过 obs["action_results"] 赋值
立即校验并替换结果;直接调用未绑定的 dict 修改方法不在此契约范围内。
旧 host Read 使用从 0 开始的 offset 与正整数 limit:offset=2、limit=2
只选择第 3/4 行。空文件与 EOF 返回空 output;负数或非整数窗口失败,selection
元数据保留截断与后续行信息。Edit 默认要求唯一匹配,replace_all=True 才替换全部。
无匹配、非唯一匹配、权限拒绝与显式 expected_sha256 冲突均不修改文件。
这两个 alias 现在返回 canonical ToolResult,编号文本在 .output,状态与错误在对应字段,
不再把错误包装成成功字符串。原先直接使用字符串的调用方应先检查 .status 再读取 .output。
既有 validation/permission pipeline 继续决定权限。Host compatibility 仍在 Host 执行;
Env read_file/edit_file 仍只使用 Env ops,保留从 1 开始的 line_offset。
不增加 Host 回退或隔离保证。
目标与前置条件
函数经过装饰并注册到 ToolRegistry 后才能被 Agent 调用。函数名和参数类型构成调用接口;read_only、concurrency_safe 是工具作者对行为的声明,不会自动授予权限。
先运行顺序和并行资料示例。再运行 parallel.py:第一个声明的工具等待第二个工具发出的内存事件,因此完成顺序固定反转,而 reducer 收到的仍是声明顺序。事件与列表是公开可见、仅用于本次执行的教学观测变量。
五秒等待是 fixture 的截止时间,不是性能基准。只给一个 worker 无法完成此例。工具错误、超时、不完整输出和未知外部副作用必须检查 ToolResult,不能当作成功文本。
需要 Python 基础;声明支持 Python ≥3.10,本轮本地验证使用 Python 3.12.7。每章可独立运行;继续已有项目时可复用环境和同名文件。以下命令为 macOS/Linux shell。
准备项目
资料与工具
运行并验证
行为与支持边界
timeout 不等于硬取消。遇到worker_still_running 或 outcome_unknown 应先核查实际结果,不自动重放未知副作用。
练习与参考答案
把逆序 fixture 的max_concurrency 改为 1 并解释失败;恢复为 2 后通过,不通过延长超时隐藏依赖。
常见错误与清理
ModuleNotFoundError:确认已激活安装指定 wheel/源码版本的环境,并保存本页所有文件。root 已存在:换一个新 --root,不要覆盖需要保留的证据。断言失败:检查第一个失败的工具或 typed error;不要只依赖最终文字。退出所有进程、停止 board 后,可自行删除本章新建且不再需要的运行目录;保留要调试的 SQLite、journal 和报告。
完整文件:复制到项目根目录
notes.py
agent.yaml
custom_agent.py
parallel.py
