开源项目

agentsview

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

会话浏览器

仪表板 会话查看器
Dashboard Session viewer
搜索 活动热力图
Search Heatmap
  • 全文本搜索:搜索所有消息内容(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

开源项目kenn-io2026-06-11原文

相关内容