agentsview
面向AI编码代理的本地会话分析与成本追踪工具,支持Claude Code、Codex等20多种Agent,提供Web UI和CLI。亮点:比同类工具(如ccusage)快100倍,数据全本地存储,隐私安全;无需账号即可浏览、搜索和统计所有Agent的会话记录与token花费。
README
agentsview
浏览、搜索和追踪所有 AI 编码代理(coding agent)的使用成本。一个二进制文件,无需账户,一切本地运行。
安装
# macOS / Linux
curl -fsSL https://agentsview.io/install.sh | bash
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://agentsview.io/install.ps1 | iex"
或从 GitHub Releases 或通过 homebrew 下载桌面应用(macOS / Windows):brew install --cask agentsview
或运行已发布的 Docker 镜像:
docker run --rm -p 127.0.0.1:8080:8080 \
-v agentsview-data:/data \
-v "$HOME/.claude/projects:/agents/claude:ro" \
-v "$HOME/.forge:/agents/forge:ro" \
-e CLAUDE_PROJECTS_DIR=/agents/claude \
-e FORGE_DIR=/agents/forge \
ghcr.io/kenn-io/agentsview:latest
快速开始
agentsview serve # 启动服务器,打开 Web UI
agentsview usage daily # 打印每日成本摘要
首次运行时,agentsview 会发现您机器上所有受支持代理的对话,将它们同步到本地 SQLite 数据库中,并在 http://127.0.0.1:8080 打开 Web UI。
远程/转发访问
agentsview 绑定到 loopback 并验证请求的 Host 头,以防止 DNS 重绑定攻击。当您通过 SSH 端口转发、反向代理或远程开发环境(exe.dev、Codespaces、Coder、WSL2)访问时,浏览器发送的 Host 是服务器无法识别的,因此 /api/v1/settings 等 API 请求会被拒绝并返回 403 Forbidden。
要解决此问题,请使用与浏览器中打开的原始地址完全一致的 --public-url 重新启动服务器:
# 浏览器通过 `ssh -L 18080:127.0.0.1:8080 host` 打开 http://127.0.0.1:18080
agentsview serve --public-url http://127.0.0.1:18080
# 浏览器打开一个转发的主机名
agentsview serve --public-url https://your-workspace.exe.dev
使用 --public-origin(可重复使用或逗号分隔)来信任额外的浏览器源。如果将 UI 暴露到 loopback 之外,还启用 --require-auth。
Docker
容器镜像默认执行本地 agentsview serve。设置 PG_SERVE=1 可将启动命令切换为 agentsview pg serve。
docker-compose.prod.yaml 作为生产示例包含在内:
docker compose -f docker-compose.prod.yaml up -d
包含的 compose 文件将 agentsview 数据目录持久化到一个命名卷中,并以只读方式挂载了 Claude、Codex、Forge 和 OpenCode 的会话根目录。容器以 root 身份运行,因此建议使用命名卷作为 /data,而不是主机绑定挂载;如果确实要绑定挂载,请预先创建具有所需所有权的目录,以避免根用户所拥有的文件出现在您的主目录中。
示例仅将 UI 发布到 loopback(127.0.0.1)。如果需要将其暴露到 localhost 之外,请启用 --require-auth 并有目的地发布端口。
重要提示:容器化的 agentsview 实例只能发现您显式挂载到容器中的目录中的代理会话。如果您没有挂载代理的会话目录并将相应的环境变量指向它,该代理将不会出现在 UI 中。
示例 PostgreSQL 后端启动:
docker run --rm -p 127.0.0.1:8080:8080 \
-e PG_SERVE=1 \
-e AGENTSVIEW_PG_URL='postgres://user:password@postgres.example.com:5432/agentsview?sslmode=require' \
ghcr.io/kenn-io/agentsview:latest
示例 DuckDB 镜像启动:
# 从挂载的 SQLite 存档填充 /data/sessions.duckdb。
docker run --rm \
-v agentsview-data:/data \
-v "$HOME/.claude/projects:/agents/claude:ro" \
-e CLAUDE_PROJECTS_DIR=/agents/claude \
ghcr.io/kenn-io/agentsview:latest duckdb push --full
# 以只读方式提供服务。
docker run --rm -p 127.0.0.1:8080:8080 \
-v agentsview-data:/data \
ghcr.io/kenn-io/agentsview:latest duckdb serve
示例 Quack 启动:
# 从主机/容器通过 Quack 暴露本地 DuckDB 镜像。
QUACK_TOKEN="$(openssl rand -base64 32)"
docker run --rm -p 127.0.0.1:9494:9494 \
-v agentsview-data:/data \
ghcr.io/kenn-io/agentsview:latest \
duckdb quack serve \
--bind quack:0.0.0.0:9494 \
--token "$QUACK_TOKEN" \
--allow-insecure
# 从远程 Quack 端点提供 Web UI。
docker run --rm -p 127.0.0.1:8080:8080 \
-e AGENTSVIEW_DUCKDB_URL='quack:https://duckdb.example.com' \
-e AGENTSVIEW_DUCKDB_TOKEN="$QUACK_TOKEN" \
ghcr.io/kenn-io/agentsview:latest duckdb serve
将 Quack 保持在 loopback 或 TLS 后面。在非 loopback 绑定上的纯 HTTP Quack 需要 --allow-insecure,并且只应在受信任的隧道或反向代理后面使用。
Token 用量与成本追踪
agentsview usage 是 cusage 及类似工具的快速本地替代方案。它追踪所有编码代理(coding agent)的 token 消耗和计算成本——不仅仅是 Claude Code。由于会话数据已编入 SQLite 索引,查询比每次重新解析原始会话文件的工具快 100 倍以上。
# 每日成本摘要(默认:最近 30 天)
agentsview usage daily
# 按模型细分
agentsview usage daily --breakdown
# 按代理和日期范围过滤
agentsview usage daily --agent claude --since 2026-04-01
# 一行摘要,适用于 shell 提示符/状态栏
agentsview usage daily --all --json
agentsview usage statusline
功能:
- 通过 LiteLLM 费率自动定价(支持离线回退)
- 考虑提示缓存(prompt caching)的成本计算(缓存创建/读取 token)
- 使用
--breakdown按模型细分 - 日期过滤(
--since、--until、--all)、代理过滤(--agent) - JSON 输出(
--json)适用于脚本 - 考虑时区的日期分桶(
--timezone) - 独立工作——无需服务器,只需运行命令
每个会话的详细信息
agentsview session usage <id> 打印每个会话的 token 统计信息以及单个会话的成本估算。输出会报告该会话的总输出 token 数和峰值上下文 token 数,并在会话模型有定价时提供以美元计的成本估算(cost_usd)和是否有成本信息(has_cost)。成本是根据内部的输入/输出和缓存 token 计算的,但仅输出 token 和峰值上下文总数与成本一起报告。
# 打印特定会话的 token 用量和成本
agentsview session usage <id>
# JSON 输出适用于脚本
agentsview session usage <id> --format json
同样的每个会话用量数据也可从 REST API 获取:
GET /api/v1/sessions/{id}/usage
响应包含与 CLI JSON 模式相同的 session_id、agent、project、total_output_tokens、peak_context_tokens、has_token_data、cost_usd、has_cost、models 和 unpriced_models 字段。HTTP 响应还包括 server_running: true。现有会话即使 token 或成本数据缺失也返回 200;不存在的会话返回 404。
已废弃的别名 agentsview token-use <id> 仍可用于兼容性,现在也报告成本估算。
会话统计
agentsview stats 输出窗口范围的分析数据,包括记录会话的总计、原型(automation vs. quick/standard/deep/marathon)、会话持续时间分布、用户消息数量分布、峰值上下文分布、每轮工具数分布,以及缓存经济学、工具/模型/代理混合和时间维度的小时级细分。--format json 输出遵循版本化的 v1 模式(schema_version: 1),适用于下游消费者。
默认情况下,stats 仅读取本地 SQLite 存档。基于 git 的成果指标是可选的,因为它们在大型/缺失仓库中可能较慢或不稳定:使用 --include-git-outcomes 获取提交数/LOC数/文件更改数,使用 --include-github-outcomes 通过 gh 获取 GitHub PR 数量(这也会启用 git 成果)。
# 最近 28 天的人类可读摘要
agentsview stats
# 固定日期范围内的机器可读 JSON
agentsview stats --format json --since 2026-04-01 --until 2026-04-15
# 限制到一个代理并检查模式
agentsview stats --format json --agent claude | jq '.schema_version'
# 显式包含昂贵的本地 git 成果指标
agentsview stats --include-git-outcomes
会话浏览器
| 仪表板 | 会话查看器 |
|---|---|
![]() |
![]() |
| 搜索 | 活动热力图 |
|---|---|
![]() |
![]() |
- 全文本搜索:搜索所有消息内容(FTS5)
- Token 用量与成本仪表盘:Web UI 中每个会话和每个模型的成本细分、每日支出图表
- 分析仪表盘:活动热力图、工具使用情况、速度指标、项目细分
- 实时更新:通过 SSE 在活动会话收到新消息时实时更新
- 键盘优先导航(
j/k/[/]、Cmd+K搜索、?查看所有快捷键) - 导出:将会话导出为 HTML 或发布到 GitHub Gist
支持的代理
agentsview 自动发现以下所有代理的会话:
| 代理 | 会话目录 |
|---|---|
| Claude Code | ~/.claude/projects/ |
| Codex | ~/.codex/sessions/ |
| Copilot CLI | ~/.copilot/ |
| Gemini CLI | ~/.gemini/ |
| OpenCode | ~/.local/share/opencode/ |
| OpenHands CLI | ~/.openhands/conversations/ |
| Cursor | ~/.cursor/projects/ |
| Amp | ~/.local/share/amp/threads/ |
| iFlow | ~/.iflow/projects/ |
| Zencoder | ~/.zencoder/sessions/ |
| Zed | ~/Library/Application Support/Zed/ (macOS) |
| VSCode Copilot | ~/Library/Application Support/Code/User/ (macOS) |
| Pi | ~/.pi/agent/sessions/ |
| Qwen Code | ~/.qwen/projects/ |
| OpenClaw | ~/.openclaw/agents/ |
| QClaw | ~/.qclaw/agents/ |
| Kimi | ~/.kimi/sessions/ |
| Kiro CLI | ~/.kiro/sessions/cli/, ~/.local/share/kiro-cli/ |
| Kiro IDE | ~/Library/Application Support/Kiro/ (macOS) |
| Cortex Code | ~/.snowflake/cortex/conversations/ |
| Hermes Agent | ~/.hermes/sessions/ |
| WorkBuddy | ~/.workbuddy/projects/ |
| Forge | ~/.forge/ |
| Piebald | ~/.local/share/piebald/ |
| Warp | ~/.warp/ (平台相关) |
| Positron Assistant | ~/Library/Application Support/Positron/User/ (macOS) |
| Antigravity | ~/.gemini/antigravity/ |
| Antigravity CLI | ~/.gemini/antigravity-cli/ (见下方说明) |
每个目录都可以通过环境变量覆盖。详见配置文档。
Antigravity CLI:高分辨率转录
Antigravity CLI 会话现在以两种磁盘格式出现。较新的版本将对话轨迹存储为 SQLite .db 文件,agentsview 直接索引这些文件。较旧的版本将助手轮次和工具调用存储在 AES-GCM 加密的 .pb 文件中;对于这些会话,agentsview 回退到摘要模式,使用来自 history.jsonl 的提示以及 brain/(计划、遍历、检查点)下的任何纯文本工件。
要解锁较旧 .pb 会话的完整转录,请将 agy-reader 与 agentsview 一起运行。agy-reader 与本地 Antigravity 守护进程通信,解密每个会话,并在加密的 .pb 文件旁边写入一个 <uuid>.trajectory.json 侧车文件。agentsview 的文件监视器会自动检测侧车文件并解析它,取代摘要模式——无需重启 agentsview。
go install github.com/mjacobs/agy-reader@latest
# 为现有会话生成侧车文件...
agy-reader --sync
# ...或者在工作时保持它们新鲜。
agy-reader --watch
agy-reader 通过解析 ~/.gemini/antigravity-cli/cli.log 自动发现 Antigravity 守护进程的 URL。如果发现失败(例如日志已轮转),该命令会打印平台特定的说明以手动查找端口并导出 ANTIGRAVITY_DAEMON_URL。
侧车文件保留在您的机器上。agentsview 不会发起出站请求来生成或读取它们,并将侧车文件视为不受信任的结构化输入——有关信任模型,请参见 SECURITY.md。
PostgreSQL 同步
将会话数据推送到共享的 PostgreSQL 实例,用于团队仪表板:
agentsview pg push # 将本地数据推送到 PG
agentsview pg serve # 从 PG 提供 Web UI(只读)
自动推送(后台服务)
为了让共享的 PostgreSQL 数据库保持最新,无需手动运行 pg push,可以运行自动推送守护程序。它会监视您的会话目录,并在新会话记录后短时间内进行推送,并定期进行安全回退:
agentsview pg push --watch # 前台运行,按 Ctrl-C 停止
agentsview pg push --watch --debounce 1m # 自定义合并窗口
agentsview pg push --watch --interval 5m # 自定义回退间隔
该守护程序读取与 pg push 相同的 [pg] 配置,因此 PostgreSQL DSN 必须在配置文件中设置(或通过配置中的环境变量展开)。保护配置文件,因为它包含凭据:
chmod 600 ~/.agentsview/config.toml
要将其作为操作系统服务无人值守运行(macOS 上的 launchd,Linux 上的 systemd --user):
agentsview pg service install # 生成单元文件,启用并启动
agentsview pg service status # 显示管理器状态
agentsview pg service logs -f # 跟踪服务日志
agentsview pg service uninstall # 停止并移除
Linux 无头机器: systemd --user 服务在注销时停止,并且在未启用 lingering 的情况下不会在启动时启动。install 会检测到这一点并打印命令;您也可以自己运行:
loginctl enable-linger "$USER"
关于设置和配置,请参见 PostgreSQL 文档。
DuckDB 镜像与 Quack
DuckDB 支持是一个镜像后端,而不是本地 SQLite 存档的替代品。agentsview serve 仍然执行主要数据摄取到 SQLite。当您想要一个可移植的分析文件、从镜像进行只读本地服务,或通过 DuckDB 的 Quack 协议进行远程读取访问时,请使用 DuckDB。
agentsview duckdb push # 将 SQLite 镜像到 DuckDB
agentsview duckdb status # 显示镜像同步状态
agentsview duckdb serve # 从 DuckDB 提供 Web UI(只读)
agentsview duckdb quack serve # 通过 Quack 暴露本地 DuckDB 文件
agentsview duckdb serve 读取 [duckdb].path 或 AGENTSVIEW_DUCKDB_PATH。要从远程 Quack 端点提供数据,请设置 AGENTSVIEW_DUCKDB_URL 和 AGENTSVIEW_DUCKDB_TOKEN 替代。Quack 仍是较新的 DuckDB 协议,因此 agentsview 保持保守的默认值:本地 Quack 服务绑定到 loopback,需要 token,并拒绝非 loopback 的纯 HTTP(除非显式指定 --allow-insecure)。对于远程使用,建议使用 TLS 地址或通过经身份验证的隧道/代理访问 Quack。
后端模式:
- SQLite:主要本地存档、文件同步、FTS5 搜索和可写 UI。
- PostgreSQL:可选共享团队后端;从 SQLite 推送,只读服务。
- DuckDB:可选镜像文件或 Quack 端点;从 SQLite 推送,只读服务。
故障排除:
- 如果
duckdb push无法打开镜像,请确认二进制文件是使用适用于您平台的 DuckDB Go 驱动程序构建的,并且AGENTSVIEW_DUCKDB_PATH指向一个可写的文件位置。 - 如果 Quack 命令因扩展错误而失败,请更新 agentsview 二进制文件,使嵌入的 DuckDB 运行时包含 Quack 扩展。
- 如果远程连接失败,请检查 token、
quack:URL、TLS/代理终止,以及服务器是否有意使用--allow-insecure启动了非 loopback 的纯 HTTP 绑定。 - DuckDB 搜索目前使用子字符串/正则回退行为。 SQLite FTS5 仍是主本地服务的索引搜索路径。
隐私
agentsview 会在服务器启动时向 PostHog 发送一个有限的匿名 daemon_active 遥测 ping,并在运行期间每 24 小时发送一次,使用稳定的随机安装 ID 作为事件的 DistinctId。该事件包含 application=agentsview、应用版本、commit、操作系统和 CPU 架构,同时设置 $process_person_profile=false 和 $geoip_disable=true。它不包含会话、项目、提示、文件路径、账户或机器标识。可使用 AGENTSVIEW_TELEMETRY_ENABLED=0 或 TELEMETRY_ENABLED=0 禁用遥测。此外,在 Go 测试二进制文件中,遥测是硬性禁用的,与环境无关。
所有会话数据保留在您的机器上。服务器默认绑定到 127.0.0.1。更新检查是可选的,可以通过 --no-update-check 禁用。
文档
完整文档请访问 agentsview.io: 快速开始 -- 使用指南 -- CLI 参考 -- 配置 -- 架构
开发
需要 Go 1.26+(CGO)、Node.js 22+。
make dev # Go 服务器(开发模式)
make frontend-dev # Vite 开发服务器(与 make dev 同时运行)
make build # 构建包含前端嵌入的二进制文件
make install # 安装到 ~/.local/bin
make test # Go 测试(CGO_ENABLED=1 -tags "fts5,kit_posthog_disabled")
make bench-backends # 比较 SQLite、DuckDB 和 PostgreSQL 存储的读取性能
make lint # golangci-lint + NilAway
make nilaway # 通过自定义 golangci-lint 运行 NilAway
make e2e # Playwright E2E 测试
make bench-backends 需要 Docker。它会启动一个 PostgreSQL 容器(使用 testcontainers),将相同的 SQLite 测试数据镜像到 DuckDB 和 PostgreSQL,并基准测试共享的 db.Store 读取查询以进行相对比较。默认测试数据为 1,000 个会话和 64,000 条消息;使用 BENCH_BACKENDS_SESSIONS 和 BENCH_BACKENDS_MESSAGES_PER_SESSION 进行调整。当 Docker CLI 使用非默认套接字时,请在运行基准测试前为该套接字导出 DOCKER_HOST。
通过 prek 使用预提交钩子:克隆后运行 make lint-tools 和 make install-hooks(需要 prek 和 uv)。
项目结构
cmd/agentsview/ CLI 入口
internal/ Go 包(config, db, parser, server, sync, postgres)
frontend/ Svelte 5 SPA(Vite, TypeScript)
desktop/ Tauri 桌面包装
致谢
灵感来源于 Andy Fischer 的 claude-history-tool 和 Simon Willison 的 claude-code-transcripts。
许可证
MIT


