
OpenClaw Tokenjuice 插件用工具结果中间件压缩 exec/bash 输出【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw本文基于 Tokenjuice 插件参考文档 及其配套的 Tokenjuice 工具文档讲解 OpenClaw 中 tokenjuice 插件的安装、启用与关闭方式并深入源码剖析它如何通过agentToolResultMiddleware中间件在命令执行完成后压缩exec和bash工具的返回结果。读完后你将掌握 tokenjuice 的启用配置、安全策略safe-inventory policy以及状态合成、aggregated去重等中间件内部机制。插件定位压缩结果而不是重写命令tokenjuice 是一个可选的外部插件optional external plugin它的作用是在命令已经执行完之后把嘈杂的exec和bash工具结果压缩精简再回传给当前活跃的 agent 会话。参考文档给出的核心定义是Compacts exec and bash tool results with tokenjuice reducers.使用 tokenjuice reducer 压缩 exec 与 bash 工具结果。它的边界非常清晰这也是使用它时最重要的前提它改变的是返回的tool_result不是命令本身不重写 shell 输入、不重跑命令、不改变退出码exit code目前适用于 OpenClaw 内嵌运行embedded runs以及 Codex app-server harness 中的 OpenClaw 动态工具通过挂载 OpenClaw 的工具结果中间件tool-result middleware在输出回到 harness 会话之前裁剪掉噪声。分发方式与安装参考文档中「Distribution」一节给出的分发信息可以在插件的 package.json 中得到完整印证包名openclaw/tokenjuice安装路由npm 或 ClawHubClawHub 规格为clawhub:openclaw/tokenjuicenpm 规格为openclaw/tokenjuicedefaultChoice为npm最低宿主版本minHostVersion2026.5.28插件 API 兼容要求pluginApi 2026.9.3插件自身版本当前仓库2026.9.3运行时依赖上游tokenjuice包0.8.1从 package.json 的openclaw字段还可以看到插件入口声明为./index.ts且同时发布到 ClawHub 与 npmpublishToClawHub与publishToNpm均为true。安装只需一次openclaw plugins install clawhub:openclaw/tokenjuice安装或更新插件后需要重启 Gateway。启用与关闭配置启用插件有三种等价方式参考文档与插件 README 完全一致openclaw config set plugins.entries.tokenjuice.enabled true等价命令openclaw plugins enable tokenjuice如果偏好直接编辑配置文件{ plugins: { entries: { tokenjuice: { enabled: true, }, }, }, }关闭插件则反向操作openclaw config set plugins.entries.tokenjuice.enabled false或openclaw plugins disable tokenjuicetokenjuice 是严格opt-in的插件。测试用例 index.test.ts 中专门有一项 is opt-in by default它断言清单文件里enabledByDefault字段为undefined即插件默认不启用openclaw.plugin.json 同样没有声明enabledByDefault且activation.onStartup为false。如果你希望所有输出保持逐字原样verbatim直接禁用插件即可。另外值得注意的是openclaw.plugin.json 中的configSchema是一个additionalProperties: false的空对象——也就是说该插件没有提供任何可配置的参数启用/禁用本身就是它的全部配置面。SurfaceagentToolResultMiddleware 契约参考文档的「Surface」一节指出tokenjuice 暴露的唯一契约是agentToolResultMiddleware。这一点在插件清单与实际注册代码中都能确认openclaw.plugin.json 声明了运行时中立的契约归属contracts: { agentToolResultMiddleware: [openclaw, codex] }插件入口 index.ts 在register阶段将其落地import { definePluginEntry } from openclaw/plugin-sdk/plugin-entry; import { createTokenjuiceAgentToolResultMiddleware } from ./tool-result-middleware.js; export default definePluginEntry({ id: tokenjuice, name: tokenjuice, description: Compacts exec and bash tool results with tokenjuice reducers., register(api) { api.registerAgentToolResultMiddleware(createTokenjuiceAgentToolResultMiddleware(), { runtimes: [openclaw, codex], }); }, });这里有两处要点中间件同时注册到openclaw与codex两个运行时这与工具文档中适用于 OpenClaw 内嵌运行和 Codex app-server harness的描述相互印证测试 manifest.test.ts 专门校验了清单契约与注册参数的一致性runtimes: [openclaw, codex]防止运行时注册漂移。实际的压缩能力来自外部tokenjuicenpm 包插件通过 runtime-api.ts 一行再导出其 OpenClaw 嵌入扩展入口export { createTokenjuiceOpenClawEmbeddedExtension } from tokenjuice/openclaw;中间件内部机制normalizeDetails 与状态合成tool-result-middleware.ts 是理解 tokenjuice 行为的关键文件。createTokenjuiceAgentToolResultMiddleware()返回的中间件对每个tool_result事件做三件事。1. 只处理 exec / bash其余工具直接透传normalizeDetails开头即做守卫只有当toolName为exec或bash、且event.args.command是非空字符串时才会进入 details 归一化逻辑否则原样返回current.details。2. 删除重复的 aggregated 原始副本// Tokenjuice reads text content when aggregated is absent, then merges details // into its response. Drop the duplicate raw copy or compaction can exceed host limits. delete metadata.aggregated;从源码注释可以看出原因tokenjuice 在aggregated缺失时读取文本内容然后把 details 合并进响应。如果保留aggregated这份重复的原始输出副本压缩后的结果体积可能超过宿主对 middleware details 的体积上限。测试 passes through status metadata without duplicate aggregated output 验证了这一点即使输入 details 带有aggregated: pre-built output传给 tokenjuice 的 details 中也不会再包含该字段。3. 合成 canonical status 与 exitCode如果 details 里已经带有非空的status字符串中间件认为状态已是规范化的直接返回。否则会根据一组终止信号推断失败并合成状态const failed event.isError true || metadata.ok false || metadata.success false || metadata.timedOut true || Boolean(metadata.error) || (typeof rawExitCode number Number.isFinite(rawExitCode) rawExitCode ! 0); const exitCode typeof rawExitCode number Number.isFinite(rawExitCode) ? rawExitCode : failed ? 1 : 0; return { ...metadata, status: failed ? failed : completed, exitCode, };即isError、ok: false、success: false、timedOut: true、非空error、非零exitCode任意一项命中即判定为failed缺失数字退出码时按成败补1或0。index.test.ts 用一个参数化用例矩阵逐项覆盖了这些分支exitCode: 7 → failed/7、success: false → failed/1、ok: false → failed/1、timedOut → failed/1、error → failed/1、exitCode: 0 → completed/0、success: true → completed/0保证 bash 返回各种元数据形态时 tokenjuice 拿到的都是规范化的statusexitCode。4. cwd 解析与工作流合并中间件的工作目录解析遵循三级回退event.cwd非空→args.workdir非空字符串→process.cwd()。随后把事件交给 tokenjuice 注册的tool_resulthandlerhandler 若返回PartialOpenClawAgentToolResult则以新值覆盖、缺省保留旧值的方式合并content与details若最终对象与输入完全相同返回undefined表示未发生修改宿主可据此跳过后续处理。安全策略哪些结果会被压缩哪些保持原样工具文档明确给出了 tokenjuice 的安全清单策略safe-inventory policy这决定了它压什么、不压什么精确的文件内容读取保持原样逐字的文件读取结果不做压缩避免破坏 agent 对文件内容的精确感知独立仓库清点类命令可以压缩如git status这类输出冗长但结构可归纳的清点命令压缩后更短、更结构化不安全的混合命令序列保持原样难以安全判定的组合命令不会被压缩opt-in禁用插件即恢复全局逐字输出。验证插件是否生效参考文档给出的验证步骤如下启用插件启动一个可以调用exec的会话运行一条噪声较多的命令例如git status检查返回的 tool result 是否比原始 shell 输出更短、结构更清晰。从源码角度看一条成功的压缩链路在测试 keeps compacted exec results below the middleware details limit 中有端到端演示120KB 的原始content经过createAgentToolResultMiddlewareRunner运行中间件后变为compacted文本且 details 中带有tokenjuice: { compacted: true }标记——你可以把details中是否出现tokenjuice标记作为压缩确实发生的可验证依据之一。小结tokenjuice 是 OpenClaw 插件体系中一个职责单一、边界清晰的输出压缩插件以openclaw/tokenjuice分发通过agentToolResultMiddleware契约同时接入openclaw与codex两个运行时只改写exec/bash的返回结果而不触碰命令执行本身。安装一行命令、启用一个布尔配置、无需任何额外参数即可在保持精确文件读取与失败语义canonicalstatus/exitCode完整的前提下把冗长的 shell 输出压缩回会话上下文。深入细节可继续阅读 插件入口、中间件实现 与 测试用例。【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考