阶段二的终点不是会调用某个 API,而是能把 SDK 组合成一个可控的小型 coding agent shell。这个 shell 不需要功能很多,但必须有清晰边界:参数决定任务模式,模型配置决定推理能力,工具 allowlist 决定权限,上下文加载决定行为标准,事件日志提供证据,会话管理提供连续性。
怎样把前面几课的碎片能力组合成一个可维护的小型 repo agent?
- Config 解析模型、权限、会话模式和 trace 选项。
- Runtime factory 创建 session、工具、资源和事件订阅。
- Task runner 驱动 prompt 并等待 idle。
- Reporter 把结果、证据和风险交给用户。
源码推演(省略版)
Section titled “源码推演(省略版)”下面不是完整源码,而是把本课主线压缩成可以在文档里直接阅读的关键形状。读者即使不打开本地源码,也应该能看出运行时如何组织职责。
async function runRepoAgent(args: Args) { const config = parseConfig(args); const runtime = await createRuntime(config); const trace = attachTrace(runtime.session);
try { await runtime.session.prompt(config.task); return reportSuccess({ trace, diff: runtime.diffSummary() }); } catch (error) { return reportFailure({ error, trace }); }}- 这段源码形状把阶段二所有主题收束到一个 shell。
createRuntime()不只是创建 session,还应该统一模型、资源、工具和会话策略。- 成功和失败都要带 trace,否则用户无法判断 agent 做了什么。
为 repo agent 设计启动配置,至少包含模型、权限模式、会话模式、trace 开关和任务文本。
- 能把 SDK 能力组合成一个小型 shell。
- 能说明各配置项属于哪个边界。
- 能设计失败时仍然可复盘的输出。
- 实践题:基于本课的省略版源码,补出一个最小实现草图,要求写清输入、输出、副作用和错误处理。
- 思考题:本课机制如果只靠 prompt 约束,而不放进 harness 或 runtime,会出现什么工程风险?