S1
七层架构
能力在边缘,核心是窄腰
L6宿主面CLI · TUI · Desktop · Gateway(20+ 平台) · ACP · Cron
L5会话与状态state.db (SQLite + FTS5) · 单一写者 · profile 隔离 · lineage
L4回合引擎AIAgent · 13 个阶段 · 预算与中断
L3上下文工程三层冻结 prompt · 双阈压缩 · 缓存断点
L2能力层Tool Registry(70+ / 28 toolset) · Skills · Plugins · MCP
L1模型接入3 种 API mode · 30+ 失败分类 · fallback 链 · auxiliary
L0运行时deadline · 中断控制 · 7 种终端后端 · secret scope
读法用户输入自上而下穿透;每一层只依赖下一层的抽象,换掉任一层不影响上层。
S2
一次 turn 的生命周期
13 个阶段,合并为 7 个可观察步骤
01build_turn_context恢复 prompt · 首轮压缩 · 租约
02assemble_api_request消息 + 工具 schema → 请求体
03perform_api_call可中断 HTTP · 流式
04check / normalize空响应 · 截断 · 统一形状
05run_tool_round执行工具 → 追加结果↺ 回到 02
06finish_text_response四道 stop gates 可能拒绝收尾
07finalize_turn落盘 · 刷记忆 · 触发复盘
回边模型返回 tool_calls 就回到 02,而不是重新开始 turn;预算 500 次,耗尽后还有一次"恩典调用"体面收尾。
S3
Prompt 装配
三层冻结,会话期间字节不变
SYSTEM PROMPT · 三层
stable身份 SOUL.md · 工具准则 · 编码守则 · 平台提示
context项目上下文 · worktree 快照 · 运维指令
volatile技能索引 · MEMORY.md · USER.md · 时间 · 运行环境
拼装结果
同一会话内不再重建;改写历史是唯一禁止的动作
缓存前缀复用98%
只有压缩允许打断缓存,其余注入一律走 user / tool 通道
代价改了技能/设置默认下个会话才生效——换来长会话成本线性而非平方级。
S4
工具调度
不是"有多个就并发",而是分段规划
模型一次性返回 3 个 tool_call
1 read_file A
2 read_file B
3 patch_file C
parallel读读可并发
read A
read B
sequential与写操作有路径重叠
patch C
结果按原序回填
1 ✓2 ✓3 ✓
完成顺序可以不同,写入历史的顺序永远是 1 → 2 → 3
S5
上下文压缩
四阶段:剪枝 → 定界 → 摘要 → 拼装
system身份 · 工具准则
user帮我把这个仓库的 CI 修好
asst先看下流水线配置
toolread_file .github/workflows/ci.yml — 4.2 KB 输出
asst第 12 行缺 Node 缓存
toolsearch_files "setup-node" — 37 条命中
asst改完跑一次本地构建
toolterminal npm run build — 210 行日志
摘要Goal / Progress / Decisions / Files / Next / Critical …
asst现在把缓存配置写进去
user顺便把 lint 也修了
asst好,先看 lint 报错
toolterminal npm run lint — 9 条
context 占用
60%
50% 触发 · 85% 网关兜底
保护头
中段 → 摘要
保护尾
记账token 数先信 provider 返回的真实 usage,估算只在没有 anchor 时兜底;压缩失败有 60s→300s→900s 冷却阶梯。
S6
学习闭环
回合后 fork 一个自己复盘
主回合结束finalize_turn 落盘
fork →
复盘 AIAgent继承 provider / 模型 / 缓存前缀
SKILL.mdupdate → 改已加载技能 / 加支撑文件 / 才新建
MEMORY.md只记"用户是谁",不记"这类活怎么做"
主会话缓存不受影响复盘只写 store,绝不改主 prompt
技能生命周期
active→
stale→
archived
只归档不删除 · pinned 豁免
S7
失败与降级
30+ 种失败分类,决定完全不同的动作
429rate_limit
→
FailoverReason分类器
退避rate_limit / overloaded
刷凭据auth 401/403
换模型model_not_found
压缩context_overflow
改写请求image_too_large
不重试content_policy
实际路径
退避 2s→重试→仍 503→切 fallback 模型→成功
要点"重试"至少有 8 种不同语义,混成一个 except: retry 就是线上事故的来源。
S1 · 1/8