Agent Loop · Python · 2026.10.16 整理

手写一个 Coding Agent:工具调用之后发生了什么

从 DeepSeek 原生调用循环出发,拆开消息回传、参数校验、错误观察与停止条件,明确文件读写边界和命令执行权限。

本记录依据我在 Go Agentic 学习目录中实现的 Python 最小实验整理。它用于解释 Agent 的基本执行机制,属于技术实验,不代表成熟 Coding Agent 产品。

模型提出调用,程序执行工具

模型返回工具名称和 JSON 参数;真正读取文件或执行程序的是本地 Python 工具实现。实现中用 JSON Schema 描述四个工具: list_files 、 read_file 、 write_file 、 run_command 。

每轮先保留完整 assistant 消息,再依次执行 tool calls,并以对应的 tool_call_id 回传工具结果。下一轮模型才能根据真实执行结果继续工作。

message = model(messages, tools)
messages.append(message)
for call in message.get("tool_calls") or []:
    observation = workspace.execute(call)
    messages.append({
        "role": "tool",
        "tool_call_id": call["id"],
        "content": observation,
    })

失败也需要成为下一轮输入

参数解析、未知工具和文件访问错误被转成带类型的 TOOL_ERROR 观察结果,模型可以修改参数继续尝试。模型 API 连接失败、空回答和达到最大轮次则明确停止,已发生的文件修改不会自动回滚。

边界要由程序实现

文件工具会解析实际路径并检查是否仍在工作目录中。命令执行默认不开放,只有显式指定 --allow-run 后才提供给模型;执行时设置超时、返回码和输出截断,并移除子进程中的模型密钥变量。

cwd 只指定起始目录,不是进程沙箱。允许执行命令后,程序仍拥有当前用户权限,因此不能把文件工具的路径校验当作完整系统隔离。

接下来怎么验证

用固定的小任务检查多轮改错、参数错误、路径越界、超时和最大轮次退出;真实模型的完成率与成本需要独立实验记录。本页不从代码存在推导这些结果。

下载当前最小实验源码 ↓

← 返回技术记录