跳到主要内容

Tokenless Provider 接入参考

本页用于组件接入与维护。安装和日常使用请阅读用户指南。

可选的 Tokenless Provider 将已完成工具的模型可见文本替换为 Tokenless 按配置的可逆性 策略选中的压缩结果。AW 检查替换边界,不独立证明语义无损。 Qoder、OpenClaw、QwenPaw、Hermes、Pi、AgentScope SDK 2.0.6 及 Claude SDK 原生 Bash 共用一份 Provider 配置,支持 PreTool 重试建议 与 PostTool 压缩。Schema 压缩和授权恢复仍是独立能力。

安装与启用​

使用 AW Preview 包。aw-provider-tokenless 包含从同一源码提交 构建的桥接程序和 Tokenless CLI,以及固定到 b1c0dc00649c50fbe8930f849c800d4d6ca12091 的 RTK v0.49.0,附带 Tokenless 的 统计和 pytest 补丁。要求匹配的 aw-core;aw-all-in-one 将完全相同的组件内容 和回执与 core、sec-core 组合。无需 Python wheel 或 Tokenless 原生插件;Agent 安装及其运行依赖仍由用户准备。

RTK 位于不可变前缀内的 libexec/aw/providers/tokenless/rtk。源码 pin、setup 脚本、两份补丁、共享的 Tokenless home/path-policy 源文件与 Apache-2.0 许可位于 share/doc/aw-provider-tokenless/rtk, 它们和二进制的哈希均纳入 Tokenless 组件回执。provenance.json 记录上游与 ANOLISA 源码提交、各输入的来源和哈希,以及 RTK 复用 home/path-policy 模块的原因。 源码构建通过官方 setup 脚本创建本次 专用源码目录,保留已有 RTK 源码缓存与本地修改,打包后清理临时源码; 不替换用户 RTK 或全局 PATH。受管理 RTK 的安装前缀必须可编码到 PATH,不能包含 :;配置在发布前明确拒绝这种路径。 PostTool 不依赖 RTK。包生成的 PreTool 先校验受管理 RTK 及其直接父目录:两者必须 属于当前用户或 root,且不能允许所有用户写入;父目录必须是真实目录,不能是符号链接。 仅组可写不会被拒绝,与 Tokenless 的依赖信任规则一致。仅在 Tokenless 子进程的 受控 PATH 前加入其目录;重试建议使用绝对执行路径。受管理 RTK 缺失、被修改、 不可执行或不可用时,返回 Provider 错误并沿用已有 on_error 策略,不回退用户 RTK。 PostTool 和只读 view 继续工作。现有 view/schema 及其 unknown 就绪字段保持不变。

先安装 core,再把匹配的 Tokenless 扩展安装到同一前缀;也可以将 all-in-one 安装到新 前缀。Qoder/OpenClaw 使用 aw config init --provider tokenless,并提供既有 Agent 参数。选择 --provider sec-core+tokenless --socket ABS_FILE,可生成执行前 sec-core 检查,追加 PreTool,保留完成观察,并在既有 after 步骤末尾追加压缩。安装组件不会自动启用。 原有单独 sec-core 选项保持既有行为。

受支持的 target 接入时复制共用示例, 替换可执行路径,并将 RTK_SHA256_FROM_RECEIPT 替换为 PREFIX/.aw-packages/aw-provider-tokenless.json 中 RTK 条目的 sha256, 将两个 state 目录都放到不可变安装前缀之外。原生 profile 和各框架 启动参数见 AW 指南。

AgentScope SDK 的每个公共工厂都需通过 AwBridge 接线; SDK 生命周期示例 组合 sec-core 检查/观察与两项 Tokenless 操作。Python 和工厂设置见 SDK 启动合同。

Pi 使用 Pi 启动指南中的 SDK 应用工厂; 包配置生成器仍只面向 Qoder/OpenClaw。

Provider 私有配置只接受 {version: 1}。固定 argv 为 aw-provider-tokenless --cli ABS_FILE --data-dir ABS_DIR,可追加 --rtk ABS_FILE --rtk-sha256 HEX。包配置生成器从已校验的安装内容生成这两个参数; 不含它们的手写配置沿用 Tokenless 原生依赖发现。view 命令不包含这两个参数。 桥接通过 Protocol v2 调用 tokenless compress,为该子进程设置 TOKENLESS_DATA_DIR。CLI 统计使用 AW 提供的 Agent、Session 和工具调用标识。CLI 统计度量选中的压缩,不证明原生采用。

AW Journal 与 Tokenless 统计具有独立的内容留存边界。Tokenless CLI 默认开启 SQLite 统计和 SLS 日志,可由配置或继承的环境覆盖。产生压缩收益时,SQLite 统计可能将完整的 压缩前后工具文本写入 $TOKENLESS_DATA_DIR/stats.db,即使恢复能力为 none。 SLS sink 将指标和归属信息写入本地 JSONL,默认路径为 /var/log/anolisa/sls/ops/tokenless.jsonl;当前实现不将工具正文写入 SLS,也不执行上传。 若宿主运行 anolisa telemetry uploader 或 SLS/Logtail 采集,指标和归属标识可能由这些 组件另行上传;该通道仍不含工具正文。 如需关闭两个 sink,在启动 AW、绑定 Agent 之前设置 TOKENLESS_STATS_ENABLED=0 和 TOKENLESS_SLS_ENABLED=0。这两个开关不会删除已有记录。

PreTool 与权限行为​

生成模板和共用示例包含 tool.before → pre_tool,设置为 effects: [block] 和 on_error: report。受支持的 Shell 工具为 Bash、exec、terminal、shell、 run_shell_command 和 execute_shell_command(不区分大小写),且要求非空字符串 command。其他输入不调用 CLI,直接保持中立。 由 Tokenless 判断是否建议 RTK 命令;AW 阻断本次调用并向模型展示完整的重试参数, 不静默改写输入,不批准或执行命令。新调用必须重新经过 sec-core 与原生权限检查。 即使 PreTool 中立,扫描拒绝或失败仍然生效;外部 Hook 调度保持既有行为。

Tokenless 接入层从实际执行参数中识别独立的归属 RTK 包装,并将 output_optimization: rtk 传入 PostTool。重试可以使用不同于原阻断调用的 ID。 带引号或转义的参数字面量,以及符号链接状态目录,均保留该归属。支持的执行前缀为 字面环境变量赋值、env NAME=value ...、不带选项的 sudo、noglob、command、 exec,以及 shadowenv exec --;这些形式可以组合。其他包装形式(包括额外选项)、 裸 RTK 命令、外部归属或复合 Shell 命令不推断 RTK 归属。缺失 RTK、CLI 故障、非法 响应或超时按 on_error: report 报告,不会关闭 sec-core 的 on_error: block,也不 授予原生批准。仅需 PostTool 时,只删除 before 中的 rewrite-command 步骤,保留 共用 Provider 和 after 链。

本次恢复能力仍为 none。恢复入口、Stash、恢复作用域及恢复输出旁路由 Tokenless 接入层负责;启用 PreTool 不会自动获得这些能力或 Schema 压缩。

结果与故障行为​

框架模型可见结果替换入口
QoderPostToolUse → hookSpecificOutput.updatedToolOutput 字符串
OpenClaw下一次模型请求前的 registerAgentToolResultMiddleware
QwenPawActing middleware 返回的最终 AgentScope ToolResponse
Hermestransform_tool_result 最终字符串回调
Pi SDK原 callback 之后的 Core afterToolCall content override
Claude SDKPostToolUse → hookSpecificOutput.updatedToolOutput 原生 Bash envelope
AgentScope SDK 2.0.6公共工厂 Bridge 返回最终 ToolResponse

OpenClaw 要求 middleware API 和显式插件启用;AW 生成的原生 profile 声明 middleware 合同。观察型 after_tool_call 的返回值无法替换模型可见内容。

仅投影受支持的单个文本槽。Media、多个 Content Block、流式中间块以及未成功的工具 结果保持原样。替换保留原生 metadata 和 envelope 字段。Qoder 要求字符串替换,因此结构化 envelope 会序列化到该字符串中。 AW 通过启发式规则推断 content_origin。提取到命令时标为 command_output; 没有命令时,按工具名将已知 Shell 工具标为 command_output, 已知文件读取工具标为 file_content,其余标为 api_response。

Tokenless 会将 cat page.html 这类纯文件打印细化为 file_read,并用于统计。 file_read 保留适用的输出压缩并保护 HTML 源码;file_content 跳过压缩。

OpenClaw 的 after 事件 tool_name 统计和 AW Journal 元数据使用小写策略名 (例如 Bash 变为 exec);before 事件保留原名用于 sec-core 查找。跨阶段关联应使用 Session/工具调用 ID,而不是工具名。

恢复能力显式为 none,因此 Tokenless 只能采用无需授权恢复入口的允许候选。不追加 压缩副本或上下文消息。dry_run、no_savings 和不可用恢复均保留原结果。CLI 失败、 非法响应、身份不匹配、超时和输出超限属于 AW 故障,由 on_error: report 处理,原生 结果保留。AW 持久 Journal 仍仅记录元数据,不保存替换文本。

在 tool.after.steps 中保留既有完成观察和用户自定义 Hook,将压缩放在最后。 启用结果替换时,Qoder、QwenPaw、Hermes、Pi 和 AgentScope SDK 按声明顺序执行这些步骤,观察步骤看到原结果。 只有最后一个结构化步骤可以请求 replace_result;替换后还有启用步骤,或有第二个 替换步骤时,准入会拒绝。观察 Provider 保持原输入形态,只有替换 Provider 收到文本 投影。所有步骤共享一个事件截止时间;观察或用户 Hook 故障按 report 处理,预算 未耗尽时继续执行后续步骤。

Qoder 保留独立的原生回调,仅在 AW 服务内部约束自身 after 调用的顺序,不强制设置 原生 sequential,不改变外部 Hook 的调度。用户显式配置该选项时,仍遵循 Qoder 对整个匹配计划生效的原生语义。QwenPaw 和 AgentScope SDK 反向注册 after 链,使 middleware 解包时 保持配置顺序;Hermes 保留完成观察,并在原生最终结果转换阶段压缩。

OpenClaw 的原生完成事件发生在结果 middleware 之后,因此先压缩,再在原生 after 点位按配置顺序执行完成观察。观察保留原生 error、durationMs 等完成字段,结果 使用 OpenClaw 对压缩前内容的脱敏视图。两个阶段共享 AW 截止时间和单次执行声明。 同一插件实例的所有会话合计最多保留 32 个待观察的原结果快照,完成或会话结束时清理。 包含两个原生视图的序列化回调帧必须小于等于 1 MiB,因此可用工具文本大小更小,具体 取决于 JSON 转义和元数据。达到快照数量或帧大小限制时跳过压缩。 middleware API 缺失时警告并停用压缩,保留 before 阻断和原生完成观察。 启动回执报告 degraded: "result_middleware_unavailable",AW 输出 native hooks ready (degraded: result replacement unavailable),不因此导致启动失败。 回执仍统计配置步骤数,不表示缺失的替换 handler 已注册。AW 步骤列表之外的 Hook 仍由框架调度。 这些会话应禁用重叠的 Tokenless 原生插件,避免重复压缩和统计。

Provider 消息沿用 AW 的 1 MiB 限制,包括原事件和投影文本。若仅投影导致超限,AW 省略投影, 保留原事件的审计;压缩降级为不替换。CLI 调用共享剩余 AW 预算,并限制 stdout/stderr。Host 限制整个 Provider 进程;直接调用方必须关闭 stdin 并自行限制生命周期。

禁用 PostTool 时删除压缩步骤;仅在没有 PreTool 步骤继续引用时删除 Provider。 停止 AW 后用新配置重新启动。已有会话不会 热重载。外部 Tokenless state 目录按数据保留需求保留或删除。

Claude SDK 使用 AW 指南 中的显式 worker 工厂。单个 AW callback 已按顺序等待步骤。仅原生 Bash stdout 可替换,通过 PostToolUse 的 hookSpecificOutput.updatedToolOutput 返回原生 envelope;MCP 状态不可靠,结果保持原样。配置 AW replacement 时拒绝既有原生 callback 的输出改写。

Panel 只读查询​

桌面接入只读取一个快照,不解析私有配置,也不直接调用通用服务 RPC:

aw inspect --config /absolute/path/to/aw.yaml --json

使用匹配的 AW 二进制。新生成的 Tokenless 配置自动登记可选 view;已有配置需先退出 Agent、停止原服务,再离线编辑。在 Tokenless Provider 既有 transport 同级添加, 不要放进私有 config:

view:
protocol: aw-provider-view/v1alpha1
implementation: tokenless
transport:
type: stdio
location: agent
argv:
- /absolute/path/to/aw-provider-tokenless
- --view
- --cli
- /absolute/path/to/tokenless
- --data-dir
- /absolute/path/to/tokenless-state

CLI、数据目录和用户上下文应与压缩一致。当前只查询登记目录中的 stats.db; 非空 TOKENLESS_STATS_DB 或有效 DSH 别名覆盖返回 unsupported。AW 不直接读组件数据库。 缺库返回 no_data,不初始化空库。已有库通过公共 CLI 查询,可能发生迁移或维护, 不能理解为文件系统完全无写入。

快照版本为 aw-panel/v1alpha1,时间字段 generated_at_ms / observed_at_ms 使用 Unix 毫秒。内容包括服务状态、Provider 卡片和本次服务启动后最近最多 20 条完成步骤 元数据,新记录在前。服务重启清空该展示缓存,持久审计保持不变。离线查询不启动服务, 也不准备事件 Provider。health.summary 只确认配置;准入、原生就绪、后台存活状态 保持 unknown,采用状态保持 unverified。未登记 view 的 Provider 仍正常运行,指标显示 unsupported。

Tokenless 指标复用 stats summary --json --limit 200(schema 1.1)。窗口为组件 存储中筛除 dry-run 前的最近 200 条记录,可能含其他接入的数据。展示时标注该范围内的 选中候选估算收益,不称为今日、当前 Agent、计费或净收益。录制开关保持 unknown; 关闭录制后仍可能存在历史数据。快照不含工具正文、凭据、私有 argv、环境或配置; 组件原有留存策略仍适用。

view 失败只影响对应卡片。每 Provider 最多两秒,完整快照最多三秒,另有有界执行器 清理宽限;输出最多 1 MiB。客户端合并重复刷新,丢弃旧请求、旧配置/服务 generation 的响应,隐藏时暂停轮询,可见时最多每五秒刷新。此 CLI 不实现 GUI、批准或策略修改。 回退到旧 AW 二进制前,先离线删除可选 view 字段。

Schema 的 $defs/panel 定义快照;fixture 覆盖正常、离线、缺组件、无数据、部分失败和陈旧状态。 开发合同定义登记、错误和关联规则。

从源码构建​

在 Linux 上从仓库根目录执行:

cargo build --locked --manifest-path providers/tokenless/Cargo.toml
cargo build --locked --manifest-path src/tokenless/Cargo.toml -p tokenless-cli

将生成的 providers/tokenless/target/debug/aw-provider-tokenless 和 src/tokenless/target/debug/tokenless 路径填入共用示例。干净源码的 Preview 构建器 支持 --component tokenless 或 --component all。

常驻 Claude 客户端通过 aw_claude.create_sdk_mcp_server 接入进程内 MCP 结果。公开 handler 提供可靠 is_error,成功单文本块可压缩,错误、多块、媒体和结构化结果保留 envelope。详见受管 MCP 合同。Schema/BeforeModel 与 Retrieve 仍需独立能力准入和接点工作。