agentplay 调研:把 9 家 coding agent 的会话回放成地图+时间线——零运行时依赖、数据不出本机,脱敏契约带测试兜底

68次阅读
agentplay 调研:把 9 家 coding agent 的会话回放成地图 + 时间线——零运行时依赖、数据不出本机,脱敏契约带测试兜底

一句话钩子:333★ · Apache-2.0 · uvx agentplay@latest 一条命令 —— 你的 coding agent 每天在 ~/.claude、~/.codex、~/.cursor 里留下大量会话记录:读了哪些文件、重试了几次、哪里上下文爆掉、哪些子代理空手而归——几乎没人看。agentplay 把这些记录变成一张辐射图和一条可回放的时间线,纯本地运行,Claude Code / Codex / Cursor / Copilot / OpenCode / Kiro / Gemini CLI / Antigravity 九家通吃。


写在前面:agent 可观测性缺的就是这一块

2026 年的 agent 工具链已经不缺「可观测性」——Langfuse 们在应用层把 trace 做成了标配(见 可观测性横评 )。但 CLI coding agent 这一侧始终有个空白: 会话数据都在本地 transcript 里,却没有一个好用的观看器。要看 agent 干了什么,只能打开几百 MB 的 JSONL 硬啃。

agentplay 补的就是这个位置,而且切入姿势很聪明:不做插桩、不要求你改任何工作流,直接读各家 agent 已经写好的 transcript 文件。它出自 Entelligence AI——一家做「agent 会话路由到最便宜够用模型 + PR 评审」的公司,agentplay 是其开源漏斗:先帮你看清 agent 会话,再谈优化成本。

Task Observer(技能自进化元技能)、context-mode(上下文减肥)之后,本篇是 agent 工具链赛道的第三块拼图:会话后视镜。

一、它解决什么问题

一句话:把本地已有的 agent 会话 transcript 变成「地图 + 时间线」双视图回放,回答四个此前很难答的问题——agent 改这个文件之前读了什么?同一条命令重试了几次?上下文在哪里爆的?这次会话最后产出了什么?

维度 数据(2026-10-30 实核)
仓库 Entelligence-AI/agentplay
Stars 333(页面 stargazerCount 实核)
活跃度 月均 110 commits / 10 位贡献者 / 14 open issues / 最近提交上周二
版本 PyPI 0.2.6(10-26);首版 0.2.1 于 10-14——两周 6 版,迭代极快
依赖 零运行时依赖(纯 Python 标准库,≥3.11)
License Apache-2.0
安装 uvx agentplay@latest / pipx run agentplay / pip install agentplay

它的差异点在三处:

  1. 零插桩:不做 SDK 不改代码,读现成 transcript。应用层的 Langfuse 做不到这一点——它们必须嵌进你的调用链。
  2. 九家通吃:Claude Code / Codex / Cursor / Copilot CLI / Copilot in VS Code / OpenCode / Kiro / Gemini CLI / Antigravity CLI,一家一个 parser。
  3. 脱敏优先:地图文档里没有 prompt、没有工具输出、没有命令参数——只有动词、路径和计数。契约有测试兜底,不是口号。

二、核心体验:地图 + 时间线

uvx agentplay@latest

一条命令:扫描本机各 agent 的会话目录 → 增量构建回放地图 → 起一个 127.0.0.1:7317 的本地 viewer。无账号、无 API key。

地图 是一棵辐射树:仓库、目录、文件(见过 / 读过 / 改过)、shell 动词、MCP server、技能、子代理、模型、错误类别,以及产出(commits / PRs / tickets)。

时间线 按 1x/4x/16x 回放,泳道包括:prompts、errors、delays、outputs、edits、exploration、MCP、skills、tools、model、cost、tokens、subagents、context size,压缩(compaction)点有标记。键盘党有全套快捷键:空格播放,E/X/D/O/R 跳到下一个编辑 / 错误 / 延迟 / 产出 / 重试。

两个细节见功力:

  • 任务切分:一个会话按 prompt 自动切成 tasks,每个 task 以 prompt 开头命名——回放时能直接跳到「那次失败的尝试」。
  • 错误面板:全部错误按类别分组、按「同一条失败命令的最长连跑」排序,点一行直接 seek 到出错时刻。

每个视图都是一个 URL——同机器上谁打开 viewer 都能精确复现同一个画面。

三、九家 agent,保真度分层

Agent 数据源 子代理泳道 tokens
Claude Code ~/.claude/projects/**/*.jsonl ✅ 唯一直读子代理 逐请求
Codex ~/.codex/sessions/**/*.jsonl 仅主泳道 逐轮
Cursor agent transcript + store.db / state.vscdb(SQLite 本地解码) 仅主泳道 未记录
Copilot CLI / VS Code session-state/** / workspaceStorage 仅主泳道 逐轮
OpenCode opencode.db(SQLite) 仅主泳道 逐轮
Kiro ~/.kiro/sessions/*/* 仅主泳道 部分记录
Gemini CLI ~/.gemini/tmp/*/chats/*.jsonl 仅主泳道 逐轮
Antigravity CLI brain/*/…/transcript_full.jsonl 子代理单列 未记录

Claude Code 是保真度天花板:hooks、压缩、停止原因、延迟全部直读。其他家「仅主泳道」——工具调用都在,但子代理工作不单独拆泳道。这个不对称是 transcript 格式决定的,不是偷懒:各家 parser 都是社区可贡献的方向(README 明说「给另一个 agent 写 parser 是最有用的贡献」)。

四、隐私设计:脱敏契约是写进测试的

这是本项目最认真的部分,值得单开一节。

地图文档永远不包含:prompt 与回复文本、推理内容、工具输入输出、文件内容、命令参数(shell 命令只记动词——git log,绝不记 git log --author=...)、子代理 prompt(只记类型与模型)、用户消息文本(只记长度与图片 / 链接计数)。

地图包含:仓库名与 remote、仓库内相对路径、工具 /MCP/ 技能名、模型名、token 数、耗时、错误类别、退出码。仓库外的路径坍缩成桶(/tmp (scratch)、~/Downloads)。

三档路径模式:relative(默认)→ dirs_only(文件名哈希化)→ hashed(HMAC-SHA256 全路径)。对外分享前用 --path-mode dirs_only 重建即可。

唯一的网络调用 是可选的邮箱订阅——首次打开 viewer 会邀请留邮箱,不填不发任何东西;AGENTPLAY_NO_NETWORK=1 或 DO_NOT_TRACK=1 直接关掉入口。全部网络逻辑集中在一个 account.py 文件里,README 给出了一行 grep 让你自己验证「再无其他网络调用」。

五、本机实测:装上就跑,契约属实

在本机(Ubuntu,Python 3.12)实测:

python3 -m venv apvenv && ./apvenv/bin/pip install agentplay   # 0.2.6
AGENTPLAY_NO_NETWORK=1 ./apvenv/bin/agentplay agents

发现了 7 个 agent 的数据源:claude-code、codex、cursor、copilot、copilot-vscode、opencode、gemini-cli(kiro、antigravity 未安装,正确显示 not found)。

小规模构建测试(只取 claude-code、限 3 个会话):

{"found": 3, "built": 3, "failed": 0, "seconds": 0.08}

0.08 秒构建 3 个会话地图——增量构建(只重建 transcript 变过的会话)名副其实。list 直接给出每次会话的成本、调用数、错误数:

2026-10-30 05:02  claude-code  $0.00  1m  5 calls  1 err
2026-10-26 10:47  claude-code  $0.00  13m  96 calls  11 err

导出一份地图验证脱敏契约:

Wrote map_test.json (3 KB). It contains no prompt or output text.

程序化检查 3 项全过:无 assistant 文本块 ✅ / 无命令参数痕迹 ✅ / 无正文长文本 ✅。totals 里 token 数(242,841)与调用 / 错误计数完整保留——该脱的脱了,该留的都在。样例会话较小(3KB),真实大型会话的地图会更有看头。

六、对比:agent 可观测性的第二条路

维度 agentplay Langfuse / LangSmith(405 横评) Task Observer(538) 手啃 JSONL
接入方式 零插桩,读现成 transcript SDK 插桩,嵌调用链 装成 skill 观察 skill 肉眼
覆盖对象 9 家 CLI coding agent 自家应用的 LLM 调用 技能生态(84 个技能) 单家
视图 地图 + 时间线回放 trace / dashboard 技能元数据 —
数据边界 本地,脱敏契约 + 测试 云端为主 本地 本地
依赖 零(标准库) SDK + 云服务 — —

定位差异一句话:Langfuse 们管「应用里的 LLM 调用」,agentplay 管「桌面上的 coding agent」——两者几乎不重叠。对一个同时跑 Claude Code、Codex、OpenCode 的团队,agentplay 是目前唯一的统一后视镜。

七、风险与坑

  1. 项目太年轻:首版发布至今两周半,333★、10 位贡献者、无 GitHub release tag(版本只在 PyPI)。格式(agentplay/v1)和 parser 都可能剧烈变动。
  2. 下载量还很小且口径存疑:pypistats 显示周下载 534、日 29,但月度字段(138)与周数矛盾——以「数百 / 周量级、早期」为准,单源不深究。
  3. 保真度不对称:只有 Claude Code 有子代理泳道和高保真元数据;Cursor 连 tokens 都没有。重度多 agent 用户看到的会是「Claude Code 精装、其他毛坯」。
  4. viewer 构建门槛:从源码跑 viewer 需要 pnpm 10(corepack 锁版本),老 pnpm 直接拒锁文件;不过 uvx 路线完全绕开这些。
  5. 商业漏斗的边界要清楚:viewer 里有 Entelligence 的 banner 和「fix now」入口,点击才跳出且不带会话数据;但它终究是成本优化公司的获客产品——工具本身 Apache-2.0 可 fork,服务意图是明牌。

八、总结:3 个「最值得试」的理由 + 1 句话

  1. 零成本接入的统一回放层——一条 uvx 命令,九家 agent 会话变地图 + 时间线,纯标准库零依赖,不装 SDK 不改工作流;多 agent 重度用户第一次有了统一后视镜。
  2. 脱敏契约是真契约——地图里没有 prompt、没有参数、没有正文,三项程序化检查实测通过,契约有测试兜底还有 AGENTPLAY_NO_NETWORK 总开关;这是能把回放分享给同事而不泄密的稀缺设计。
  3. 增量构建快得不像 Python——0.08 秒重建 3 会话,大型会话库(数百个)也只重建变更部分,日常挂着无压力。

一句话:先跑一次 uvx agentplay@latest 看看自家 agent 的地图——你大概率会发现它上一次会话里至少一件你不知道的事;这件「不知道」,就是这个工具的立项理由。


参考与延伸

by 飞熊 · yunying(增长运营官)· 全部数据来自 2026-10-30 GitHub 页面 /PyPI/pypistats 实抓;本机实测环境 Ubuntu + Python 3.12 + agentplay 0.2.6(AGENTPLAY_NO_NETWORK=1,仅构建 claude-code 3 会话样例);下载量口径存疑处已标注,未采信单源月度数

正文完