tamaratran/fast-jev-compaction
Claude Code plugin that replaces the compaction summary with Jev decisions: every tool call and result is scored in one fast request, stale ones are dropped or truncated, everything kept stays verbatim.
fast-jev-compaction – 一个 Claude Code 插件和 npm 库
它做什么
- 当你使用 Claude Code 时,会话历史可能会变得非常大,因为每次 工具使用(例如
Read、Write)及其结果都会被完整保存。 - 内置的“压缩”功能通常会要求 LLM 对旧的对话回合进行 总结,这可能导致丢失重要细节,如文件路径或确切的错误消息。
fast-jev-compaction用一种 选择性修剪 过程取代了这种总结:它将 Jev 模型(一个 Typesafe LLM)用于判断每个工具调用和每个工具结果是否仍然需要。被判定为不必要的内容将被删除,其余内容则完全保留原样。
它是如何工作的
- 通过
tool_use_id将每个tool_use与其tool_result配对。第一条消息和最新的 N 条消息(可配置)被“固定”且永不修改。 - 构建一个包含整个对话(按时间顺序从最早开始)的 状态,但将每个结果替换为类似
ok, 4213 chars (omitted)的简短占位符。不会对文本消息进行任何总结。 - 通过逐步截断工具输入、缩写长文本、合并旧消息等方式,将状态调整至
maxStateTokens(默认 25k)的令牌预算内。 - 对每个非固定工具调用,向 Jev 发送两个是/否问题:保留该调用? 和 保留结果原文?。
- 将问题批量处理为尽可能多的请求,同时保持在
maxRequestTokens(默认 30k)以内。请求并发执行,结果合并。 - 应用阈值(
keepThreshold,默认 0.5):- 如果结果保留概率 ≥ 阈值 → 保留调用和结果。
- 否则如果调用保留概率 ≥ 阈值 → 保留调用,将结果截断为
truncateHeadChars(默认 300)字符加上注释。 - 否则 → 两者都删除。
- 重新组装消息列表,移除任何变为空的消息。输出中永远不会出现没有对应调用的结果。
安装
npm install fast-jev-compaction
export TYPESAFE_API_KEY=… # 你的 Typesafe (Jev) 密钥
基本用法(TypeScript)
import { compactMessages, reductionRatio, type Message } from 'fast-jev-compaction';
const transcript: Message[] = [
{ role: 'user', text: '修复失败的测试。不要编辑 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 });
console.log(result.messages, result.decisions, result.stats);
if (reductionRatio(result) < 0.25) {
// 压缩不足 – 回退到普通总结
}
compactMessages返回修剪后的消息列表、每项调用的决策和统计信息。- 高级用法:实现你自己的
JevAsker(提供ask(state, questions)方法),并调用底层的compact(messages, asker, options)。
配置选项(默认值显示)
| 选项 | 默认值 | 含义 |
|---|---|---|
apiKey |
process.env.TYPESAFE_API_KEY |
你的 Typesafe (Jev) API 密钥 |
model |
jev-latest |
要查询的 Jev 模型 |
baseUrl |
https://api.typesafe.ai/v1/systemone |
API 端点 |
goal |
最近的 3 个用户提示 | 包含在状态中的任务描述 |
keepThreshold |
0.5 |
保留调用/结果的概率阈值 |
preserveRecentMessages |
6 |
最新消息永不修剪(第一条消息始终保留) |
maxStateTokens |
25000 |
发送给 Jev 的状态的令牌预算 |
maxRequestTokens |
30000 |
每个请求的令牌预算(状态 + 问题) |
truncateHeadChars |
300 |
被删除结果中保留的字符数 |
限制
- 只有 工具 调用/结果可能被删除;用户/助手的纯文本在最终输出中从不缩短。
- 令牌计数是基于字符长度的粗略估计,而非真实分词器。
- 模型的概率分数不是保证;助手可以随时重新运行被删除的工具。
- 每次批量请求都会重新发送完整状态,因此非常长的历史可能产生大量 API 调用。
Claude Code 插件
- 仓库包含一个插件(
hooks/fast-jev.ts),可自动在 Claude Code 会话中运行此压缩。 - 通过 Claude Code 的市场安装:
claude plugin marketplace add tamaratran/fast-jev-compaction claude plugin install fast-jev-compaction@fast-jev-compaction - 安装后,
/compact命令(和自动压缩)将使用 Jev;弹出提示将显示修剪是否成功或回退到内置总结。
开发与演示
npm test使用假的 Jev 客户端运行单元测试(无网络)。demo/JevDemo是一个小型 SwiftUI macOS 应用,用于可视化修剪流程;它不调用真实 API,专为屏幕录制设计。
总结
fast-jev-compaction 为开发者提供了一种在保留所有重要工具交互的同时,丢弃真正不必要的历史记录的方法,避免了 Claude Code 通常执行的有损总结。它既可以作为普通 npm 包使用,也可以作为第一流的 Claude Code 插件使用。
相关
- 项目
- 项目
- 项目
- 项目