实战 05:简易 OpenCode——会话、上下文压缩与模型运行时

2026-09-01
18197 分钟
...

1、本篇任务:让长时间编码 Session 不失控

编码 Agent 的难点不是第一次回答,而是第 30 轮仍知道任务、改了哪些文件、测试为何失败,同时不把整个仓库和全部日志重复塞进模型。本篇完善 Session 生命周期、上下文构建、压缩与 Provider 路由。

2、Session 与 Turn

Session 表示持续协作空间;Turn 表示一次用户输入到 Agent 停止的运行。一个 Session 可 fork 子 Session,用于尝试另一方案而不污染主线。

Session
  ├─ Turn 1解释认证代码
  ├─ Turn 2提出修改计划
  ├─ Turn 3应用 Patch + 测试失败
  └─ Turn 4修复测试

Turn 保存起始 workspace snapshot、用户消息、Assistant/Tool Parts、模型 usage、结束原因和变更 Patch。取消只取消当前 Turn;删除 Session 需要清理消息、事件、checkpoint、worktree 和 artifacts。

3、Context Builder 的输入

每次调用模型都重新构建 context,不把数据库全部消息直接发送:

1. Harness/system 规则
2. Project rules AGENTS.md + 当前文件路径上的更近规则
3. Agent/mode 规则plan/build/reviewer
4. 当前用户消息与明确 @file 引用
5. 最近关键消息和工具摘要
6. 压缩后的旧 Session summary
7. 当前步骤需要的 diagnosticsdifftodo
8. 当前允许工具 schema

每一块记录 source、priority、estimated_tokens、version。Context manifest 写入 trace,才能回答“模型为什么没看到这个文件”。

4、文件引用与仓库发现

@path 只是一种显式引用,仍经过路径权限与大小限制。目录引用先生成树与相关文件列表,不一次读取全部。仓库初始化可扫描语言、包管理器、入口、测试配置和规则文件,生成可人工审阅的 ProjectProfile,而非长期把全仓库文本放 prompt。

type ProjectProfile = {
  languages: string[];
  packageManagers: string[];
  testSuites: Record<string, string>;
  importantPaths: string[];
  rulesFiles: { path: string; hash: string }[];
};

profile 在 Git commit 或规则文件 hash 变化时更新。

5、Token 预算算法

先为输出和工具调用预留空间,再分配输入预算:

context_window
- max_output_tokens
- tool_schema_tokens
- safety_margin
= available_input

system/权限规则不可删除;当前用户消息最高优先;最近消息、当前 diff/diagnostic 次之;旧工具原文、大日志和低相关文件最先卸载。工具结果保留摘要与 artifact ID,需要时再读取局部。

不要用字符串末尾硬截断,可能切坏 JSON、Patch 或代码。按完整 content block 选择,超过大小的 block 先专门摘要或存 artifact。

6、上下文压缩

触发条件可以是 token 达到窗口的 70% 或预计下一次调用会超预算。Compactor 生成结构化摘要:

type SessionSummary = {
  objective: string;
  confirmedFacts: string[];
  decisions: { decision: string; reason: string }[];
  filesRead: { path: string; hash: string; purpose: string }[];
  filesChanged: { path: string; patchArtifactId: string }[];
  tests: { suite: string; status: string; artifactId?: string }[];
  openQuestions: string[];
  coveredUntilMessageId: string;
};

摘要不取代权威 workspace。文件 hash 变化时,旧的 filesRead 事实标 stale;测试结果关联 commit/snapshot;用户纠正决定时更新 summary。保留压缩前消息以供审计,但不再默认发模型。

7、Provider 路由

Model Catalog 保存能力:context 长度、工具、图片、结构化输出、价格和可用状态。Plan/review 可选更强推理模型,简单摘要/标题可用低成本模型;但路由是配置规则,不让模型自行选择任意 provider。

fallback 只用于兼容模型。若主模型已产生工具调用或文本 delta,切换 provider 要开启新 step 并明确记录,不能把两家不兼容流拼成一个响应。

8、缓存与重试

可缓存 ProjectProfile、规则文件、LSP 查询和相同 hash 文件摘要。模型响应缓存只适合确定测试或明确可复用任务,不能让带用户隐私/动态 workspace 的结果跨 Session 泄露。

重试 provider 429/临时 5xx;解析错误最多有限修复;权限 deny、路径错误和测试失败不可通过模型重试掩盖。每次重试计入预算并写 Step Part。

9、Doom-loop 检测

检测连续相同工具+相同参数、相同 Patch 被拒后再次提出、测试错误未变却重复运行、模型多轮没有新增 artifact/状态。达到阈值暂停并询问用户或终止;不要继续消耗费用。

10、测试

长 Session 压缩后保留目标、决策、变更和失败测试;文件变化会使旧摘要 stale;token 选择不切断 JSON/Patch;规则优先级正确;provider fallback 不重复工具;缓存按 project/session namespace;doom-loop 能在固定次数暂停。

本篇完成后,编码 Agent 才能从“会改一个文件”升级为可持续协作工具。

官方参考:OpenCode RulesModelsAgents

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
AI2026-09-01
Deep Agents 01:何为 Agent Harness,以及如何开始
1、本篇任务:完成一份多步骤、带证据的技术调研 普通客服 Agent 的问题短、工具少、输出即时。技术调研或编码任务会持续很久,产生计划、搜索结果、文件和中间结论。Deep Agents 在 LangChain/LangGraph 之上预装规划、虚拟文件系统、上下文压缩和子 Agent,适合这类开放任务。 本课让 Agent 比较两种向量数据库,并交付一份可验证报告。 2、什么时候需要 Deep Agent 满足以下两项以上再考虑:任务...
学习
AI2026-09-01
Deep Agents 02:子 Agent、虚拟文件系统与长期记忆
1、本篇任务:让主管只看结论,让子 Agent 处理细节 技术调研会产生几十次搜索和大量文件。如果全部进入主管上下文,真正的目标会被噪音淹没。本课用两个子 Agent: 收集证据, 检查结论;主管负责计划与最终合成。 2、什么时候委派,什么时候直接调用工具 适合委派:子任务有多步;需要专门提示或工具;会产生大量中间结果;只需返回有限结论。不适合:一步查询;主管需要全部中间上下文;协调成本超过任务本身。 3、配置专门子 Agent Pyt...
学习
AI2026-09-01
Deep Agents 03:生产化、Sandbox、权限与上线验收
1、本篇任务:让 Deep Agent 在隔离环境中分析代码 只读研究 Agent 风险有限;编码 Agent 需要读写文件、安装依赖和执行测试。本课不讲如何让模型写更漂亮的代码,只讲执行环境、权限、恢复和上线验收。 2、先做威胁模型 资产包括源代码、用户文件、云凭证、生产网络和发布权限;攻击入口包括用户消息、仓库内容、网页、依赖包、MCP 返回和命令输出。 Prompt injection 不是靠一句 system prompt 解决...
学习
AI2026-09-01
LangChain 01:全景、原理与学习路线
1、本篇学完要得到什么 这一篇只解决三个问题:LangChain 到底负责什么;它与 LangGraph、Deep Agents、LangSmith 是什么关系;后面应按什么顺序学习。 贯穿整套课程的项目是“退款政策与订单助手”。它最终能够:回答知识库中的退款规则;查询当前用户的订单;生成结构化答复;对真正的退款操作进行人工审批;断线后恢复;通过评测后发布。 先记住一句话: 模型负责理解与生成,应用负责数据、权限、状态和副作用。 如果把...
学习
AI2026-09-01
LangChain 02:模型、消息与结构化输出
1、本篇任务:让模型输出成为程序可以依赖的合同 上一课只证明 Agent 能运行。本课暂时不接业务工具,只完成一个“客服分诊器”:输入用户问题,输出意图、紧急程度、是否需要人工和给用户的答复。 本课的核心不是学更多模型参数,而是理解三层合同:消息决定模型看到了什么;schema 决定程序期待什么;业务校验决定结果是否真的可用。 2、消息不是一段字符串,而是一条执行记录 一次工具型对话通常包含四种消息: | 类型 | 由谁产生 | 作用...
学习
AI2026-09-01
LangChain 03:工具与 Agent——从函数到可控行动
1、本篇任务:让 Agent 安全地读取订单 上一课得到结构化分诊结果,但模型不知道真实订单。本课增加一个只读工具 ,走通完整 Agent 循环,并把模型、工具包装和领域服务的责任分开。 完成后,用户问“我的 A100 发货了吗”,Agent 会选择工具;工具只按当前登录用户查询;模型基于工具结果回答。它仍然不能退款,因为我们没有提供写工具。 2、工具的本质是受 schema 约束的应用函数 一个好工具需要:稳定名称、清楚描述、窄输入...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录