Status: IMPLEMENTED (2026-08-05 — P1/P2/P3 落地:offline/session/provider 三子命令;P4 replay 待 RFC-0023,P5 online 待设计) Date: 2026-08-05 Scope: 本 repo 内新增
tools/aimux-clicrate——基于 aimux 构建的独立可运行二进制(client),第一版只做缓存探测业务(审计/诊断/调试指定 provider 的缓存能力),回放/通用调试子命令后续按需加 Related: RFC-0015 缓存命中探测(本 CLI 消费其数据与查询接口)、RFC-0023 录制与回放(离线数据源)、RFC-0024 会话聚合(session 级诊断)
缓存探测拆三层(见 RFC-0015 §1.2):① 探测本身进 core(常开 infrastructure,采集/判定/存储/查询接口),② 探测业务做独立 client,③ 告警外部消费。
为什么探测业务要做成独立 client 而非 SDK 集成:
- 两套逻辑:SDK 集成是库路径——开发者在自己的应用里调 aimux,
TraceLayer包一层,探测数据进RingTraceStore,然后自己消费。探测业务 client 是独立产物路径——直接 run 一个二进制,探测指定 provider 的缓存能力,不需要宿主应用。 - 调试工具定位:开发者想快速回答"这个 provider 的缓存到底靠不靠谱"——不该为此写一个应用,该有一个现成工具。
- 不污染库二进制:探测业务逻辑(审计/诊断/展示)进 core 会膨胀库、绑定业务判断;独立 crate 保持 core 纯净。
为什么 client 放在本 repo 内(而非独立 repo):aimux-cli 是 aimux 生态的调试产物,与 core 的探测接口强耦合(接口演进同步),放同一 workspace 便于协同开发与版本一致。它是 aimux 的"产物"(基于 aimux 构建的 client),不是 aimux 的一部分——aimux-core 不依赖它,它依赖 aimux-core。
- 独立可运行:
cargo run -p aimux-cli(或安装后aimux)即可用,不要求宿主应用集成。 - 薄 client:只做探测业务的消费逻辑,探测算法/判定/存储全在 core(RFC-0015)。
- 两种数据源:进程内查询(core 的
RingTraceStore查询接口)+ 离线 jsonl(coreexport_jsonl导出的 TraceRecord,或 RFC-0023 录制文件)。 - 面向调试:输出人可读报告(审计 summary / 链级命中演变 / prompt 结构诊断),不是机器 API。
- 渐进式:第一版只做缓存探测子命令,回放/通用调试后续按需加。
tools/aimux-cli/
├── Cargo.toml # package name = "aimux-cli",[[bin]] name = "aimux"
├── src/
│ ├── main.rs # 子命令分发(clap)
│ ├── probe/ # 缓存探测子命令
│ │ ├── mod.rs
│ │ ├── online.rs # 进程内数据源(连 core RingTraceStore 查询)
│ │ └── offline.rs # 离线 jsonl 数据源(读 export_jsonl 输出)
│ └── report.rs # 人可读报告渲染
加入 workspace members(Cargo.toml members 数组),[workspace.dependencies] 复用。
aimux cache-probe <SUBCOMMAND>
子命令:
online 进程内查询:连上宿主应用导出的探测数据(经 core 查询接口)
--provider <name> --model <id> --session <session_id> --since <ms>
offline 离线分析:读 core export_jsonl 导出的 TraceRecord jsonl
--file <trace.jsonl> --provider <name> [--session <session_id>]
session 会话级诊断:读离线 jsonl,输出指定 session 的链级命中演变
--file <trace.jsonl> --session <session_id>
provider 探测指定 provider 的缓存能力:直接调 aimux provider 发测试请求,
跑探测算法,输出该 provider 的缓存能力报告
--provider <name> --model <id> --api-key <env:VAR> [--base-url <url>]
第一版范围:offline + session + provider(调试指定 provider 缓存的核心诉求)。online(连活进程)后续——aimux 是库不是服务,没有常驻进程给 CLI 连,online 形态需再设计(可能经共享内存/Unix socket 或只留 jsonl 路径)。
| 数据源 | 内容 | 来源 | 用途 |
|---|---|---|---|
| TraceRecord jsonl(离线) | 探测哈希数据(指纹/usage/verdict) | core RingTraceStore::export_jsonl 或外部 TraceSink 落盘 |
offline/session 审计诊断 |
| 录制 jsonl(RFC-0023) | 明文完整上下文(输入/配置/HTTP) | core JsonlRecorder |
深查可疑 verdict 时拉明文跑完整 LCP;缓存可复现性验证(多次请求回放 + 探测对比) |
两者以 call_id 关联(RFC-0015 §8 协同)。CLI 的 provider 子命令是在线探测(直接调 provider 发请求),不依赖数据源。
CLI 只消费 core 暴露的接口(RFC-0015 §5.3),不实现探测算法:
| core 暴露(已设计) | CLI 消费方式 |
|---|---|
TraceRecord 结构(serde,jsonl 可读) |
offline 读文件反序列化 |
TraceStats / TraceFilter 聚合 |
offline --provider X 输出统计 |
SessionChainView / PrefixBreak |
session --session X 输出链级诊断 |
CacheAuditor / 判定规则(内置) |
provider 子命令:发测试请求 → 挂 TraceLayer + 内置 auditor → 读 verdict |
LanguageModel / provider()(aimux-providers) |
provider 子命令构造指定 provider 发请求 |
不消费(core 不暴露的,CLI 也不做):告警阈值决策(③外部)、调优建议生成、预判决策。
| RFC | 关系 |
|---|---|
| RFC-0015 | 主依赖。本 CLI 是 ① 探测本身的 ② 业务 client,消费其查询接口与 jsonl。 |
| RFC-0023 | 协同。离线深查用录制明文;缓存可复现性验证用请求回放 + 探测组合。 |
| RFC-0024 | 协同。session 级诊断消费 session_id 归组(离线 TraceRecord 自带 session_id)。 |
| RFC-0021 | 远期闭环。探测 verdict → 外部告警 → RouterModel 切换回放策略。CLI 只出数据,不做决策。 |
- 不做
online连活进程(aimux 是库,无常驻进程;形态待定,可能仅留 jsonl 路径)。 - 不做回放子命令(
replay属于 RFC-0023 的消费,第一版只做探测;后续按需加)。 - 不做通用调试子命令(单次 generate_text 调用调试)。
- 不做告警/报表(③外部消费;CLI 只输出人可读报告,不做持续监控)。
- 不做调优建议(自动改 prompt 提升命中是应用层逻辑)。
- 不实现探测算法(判定/LCP/存储全在 core,CLI 只消费)。
| 位置 | 改动 | 工作量 |
|---|---|---|
Cargo.toml |
workspace members 加 "tools/aimux-cli" |
1 行 |
tools/aimux-cli/Cargo.toml |
package + bin + deps(clap/tokio/aimux-core/aimux-providers/aimux-provider-utils/serde_json) | ~30 行 |
tools/aimux-cli/src/main.rs |
clap 子命令分发 | ~60 行 |
tools/aimux-cli/src/probe/offline.rs |
读 TraceRecord jsonl → 审计统计 + 报告 | ~200 行 |
tools/aimux-cli/src/probe/session.rs |
读 jsonl → session 链级诊断 + 报告 | ~150 行 |
tools/aimux-cli/src/probe/provider.rs |
构造 provider → 发测试请求 → 挂 TraceLayer + auditor → 报告 | ~200 行 |
tools/aimux-cli/src/report.rs |
人可读报告渲染(表格式) | ~100 行 |
| 测试 | 离线解析 + 报告 + provider 探测(用 cassette 或 mock) | ~200 行 |
合计:~700-900 行(第一版)。依赖 RFC-0015 的探测接口落地(core 先做,P0 改动)。
| 风险 | 等级 | 对策 |
|---|---|---|
| 依赖 RFC-0015 接口未落地 | 高 | CLI 第一版与 RFC-0015 的 core 实现协同开发;先做离线(jsonl)路径(只依赖 TraceRecord serde,依赖面最小) |
provider 子命令消耗真实 API 费用 |
中 | 默认用最短测试 prompt(单轮,~100 token);--max-requests N 限制;文档警示 |
online 形态不明(库无常驻进程) |
中 | 第一版不做 online;只做 offline(jsonl)+ provider(直接调)。online 待设计(共享内存/Unix socket/仅 jsonl) |
| CLI 与 core 版本漂移 | 低 | 同 workspace,版本一致;TraceRecord serde 是契约,改格式需同步 |
- 二进制命名:
aimux还是aimux-cli?建议aimux(命令短,与库 crate 名区分),但可能与将来别的 aimux 命令冲突——待定。 provider子命令的测试 prompt 设计:测缓存能力需要"两次相同前缀请求"验证命中(第一次写,第二次读)。用固定模板 prompt?还是可配?建议固定模板 +--prompt可覆盖。online形态:aimux 是库不是服务,CLI 怎么连进程内 RingTraceStore?候选:Unix socket / 共享内存 / 只留 jsonl(应用自己 export)。建议第一版只留 jsonl,online 取消或远期。- 报告格式:文本表格 vs JSON 输出?建议
--format text|json(text 给人,json 给脚本)。
| 阶段 | 内容 | 依赖 | 状态 |
|---|---|---|---|
| P1 | offline 子命令:读 TraceRecord jsonl → 审计统计 + 报告 |
RFC-0015 P0(core TraceRecord serde + export_jsonl) | ✅ 已实施(2026-08-05) |
| P2 | session 子命令:会话级诊断 + 报告 |
RFC-0015 P1(session_chain),RFC-0024(session_id) | ✅ 已实施(2026-08-05) |
| P3 | provider 子命令:直接调 provider 探测缓存能力 |
RFC-0015 P1(TraceLayer + auditor 落地) | ✅ 已实施(2026-08-05) |
| P4(后续) | replay 子命令(RFC-0023 消费)+ 通用调试 |
RFC-0023 落地 | 不做(第一版) |
| P5(待定) | online 形态(Unix socket / 共享内存 / 仅 jsonl) |
设计先行 | 待定 |
建议顺序:P1(离线审计,依赖面最小)→ P3(在线探测 provider)→ P2(会话诊断)。第一版交付 = P1 + P2 + P3,即 offline/session/provider 三个子命令。