OpenHuman TokenJuice 智能 Token 压缩:Agent 工具输出进上下文前的多级内容感知压缩管道
发布时间:2026/9/10 2:59:41 作者:尧图编辑部 阅读量:1,286

OpenHuman TokenJuice 智能 Token 压缩Agent 工具输出进上下文前的多级内容感知压缩管道【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman导读LLM 的 Token 是成本而冗长的工具输出正是 Token 的主要消耗点。OpenHuman 在 Agent 的工具执行路径上内置了TokenJuice内容压缩路由任何工具结果在进入模型上下文之前都会被自动分类、路由到专门的压缩器必要时把完整原文卸载到可恢复缓存并记录省下的 Token 与费用。本文以 gitbooks/features/token-compression.md 为主体结合 src/openhuman/inference/tokenjuice/ 的宿主适配器与 src/openhuman/config/schema/tokenjuice.rs 的配置实现完整讲解压缩管道、七类专用压缩器、可选的 ML 压缩、CCR 缓存与检索、节省统计以及全部可调配置项。读完后你将掌握 TokenJuice 的运作原理、完整配置清单、RPC 与调试手段以及它如何在一次会话中成百上千次工具调用上累积上下文与成本收益。TokenJuice 是什么一个繁忙仓库里的git status、一段cargo build日志、一封 600 条消息的邮件线程、一个真实集群上的docker ps -a——每一类输出都可能以极低的信息增益撑爆上下文窗口。TokenJuice 就是为此设计的多级压缩路由在工具结果进入模型之前先对其分类七种内容类型为每种类型路由到专用压缩器可选地将完整原文卸载到可恢复缓存CCR记录每种压缩器、每个模型节省的 Token 与美元。它最初移植自 vincentkoc/tokenjuice 的 JSON 规则覆盖层那套规则引擎至今仍是 Log/命令压缩器的基础但如今它已发展成多级、内容感知的完整管道。在 OpenHuman 中压缩引擎本身以**独立模块TinyJuice**的形式存在vendor/tinyjuice/目录仅保留模块占位引擎通过 TinyBus 模块边界调用宿主侧只保留适配层、线格式契约与定价统计详见 src/openhuman/inference/tokenjuice/README.md。宿主适配器通过install_from_config在每次模块调用前安装配置mod.rs并依据配置指纹做去重安装避免重复下发。压缩管道七步逐段拆解每个流经 TokenJuice 工具输出适配器的内容块都走同一条路径raw tool result │ ▼ 1. Size gate router enabled? input ≥ min_bytes_to_compress (2 KB)? │ yes ▼ 2. Detect kind Json · Diff · Html · Search · Code · Log · PlainText │ ▼ 3. Select compressor one specialized compressor per kind ( per-kind toggles) │ ▼ 4. Compress run it; if it declines or grows the output, fall back / pass through │ ▼ 5. CCR eligibility lossy AND ≥ ccr_min_tokens (≈500)? → offload original to cache │ ▼ 6. Append marker ⟦tj:hash⟧ footer so the agent can retrieve the full original │ ▼ 7. Record savings tokens cost saved, by model and by compressor │ ▼ compact text → LLM context1. 尺寸闸门Size gate路由被禁用或输入低于min_bytes_to_compress默认2048 字节时直接透传小输出不值得压缩。2. 内容检测把内容块归类到七种ContentKind之一。判定优先级为显式 hint → MIME/扩展名标签 → 每工具先验如grep→ Search、git_operations→ Diff、run_tests→ Log→ 廉价的结构启发式JSON → Diff → HTML → Search → Code → Log → PlainText。检测路径上不做正则避免热路径开销。3. 压缩器选择每种类型路由到专属压缩器并遵循按类型开关search_enabled、code_enabled、html_enabled、ml_compression_enabled。4. 压缩执行压缩器运行如果它拒绝压缩或输出不小于输入则回退到通用压缩器或直接透传原文。TokenJuice 永远不会把结果变大。5. CCR 卸载对于有损压缩且原文足够大ccr_min_tokens默认约 500 token的场景完整原文被暂存到Compress-Cache-RetrieveCCR存储确保没有任何信息被永久丢弃。6. 恢复标记在压缩输出末尾追加携带规范标记⟦tj:hash⟧的页脚告诉 Agent 它看到的是局部视图以及如何取回剩余内容。7. 节省记账记录的节省 token 数与估算成本按模型和压缩器分别归账。管道在 Agent 循环中的实际位置从源码看TokenJuice 压缩被编排在 Agent 工具结果的中间件处理链中src/openhuman/agent/tinyagents/middleware_part_02.rs先做语义摘要progressive disclosure再执行 TokenJuice 内容感知压缩compact_output_with_policy最后才落到按工具声明的字符上限。压缩确实发生时中间件还会发出AgentEvent::Compressed事件携带压缩前后的估算 token 数供可观测性面板展示。宿主侧的compact_output_with_policymod.rs对每类失败都做了透传兜底——配置不可用、模块不可用、压缩失败全部优雅降级为原样返回。七类专用压缩器每种内容类型都有针对性的压缩器压缩器类型做什么SmartCrusherJSON把对象数组重渲染为紧凑表格超过约 40 行后保留头部 尾部 错误行 数值离群值。CodeCode保留签名与 import把深层函数体折叠为{ … N lines … }可用时用 tree-sitter否则用花括号深度启发式。保留TODO/FIXME/error/panic/unsafe标记。LogLog对命令输出委托给 JSON 规则引擎见下文对其他日志保留错误/警告/堆栈/摘要丢弃噪声。SearchSearch按文件分组 grep/ripgrep 的path:line:body命中按查询词密度排序每文件保留顶部匹配并统计[N more]。DiffDiff保留变更行与 hunk 头把长段未变更行折叠为锚点lockfile hunk 缩成一行A/-B摘要。HtmlHTML剥离标记为可读文本保留合理的块边界换行与实体解码分配轻量无 DOM。MlTextPlainText可选的 ML 显著性压缩见下节。Generic兜底对未匹配到具体规则的命令输出做头/尾摘要对结构化块拒绝压缩以保真。多字节文本CJK、emoji、组合符号全程按字素grapheme逐个处理绝不会在字符中间截断。与检测/压缩 hints 的配合RPC 控制器中compress支持五类 hint 字段schemas.rstool_name来源工具先验、mime、extension、querySearch 压缩器按查询词密度排序的关键输入以及explicit——唯一跳过检测、直接强制指定类型的字段。explicit传入无法识别的值会被拒绝而非忽略避免本想强制、却被静默重检测的歧义。可选 ML 压缩ModernBERT 显著性模型纯文本没有可利用的结构骨架高质量压缩需要学习型模型。TokenJuice 可以把纯文本路由到ModernBERTtoken 显著性模型给每个 span 打分并丢弃低信息量片段默认关闭需在[tokenjuice]中设置ml_compression_enabled true。本地运行作为共享 Python 运行时 sidecar 的kompress后端执行数据不出本机。Python 侧由OPENHUMAN_RPS_KOMPRESS_MODEL环境变量控制模型默认answerdotai/ModernBERT-base懒加载 tokenizer 与模型src/openhuman/runtime/python_server/server.py。可调参数ml_model_id默认answerdotai/ModernBERT-base、ml_target_ratio默认0.50–1 之间的目标压缩比、ml_max_input_chars默认200000、ml_devicecpu/auto、ml_sidecar_idle_timeout_secs默认 900 秒空闲后回收进程释放内存。优雅降级sidecar 不可用或输入超过字符上限时退化为原生压缩器绝不让 Agent 循环因 ML 压缩缺失而失败。宿主侧 ML 桥src/openhuman/inference/tokenjuice/ml/mod.rs是 TinyJuiceml_text压缩器调用的薄回调它在RwLock中持有配置快照而非OnceLock因此运行时通过tokenjuice.settings_update实时切换ml_compression_enabled无需重启即可生效。输入超过ml_max_input_chars、后端不可用或压缩结果无收益compressed_text为空或不小于原文时返回Ok(None)由调用方降级到原生压缩器。没有信息会丢失CCR 缓存与检索有损压缩通常意味着丢弃数据。TokenJuice 改为把完整原文卸载到Compress-Cache-RetrieveCCR存储并留下面包屑标记内存层始终开启以 SHA-256 哈希为键的进程全局存储受条目数max_cache_entries默认 256与总字节数max_cache_bytes默认 64 MiB双重限制FIFO 淘汰。磁盘层可选workspace/.tokenjuice/ccr/由ccr_disk_enabled开启可越过内存淘汰持久存活可选ccr_ttl_secs设置过期时间设为 0 表示不过期。恢复标记压缩输出以类似[compacted tool output — PARTIAL view; full original available via tokenjuice_retrieve with token …]的页脚结尾携带⟦tj:hash⟧token。该 token 是不可猜测的 SHA-256 摘要。tokenjuice_retrieveAgent 的放大镜工具Agent 默认拿到便宜的压缩视图只在真正需要时通过只读工具tokenjuice_retrieve透明地放大回看全文tools.rs。该工具接受标记中的 token兼容旧参数名hash可选range参数{start, end, unit}unit 为bytes或lines按字节或行取回原文切片权限级别为PermissionLevel::ReadOnly无副作用、无路径/网络访问未命中缓存时返回明确的缺失提示可能已被淘汰可重新运行原工具重新生成。宿主同时把tinyjuice_retrieve、tokenjuice_retrieve与旧名retrieve_tool_output都识别为恢复类工具名mod.rs保证兼容。节省跟踪token 与美元双重记账每次压缩都由 OpenHuman 的节省回调计量src/openhuman/inference/tokenjuice/savings.rsTokenJuice 上报事件与 token 差值OpenHuman 按每模型输入价格计价工具结果会作为输入 token 进入下一轮上下文因此使用输入单价见 src/openhuman/agent/cost.rs 中的input_per_mtok_usd聚合出total、by_model、by_compressor三组统计并持久化到workspace/state/tokenjuice_savings.json进程重启后仪表盘数据不丢归账模型优先取当前轮次的作用域模型通过with_turn_model在每轮run_turn_via_tinyagents_shared周围设置 task-localTURN_MODEL未设置时回退到配置的默认模型通过 RPCopenhuman.tokenjuice_savings_stats读取openhuman.tokenjuice_savings_reset清零。savings_stats返回结构含attributionModel、total、byModel、byCompressor以及 CCR 缓存的{entries, bytes}占用schemas.rs。规则覆盖层命令与日志输出最早的三层 JSON 规则覆盖依然驱动着 Log/命令压缩器。规则按顺序合并后一层覆盖前一层层路径用途内置随二进制发布约 96 条针对 git、npm、cargo、docker、kubectl、ls 等的 vendored 规则用户~/.config/tokenjuice/rules/个人覆盖全局生效项目.tokenjuice/rules/仓库级覆盖可提交进版本库与团队共享每条规则命名一个命令/工具模式与一种削减策略skip/keep 过滤器、strip-ANSI 与去重等变换、head/tail 摘要、命名计数器、固定消息。规则是 JSON新增一条即可生效无需重新编译。完整配置[tokenjuice]配置块所有配置都收敛在[tokenjuice]配置块src/openhuman/config/schema/tokenjuice.rs可在运行期热更新配置项默认值说明router_enabledtrue总开关为false时工具输出原样透传min_bytes_to_compress2048触发压缩的最小字节数尺寸闸门ccr_enabledtrue有损压缩是否卸载原文到 CCR 并输出⟦tj:hash⟧页脚关闭则压缩单向不可逆ccr_min_tokens500触发 CCR 卸载的最低估算 token 数ccr_disk_enabledfalse是否持久化原文到workspace/.tokenjuice/ccrmax_cache_entries256内存 CCR 最大条目数max_cache_bytes64 MiB内存 CCR 最大总字节数ccr_ttl_secsNone可选 TTL秒None表示不过期设置为0清除 TTLsearch_enabledtruegrep 搜索结果压缩器开关code_enabledtrueAST/启发式代码压缩器开关html_enabledtrueHTML→文本抽取器开关ml_compression_enabledfalseML 纯文本压缩Kompress开关需要runtime_python.enabledml_model_idanswerdotai/ModernBERT-baseML 压缩器 HuggingFace 模型 IDml_target_ratio0.5ML 目标压缩比0–1ml_sidecar_idle_timeout_secs900ML sidecar 空闲回收秒数ml_max_input_chars200000ML 压缩器接受的最大输入字符数超出回退原生压缩器ml_devicecpu推理设备cpu或auto宿主在启动时通过install_from_config把上述设置翻译为 TinyJuice 的CompressOptions并下发mod.rs磁盘层根目录仅在ccr_disk_enabled为真时按workspace_dir/.tokenjuice/ccr构造。热更新settings_update 部分补丁tokenjuice.settings_update接受任意字段子集的补丁config_patch.rs只修改出现在 JSON 中的字段UI 可以只翻一个开关而不必重发整个配置。补丁应用后会持久化配置、重新安装模块使路由开关、CCR 上限与阈值立即在线生效。几个特殊语义max_cache_entries/max_cache_bytes会被钳制到至少 1ccr_ttl_secs 0表示清除 TTLml_model_id空串被忽略。RPC、工具与调试所有能力都挂在openhuman.tokenjuice_*命名空间下schemas.rsRPC / 工具说明tokenjuice.detect检测内容类型json/code/log/search/diff/html/plain_text可带tool_name、extensionhinttokenjuice.compress对内容块干跑完整路由报告 applied、kind、compressor、lossy、原始/压缩字节、CCR token 与文本支持explicit硬覆盖tokenjuice.settings_get/settings_update读取 / 部分补丁当前配置更新后立即持久化并热应用tokenjuice.cache_statsCCR 缓存占用{entries, bytes}tokenjuice.retrieve按 token 取回已卸载原文tokenjuice.savings_stats/savings_reset读取 / 清零节省统计tokenjuice_retrieveAgent 工具只读恢复被卸载的原文支持 byte/line range这些控制器都是诊断性的不跑在每次工具输出的热路径上专供 CLI/调试面使用。调试时以 debug 级别启动核心RUST_LOGopenhuman_core::openhuman::inference::tokenjuicedebug即可观察检测、规则匹配以及每个内容块被削减了多少。为什么这很重要Agent 的生死系于上下文预算。一次工作会话会扇出几十上百次工具调用grep、构建、测试运行、git输出还有大段 web-fetch/scrape 结果。TokenJuice 就蹲守在这条工具执行路径上在每个结果落进上下文之前将其压缩让 Agent 可以横扫噪声仓库或长网页而不至于一步步撑爆窗口。节省量在会话中复利累积并以真实美元计量——最终反映在 Billing, Cost Usage 中。范围说明。TokenJuice 作用于 Agent 的工具结果不作用于后台 auto-fetch 摄取管道auto-fetch。构建 Memory Tree 的 20 分钟同步有自己的一套规范化与分块逻辑今天不会让负载流经 TokenJuice。延伸阅读Available Tools大多数重型工具输出都流经 TokenJuice。Memory Tree压缩输出的下游消费者。Billing, Cost UsageToken 节省最终以真金白银呈现的地方。TokenJuice 宿主适配器OpenHuman 侧适配层与 TinyJuice 引擎的分工边界。【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考