Skip to main content
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。

准备项目

将下方完整文件保存到当前目录。无需 clone 仓库、安装 editable 包或复制 tests。

资料与工具

运行并验证

预期出现以下输出片段(随机 ID 不固定)。每次运行都检查工具结果或持久化断言,成功退出码为 0。

行为与支持边界

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

下一步与 API

API Reference · Configuration · Learning path · Next Source file (可选;全部所需代码已在本页)