DC娱乐网

使用 Jev 实现无损上下文压缩:fast-jev-compactio...

在 2026 年,AI 编程代理(尤其是像 Claude Code 这类重度依赖工具调用的代理)面临一个经典问题:上下文窗口会迅速被大量工具调用和结果填满。传统做法是让大模型写一段摘要来“压缩”历史对话,但这是有损的——文件路径、精确错误信息、关键条件或关键常常在总结中丢失,导致后续推理出错。
fast-jev-compaction 提供了一种完全不同的思路:使用 TypeSafe 的 Jev 模型(一种 System One 模型)对每个工具调用及其结果进行快速评分,只删除或截断不再需要的部分,而保留的内容全部保持原文不变。用户消息和助手文本永远不会被改写。
为什么选择 Jev?Jev 不是传统的生成式大模型,而是一种专门做结构化决策的模型:
输入:程序状态(这里是整个对话历史)输出:带校准概率的类型化决策(是/否、选择、打分等)速度极快(通常几十到几百毫秒),成本低,且几乎不会产生幻觉在这个库里,Jev 会针对每个非固定工具调用回答两个问题:
这个调用本身是否还需要保留?它的完整结果是否还需要保留?工作原理(7 步简析)按 tool_use_id 配对每个工具调用与结果。固定保留第一条消息 + 最新的 preserveRecentMessages(默认 6)条消息,不触碰。把整个对话作为状态发给 Jev(工具结果替换成简短备注,如 ok, 4213 chars (omitted)),不进行任何总结。将状态适配到 maxStateTokens(默认 25k)限制内,分阶段截断输入、压缩旧消息等。对每个非固定调用提出两个 noul 问题,并分批并发请求(控制在 maxRequestTokens 内)。根据 keepThreshold(默认 0.5)决策:保留完整结果 → 调用和结果都保留只保留调用 → 结果截断为前 truncateHeadChars(默认 300)字符 + 备注都不保留 → 整组删除重建消息列表,空消息删除,保持原始对象引用。结果:token 数可大幅下降(演示中从约 156k 降到 62k),且保留内容完全原文。
安装与基础使用(npm 库)npm install fast-jev-compaction
export TYPESAFE_API_KEY=你的TypeSafe密钥示例代码:
import { compactMessages, reductionRatio, type Message } from 'fast-jev-compaction';

const transcript: Message[] = [
{ role: 'user', text: 'Fix the failing test. Never edit src/generated.', toolUses: [] },
{
role: 'assistant',
text: '',
toolUses: [{ tool_use_id: 'toolu_1', tool: 'Read', input: { file_path: 'src/a.ts' } }],
},
{ role: 'user', text: '', toolUses: [], toolResults: [{ tool_use_id: 'toolu_1', text: '…file…' }] },
// 更多消息...
];

const result = await compactMessages(transcript, {
preserveRecentMessages: 4, // 可选自定义
// keepThreshold: 0.5,
// truncateHeadChars: 300,
});

console.log(result.messages); // 压缩后的消息
console.log(result.decisions); // 每个调用的决策详情
console.log(result.stats); // 前后对比统计

if (reductionRatio(result) < 0.25) {
// 压缩效果不够好,可回退到原始或传统总结
}Message 类型与 Claude Code 的 SessionMessage 兼容,可直接传入会话转录。
如需自定义传输层,可实现 JevAsker 接口并调用底层的 compact() 函数。
主要配置选项选项
默认值
说明
apiKey
TYPESAFE_API_KEY 环境变量
TypeSafe API 密钥
model
jev-latest
Jev 模型名称
keepThreshold
0.5
保留的最低概率阈值
preserveRecentMessages
6
最近消息永不触碰(第一条永远保留)
maxStateTokens
25000
发送给 Jev 的状态 token 上限
maxRequestTokens
30000
单次请求(状态 + 问题)上限
truncateHeadChars
300
被截断结果保留的头部字符数
goal
最近 3 条用户提示
任务目标描述(帮助 Jev 判断相关性)
在 Claude Code 中作为插件使用启用函数钩子(early-access 功能,需 Claude Code 2.1.274+):在 ~/.claude/settings.json 中添加:
{
"env": {
"CLAUDE_CODE_ENABLE_FUNCTION_HOOKS": "1",
"TYPESAFE_API_KEY": "<你的密钥>"
}
}安装插件:claude plugin marketplace add tamaratran/fast-jev-compaction
claude plugin install fast-jev-compaction@fast-jev-compaction安装过程中可配置各项阈值。之后重启或执行 /reload-plugins。
之后 /compact 或自动压缩都会优先走 Jev 逻辑。成功时会提示类似 fast-jev-compaction: kept N/M messages, no summary;失败或压缩不足时会回退到内置总结。
本地开发测试:
CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 claude --plugin-dir .注意事项与限制只压缩工具调用与结果,用户/助手的文本消息在输出中完全保留(仅在发送给 Jev 的状态中可能被简写)。Token 估算基于字符,非精确 tokenizer。概率是校准后的判断,不是绝对保证。模型始终可以重新调用工具。接近状态上限时,会因为重复发送完整状态而产生多次请求。需要有效的 TypeSafe API 密钥。总结fast-jev-compaction 把上下文压缩从“让大模型写摘要”变成了“让快速决策模型打分筛选”,真正做到了即时 + 无损。它既可作为独立 npm 库集成到任何代理框架,也能无缝替换 Claude Code 的内置压缩逻辑。
项目地址:https://github.com/tamaratran/fast-jev-compaction
如果你正在构建长上下文 AI 编程代理,这很可能是目前最实用的压缩方案之一。尝试一下,你会明显感觉到上下文压力的释放。