这个插件用一句话就能说明白是什么,简单说,他是 opencode 上目前最新先进(可能也是所有 agents 最先进)的上下文压缩插件,他支持:
好,接下来详细介绍这个插件如何实现以上能力的。
不同于传统上下文压缩插件,等会话满了(比如 80%)再着手压缩。ACP 会基于一个增长节点触发上下文压缩,对于 100w 上下文模型这个数值是 5w token 。然后模型会收到一个注入(用户不可见),告诉模型应该压缩,如何压缩。
注意,ACP 不会让模型压缩所有内容,而是:
不会压缩:
防止模型压缩后漂移。
模型可以选择压缩还是拒绝压缩。实际测试 90%情况模型会选择压缩,10%左右会延后压缩。模型为了上下文工作质量和节省上下文会做自主出这个选择。
长久工作后,上下文大概长这个样子:
压缩块 b1 1000token 000001 ~ 000030 扫描代码,理解用户需求...
压缩块 b2 1200token 000031 ~ 000080 分析问题,定位 bug 原因...
压缩块 b3 2100token 000081 ~ 000150 问题已经修复,修复方案...
...
010000 ~ 010200 未压缩,可能使用中
010201 ~ 010400 未压缩,当前会话,使用中
压缩块具体内容我有一个冗长的约束,经过俩月调试这个约束确认给出来的质量非常高。参考How To Compress .
压缩块永远保留,上下文会逐级增长,虽然增长缓慢。根据经验测试,压缩消息比例:平均58:1。也就是原始消息 5w token,压缩后 900 token 左右。
这样经过长久迭代,会话达到数亿 token 后,比如 5 亿 token 后,压缩块可能也满 5w token 了。
为了防止这种泄漏,会触发t2 压缩。
t2 压缩后,5w token 会降低到 5000 到 1w token 左右。
久而久之,t2 也满 5w 了,就会触发 t3 压缩。
经过测算,
stateDiagram-v2
Raw --> Tier1 : compress (约每 7 轮)
Tier1 --> Tier2 : distill (约每 250 轮)
Tier2 --> Tier3 : condense (约每 2500 轮)
Tier1 --> Raw : decompress
Tier2 --> Raw : decompress (递归)
Tier3 --> Raw : decompress (递归)
Tier1 --> GC_Truncated : GC ( 100% 上下文)
会话容量 — 一个会话从空 → T1 → T2 → T3 → 上下文极限,总共可以处理多少 token (真实校准:500 次 API 调用/天,~9.6K 新 token/调用,T1=45x/T2=10x/T3=3x ):
| 上下文上限 | 1 个月 | 3 个月 | 到极限 | 极限时间 |
|---|---|---|---|---|
| 1M | 19 亿 tok | 105 亿 tok | 689 亿 tok | 第 259 天(~8.6 月) |
| 400K | 19 亿 tok | 103 亿 tok | 103 亿 tok | 第 89 天(~3 月) |
| 400K ( 200 调用/天) | 5.6 亿 tok | 25 亿 tok | 95 亿 tok | 第 212 天(~7 月) |
Token 节省 — 无 ACP 时上下文无限增长,约 100 次 API 调用后崩溃(~0.2 天)。有 ACP 时上下文被压缩在有界范围:
| 指标 | 无 ACP | 有 ACP ( 1M 模型) |
|---|---|---|
| 会话寿命 | ~0.2 天 | 259 天(长 1295 倍) |
| 总 token 产出 | ~5200 万 | 689 亿(多 1325 倍) |
核心价值:ACP 不是减少每次调用的 token 成本,而是让一个会话能处理 1000 倍以上的工作量。
PS:当然额外带来的好处是,100w 上下文省 5 倍 token 。
插件提供了两种方式恢复记忆:search_context 和 decompress。
模型可以搜索自己的上下文,然后找到相关的块直接解压。也可以回忆上下文,直接解压。瞬间恢复所有上下文细节。
真实工程中的上下文情况。
在 6 个活跃工程会话( 11,000+ 次 API 调用)中,上下文 p90 稳定在 15 万–19 万( 15–19%),p95 在 16 万–21 万( 16–21%)—— 聚合缓存命中率达 91%。(注意这是平均缓存命中率,不是单会话命中率——后面对 Prompt 缓存的影响会解释,这实际上比传统压缩算法大幅度节省了 token 。)
| 会话 | 时长 | 消息数 | API 调用 | 累计 token | 缓存命中率 | 上下文 p50 | 上下文 p90 | 上下文 p95 |
|---|---|---|---|---|---|---|---|---|
| 0b89319b | 230h (9.5d) | 3,344 | 2,796 | 3.39 亿 | 93% | 10.8 万(11%) | 16.7 万(17%) | 21.0 万(21%) |
| 0a3be0cd | 130h (5.4d) | 3,183 | 2,499 | 2.76 亿 | 91% | 10.4 万(10%) | 14.5 万(15%) | 15.3 万(15%) |
| 0b2cd5a7 | 131h (5.4d) | 2,560 | 2,181 | 3.14 亿 | 91% | 14.2 万(14%) | 19.1 万(19%) | 19.7 万(20%) |
| 08f2d501 | 37h (1.5d) | 1,985 | 1,888 | 1.96 亿 | 95% | 10.0 万(10%) | 15.6 万(16%) | 16.8 万(17%) |
| 1410c791† | 865h (36d) | 1,279 | 1,100 | 2.18 亿 | 87% | 13.2 万(13%) | 40.7 万(41%) | 42.7 万(43%) |
| 096cf8c4 | 72h (3d) | 1,041 | 918 | 0.91 亿 | 89% | 9.2 万(9%) | 14.8 万(15%) | 16.1 万(16%) |
† Bug 测试会话,p95 异常偏高。排除该会话后,其余会话 p95 均 ≤ 21 万。
(上下文百分比均以 1M 窗口计。)
实测大部分时间缓存命中率在 98%到 99%之间。
在触发压缩的时候,一般失效最近 5w token,但是这 5w token 会被删除导致的失效,而不是破坏。
实际上每次调用省了这 5w token 。
100w 上下文场景能省 5 倍 token,省的原因是,上下文总是保持在 20w 以下,每次调用都是按照上下文 token 计费的,只要保持上下文尽可能低,就会省 token 。
ACP 更省 token,其他插件大部分原理是减少工具输入,减少模型输出等方式,这种治标不治本。
因为 ACP 直接删掉了工具输入和模型输出,治本。
我的项目总代码是 100w 行,我经常在这个量级跑。
PS:上下文是按需动态的,原则是需要多少用多少。
这是误区,实际上,ACP 同时适合执行大任务和小任务。只要你上下文大于 5w,用 ACP 一定是节省的,并且可以长久工作。
首先说明,不是我要求必须保持上下文 10w 以下的,ACP 的原则是,按需使用 token ,大多数情况下,确实 10w 上下文足够了,这个是实测自然结果。不是强制压缩到这个范围。
个人体验,压缩质量超级好(当然也取决于你的模型是否聪明)。这个你自己实践了才是最好的。
在很长的会话里面,比如连续独立工作 1 天的任务,模型基本不会失忆,这是因为 T1 压缩质量足够好,大概率还没有触发 T2 压缩。
即使触发了 T2,模型会有模糊不精确的记忆,模型可以通过解压工具找回精确记忆。
一般我会按照主题搞很多会话,把一个会话当作数字员工。 一个会话我一般不关。工作数十天。目前最长会话 10 亿 token 上下文,工作了半个月。还能接单。
opencode-acp 最原始的代码 fork 自opencode-dynamic-context-pruning ,经过了大量优化后,现在已经完全脱骨于 dcp 了。ACP 的压缩理念已经发生了翻天覆地变化。
虽然 ACP 目前还是用 DCP 的框架,但是实际上其核心压缩算法已经完全不同于 DCP 。ACP 已经不是 DCP 的增强版本和 bug 修复版,而是一个新的独立的上下文压缩版本。其实际效果要远远领先 DCP 。
pi 也支持 pai-acp,而且效果更好。在 pi 中,上下文可以控制到 15w 以下。大部分时间上下文在 8w 以下。超级超级省 token,而且可以连续工作好多天。
放一个开发 pai 自己的会话
会话 ID: 019fbb41-8c70-701f-9403-9b17c118c173
项目: pai-acp(~/projects/pai-acp)
统计时间: 2026-08-02
会话时长: 自 2026-08-01 02:57 起(约 1.8 天)
| 指标 | 数值 |
|---|---|
| 消息总数(jsonl 行) | 5,906 |
| assistant 轮次 | 2,909 |
| API 请求数 | 2,909 |
| 累计输入 token(求和) | 327,552,040 |
| 最大单次请求 token | 258,780 |
| 最小单次请求 token | 0 |
| 平均单次请求 token | 112,599 |
| 最近 5 次请求 token | 81,983 / 82,456 / 83,376 / 83,901 / 84,696 |
| 指标 | 数值 |
|---|---|
| 当前上下文用量 | ~85K(约 8.5% / 1M 窗口) |
| 活跃压缩块 | 53 个 |
| 块摘要总量 | 32.1K |
| 原始内容总量(压缩前) | 957.8K |
| 整体压缩比 | 957.8K → 32.1K(~30×) |
| 类别 | token | 占比 |
|---|---|---|
| tool | 63.0K | 64% |
| summaries | 32.1K | 32% |
| text | 4.0K | 4% |
| 层级 | token |
|---|---|
| T1(捕获) | 29.9K |
| T2(蒸馏) | 2.2K |
PS:我已经准备全面切 pi 了。
说实话,我也想支持,不过二者都不开放完全接管上下文的接口。所以无法支持。
其他 agents 如果你需要可以告诉我,我去看看是否支持上下文接管接口,只要支持就可以迁移过去。
https://github.com/ranxianglei/opencode-acp
opencode plugin opencode-acp@latest --global
# 或者稳定版本
opencode plugin opencode-acp@stable --global
https://github.com/ranxianglei/pai-acp
pi install npm:pai-acp
建议升级最新版本,过去一个月频繁更新,基本解决了大部分问题。如果求稳定可以安装 opencode-acp@stable版本。
如果有 bug 或者问题麻烦直接到 github 上提哈,更多在 github 那边。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.