1. 项目概述:为什么我们需要一个统一的AI编程助手分析工具?

如果你和我一样,日常开发工作流里已经塞满了各种AI编程助手——Cursor用来重构代码,Windsurf在写新功能时提供灵感,Claude Code帮我调试复杂逻辑,VS Code Copilot则负责那些琐碎的补全。每个工具都在特定场景下表现出色,但问题也随之而来:我的对话历史、代码片段、甚至花费的API成本,全都散落在十几个不同的编辑器、IDE和命令行工具里。上个月我到底用了多少次Claude 3.5 Sonnet?哪个项目消耗的token最多?Windsurf和Cursor哪个在解决实际bug上更高效?面对这些问题,我发现自己只能凭模糊的记忆猜测,或者手动去翻找各个应用的日志——这显然不是工程师该有的工作方式。

Agentlytics就是为了解决这个痛点而生的。它是一个100%本地优先(Local-First)的分析工具,用一个命令就能把你所有AI编程助手的会话历史聚合起来,生成一个统一的分析面板。从会话数量、消息统计,到token消耗估算、模型使用分布,再到按项目和时间的深度钻取,所有数据都清晰可视。最关键的是,整个过程完全在本地进行,你的对话数据永远不会离开你的机器。这对于处理公司代码或敏感项目的开发者来说,是至关重要的安全底线。

这个工具目前主要面向macOS平台的开发者,支持包括Cursor、Windsurf、Claude Code、VS Code Copilot、Zed、OpenCode等在内的16种编辑器和AI助手。无论你是独立开发者想优化自己的AI订阅开销,还是团队技术负责人需要了解成员的AI工具使用情况,Agentlytics都能提供一个数据驱动的视角。

2. 核心设计思路:本地优先架构与数据归一化

2.1 为什么选择本地优先架构?

在决定构建Agentlytics时,我首先考虑的就是数据隐私问题。AI编程会话中可能包含未提交的代码片段、项目架构思路、甚至是业务逻辑的讨论——这些信息如果上传到第三方服务器,无疑会带来巨大的安全风险。因此, 本地优先 成为了不可妥协的设计原则。

整个工具链完全在用户本地运行:数据采集、缓存存储、分析计算、前端展示,所有环节都在你的机器上完成。这意味着即使你断网,依然可以查看历史分析报告;也意味着你可以用自己熟悉的工具(比如SQLite浏览器)直接查询底层数据。这种设计不仅保护了隐私,也给了技术用户最大的控制权和灵活性。

2.2 数据采集策略:适配器模式应对编辑器多样性

不同的AI编程助手存储数据的方式千差万别。Cursor将对话历史保存在 ~/Library/Application Support/Cursor/User/globalStorage 下的SQLite数据库中;Claude Code则使用JSON文件存储在 ~/.cursor-tutor 目录;Windsurf和Antigravity更特殊,它们的数据需要通过ConnectRPC从正在运行的语言服务器进程获取。

为了统一处理这种多样性,Agentlytics采用了经典的 适配器模式 。在代码的 editors/ 目录下,每个支持的编辑器都有一个独立的适配器模块(如 editors/cursor.js editors/claude-code.js )。这些适配器负责三件事:

  1. 探测编辑器是否存在 :检查特定的配置文件、目录或进程是否存在。
  2. 读取原始数据 :根据编辑器的存储方式(SQLite、JSON、RPC API)读取会话和消息数据。
  3. 转换为统一格式 :将所有编辑器的数据转换为Agentlytics内部的标准数据结构。

这种设计让添加对新编辑器的支持变得非常清晰:你只需要实现一个新的适配器,遵循统一的接口规范,剩下的聚合、分析、展示逻辑都能复用。

2.3 数据流与缓存机制

Agentlytics的数据流设计遵循“读取-转换-缓存-服务”的管道模式,确保性能和实时性的平衡:

编辑器文件/API → 适配器模块 → SQLite缓存 → Express REST API → React前端

第一次运行 时,工具会扫描所有已安装的编辑器,读取它们的原始数据,经过清洗和转换后,存储到本地的SQLite数据库(默认位置是 ~/.agentlytics/cache.db )。这个过程可能会花费几十秒到几分钟,取决于你的会话数量。

后续运行 时,Agentlytics会优先使用缓存数据,同时在后端启动一个增量更新检查:它只会重新扫描那些自上次缓存后可能发生变化的编辑器(通过检查文件修改时间戳或编辑器进程状态)。这种混合策略保证了仪表板的快速加载,同时又能反映最新的会话活动。

实操心得:缓存路径的自定义 默认的缓存路径在用户主目录下,但你可以通过环境变量 AGENTLYTICS_CACHE_DIR 来指定自定义位置。这在多用户共享机器或使用临时开发环境时特别有用:

export AGENTLYTICS_CACHE_DIR=/path/to/your/cache
npx agentlytics

3. 安装与快速上手:多种运行方式详解

3.1 Node.js环境下的标准安装(推荐)

对于大多数开发者,使用Node.js版本是最完整、功能最全的选择。Agentlytics要求Node.js版本不低于20.19或22.12,这是为了确保使用到最新的ES模块特性和性能优化。

一键启动完整仪表板:

npx agentlytics

这条命令会依次执行以下操作:

  1. 检查本地是否已安装Agentlytics,如果没有则自动从npm下载最新版本。
  2. 扫描所有支持的编辑器,读取会话数据。
  3. 在内存中构建SQLite缓存数据库。
  4. 启动一个本地Express服务器(默认端口4637)。
  5. 自动在默认浏览器中打开仪表板页面。

如果你更喜欢使用特定的包管理器,也可以选择对应的命令:

# 使用pnpm
pnpm dlx agentlytics

# 使用yarn
yarn dlx agentlytics

# 使用bun
bunx agentlytics

仅收集数据不启动服务器: 有时候你可能只想更新本地缓存,或者计划在无头(headless)服务器上运行扫描。这时可以使用 --collect 标志:

npx agentlytics --collect

这个命令会执行完整的数据扫描和缓存构建,但不会启动Web服务器或打开浏览器。这在自动化脚本或CI/CD流程中很有用,你可以先收集数据,稍后再启动服务查看。

3.2 Deno沙箱版:轻量级安全检查

如果你对运行第三方代码有安全顾虑,或者只是想快速查看一个摘要报告而不想安装任何东西,Deno沙箱版是绝佳选择。Deno默认的安全模型意味着代码需要显式声明权限才能访问系统资源。

从URL直接运行(零安装):

deno run --allow-read --allow-env https://raw.githubusercontent.com/f/agentlytics/master/mod.ts

这个命令会:

  • 从GitHub Raw直接下载最新的 mod.ts 单文件脚本
  • 只请求 --allow-read (读取文件系统)和 --allow-env (读取环境变量)两个权限
  • 扫描编辑器数据并直接在终端输出统计摘要

权限说明:

  • --allow-read :必要的,用于读取各编辑器的数据文件
  • --allow-env :必要的,用于读取环境变量(如用户主目录路径)
  • 没有 --allow-net :脚本不会进行任何网络访问
  • 没有 --allow-write :脚本不会写入任何文件(纯只读操作)

这种沙箱模式特别适合在安全敏感的环境中快速验证工具功能,或者集成到其他自动化流程中。

获取JSON格式输出: 对于想要将数据集成到自己工具链的开发者,可以添加 --json 标志:

deno run --allow-read --allow-env mod.ts --json

这会输出机器可读的JSON数据,方便用 jq 等工具进一步处理,或者导入到其他监控系统中。

3.3 从源码运行与开发模式

如果你想要贡献代码、添加对新编辑器的支持,或者只是想了解内部工作原理,从源码运行是必要的。

克隆仓库并安装依赖:

git clone https://github.com/f/agentlytics.git
cd agentlytics
npm install  # 或 pnpm install / yarn install

开发模式运行:

npm run dev

开发模式会同时启动后端服务器和前端开发服务器,并启用热重载。任何对源代码的修改都会实时反映在运行的应用中。

构建生产版本:

npm run build
npm start

这会构建优化的前端资源,然后启动生产服务器。适合在本地长期运行仪表板。

注意事项:端口冲突处理 Agentlytics默认使用4637端口。如果该端口已被占用,你可以通过环境变量指定其他端口:

PORT=8080 npx agentlytics

或者对于Deno版本:

deno run --allow-read --allow-env --allow-net mod.ts --port 8080

4. 仪表板功能深度解析:从宏观趋势到微观会话

4.1 概览面板:你的AI编程全景图

启动Agentlytics并打开浏览器后,首先看到的是概览面板。这里不是简单的数字堆砌,而是经过精心设计的 数据仪表盘 ,让你在30秒内掌握全局。

核心指标卡片 显示在顶部:

  • 总会话数 :所有编辑器中AI对话的总次数
  • 总消息数 :用户消息和AI回复的总条数
  • 活跃项目数 :检测到的不同代码项目数量
  • 使用编辑器数 :你实际使用了多少个不同的AI编程工具

这些数字旁边通常会有趋势箭头(↑↓),显示与上周或上月的对比,让你一眼看出使用量是在增长还是下降。

编辑器分布环形图 直观展示了各个工具在你的工作流中的占比。我最初以为Cursor是我的主力,但数据告诉我,在调试场景下我使用Claude Code的频率远超预期。这种客观反馈能帮助你更理性地评估每个工具的实际价值,而不是依赖主观感受。

活动热力图 可能是最有洞察力的功能之一。它模仿GitHub贡献图,用颜色深浅展示你每天使用AI编程助手的活跃程度。鼠标悬停在任何一天上,会显示具体的会话和消息数量。我发现自己的热图有明显的模式:周一到周四密集,周五较少,周末几乎空白——这正好匹配我的工作节奏。

4.2 会话浏览器:搜索、过滤与上下文回顾

当概览面板让你发现了有趣的现象(比如“为什么周三的token消耗异常高?”),下一步就是深入查看具体的会话。Agentlytics的会话浏览器提供了强大的搜索和过滤能力。

多维度过滤

  • 按编辑器 :只看Cursor的会话,或对比Windsurf和Claude Code的对话质量
  • 按时间范围 :查看特定日期、本周、本月或自定义时间段的会话
  • 按项目路径 :聚焦于某个特定代码库的所有AI交互
  • 按模型 :筛选只使用GPT-4o或Claude 3.5 Sonnet的对话
  • 按token数量 :找出那些“长篇大论”的高成本会话

全文搜索 是真正的杀手锏。你可以在所有会话的所有消息中搜索关键词。比如搜索“TypeScript interface”,就能找到所有涉及类型定义讨论的对话。这对于回忆几个月前某个特定问题的解决方案特别有用——比在文件系统或笔记应用中搜索要高效得多。

会话详情视图 采用了侧滑面板设计,不会打断你的浏览流。点击任何会话,右侧会滑出一个面板,完整展示该对话的所有消息,包括:

  • 用户的问题或指令(通常包含代码片段)
  • AI的回复(带语法高亮的代码块)
  • 使用的工具调用(如文件读取、终端命令执行)
  • 消息的时间戳和token计数

这个视图保留了原始的对话格式,让你能重新理解当时的上下文。我经常用它来复盘:为什么某个重构建议被采纳了?为什么另一个建议被拒绝了?这种回顾对提升使用AI的效率很有帮助。

4.3 成本分析:将token消耗转化为实际开销

对于使用按token计费的AI服务(如OpenAI API、Anthropic Claude API)的开发者来说,成本控制是个现实问题。Agentlytics的成本分析模块将抽象的token数字转化为更直观的美元估算。

成本估算原理 : 工具内置了各AI提供商的最新定价数据(会定期更新)。当你使用某个模型时,Agentlytics根据以下公式估算成本:

输入token成本 = 输入token数 × 模型每千token输入价格 ÷ 1000
输出token成本 = 输出token数 × 模型每千token输出价格 ÷ 1000
会话总成本 = 输入token成本 + 输出token成本

成本分析维度

  1. 按模型分解 :显示GPT-4o、Claude 3.5 Sonnet、Gemini Pro等模型各自消耗了多少预算。你可能会惊讶地发现,某些“便宜”模型因为使用频率高,总成本反而超过了“昂贵”但少用的模型。
  2. 按编辑器分解 :对比不同编辑器的成本效率。也许Cursor的对话更精准,平均每次会话成本更低;而Windsurf的探索性对话更长,单次成本更高。
  3. 按项目分解 :识别哪些代码库是“成本黑洞”。某个遗留项目可能因为复杂的代码结构,需要更多的AI解释和重构建议。
  4. 按月趋势 :观察成本随时间的变化。新项目启动阶段成本通常较高,随着代码库稳定和团队熟悉,成本应逐渐下降。

实操心得:成本估算的局限性 需要明确的是,这些是 估算值 而非精确账单,原因有几点:

  1. 有些编辑器(如Cursor专业版)使用定额订阅而非按token计费
  2. 企业协议可能有定制价格,与公开定价不同
  3. 某些操作(如工具调用)可能产生额外计费 因此,最好将Agentlytics的成本分析看作相对比较工具,而不是绝对财务数据。它的真正价值在于帮你识别异常模式和优化机会。

4.4 项目分析:聚焦代码库级别的AI交互

现代开发工作通常涉及多个项目并行。Agentlytics的项目分析功能让你能深入每个代码库,了解AI在其中扮演的角色。

项目卡片视图 列出了所有检测到的项目,每个卡片显示:

  • 项目路径和名称(从git仓库或目录名推断)
  • 在该项目中的总会话数和消息数
  • 使用的编辑器分布
  • 消耗的token总数和估算成本
  • 最近活动时间

项目详情页 提供了更深入的分析:

  • 会话时间线 :项目生命周期中AI使用的高峰和低谷期
  • 常用模型分布 :该项目中偏好使用哪些AI模型
  • 工具使用热图 :AI在项目中调用了哪些工具(文件操作、终端命令等)
  • 代码变更关联 (实验性):尝试将AI会话与git提交时间关联,分析AI建议对实际代码的影响

我发现这个功能对团队技术负责人特别有价值。你可以快速查看:

  • 新项目是否过度依赖AI生成样板代码?
  • 老项目是否因技术债务需要频繁咨询AI?
  • 不同团队成员在相同项目中是否有一致的AI使用模式?

4.5 深度分析:工具、模型与token的微观洞察

除了宏观统计,Agentlytics还提供了多个维度的深度分析视图,满足数据爱好者的探索欲望。

工具调用分析 : AI编程助手不仅仅是聊天机器人,它们能调用各种工具:读取文件、执行命令、搜索网络等。这个视图展示了:

  • 最常调用的工具排名
  • 各编辑器的工具使用偏好对比
  • 工具调用的成功率(是否有错误或超时)
  • 工具调用与最终代码质量的相关性分析

模型分布与演进 : 随着AI模型快速迭代,你的使用习惯也在变化。这个时间线视图显示:

  • 从GPT-3.5到GPT-4o的迁移轨迹
  • Claude模型各版本的采用率
  • 多模型策略:何时使用“便宜快速”模型,何时切换到“昂贵但强大”模型
  • 模型混用的效果评估

token消耗分解 : token是AI计算的“货币”。这个视图从多个角度分解token使用:

  • 输入vs输出token比例(通常输出更贵)
  • 代码token vs自然语言token比例
  • 按会话类型的token效率:调试会话、重构会话、新功能开发会话
  • token使用的“帕累托分析”:20%的会话是否消耗了80%的token?

5. Relay功能:团队协作与知识共享

5.1 Relay的设计哲学:安全第一的团队协作

单个开发者的AI使用数据已经很有价值,但当一个团队的数据聚合在一起时,能产生更强大的洞察。然而,团队环境对数据安全的要求更高。Agentlytics的Relay功能正是为此设计:它允许团队成员在 完全可控 的前提下共享AI会话上下文。

Relay的核心原则:

  1. 选择性共享 :每个成员自主决定共享哪些项目的会话
  2. 本地中继 :数据通过本地网络传输,不经过任何第三方服务器
  3. 密码保护 :可选的密码验证确保只有授权成员能加入
  4. 实时同步 :数据定期同步,保持团队视图的更新

5.2 设置Relay服务器

启动Relay服务器非常简单,只需要一个额外的标志:

npx agentlytics --relay

这会在4638端口启动一个Relay服务器(注意不是仪表板的4637端口)。服务器启动后会显示连接信息:

⚡ Agentlytics Relay

Share this command with your team:
  cd /path/to/project
  npx agentlytics --join 192.168.1.16:4638

MCP server endpoint (add to your AI client):
  http://192.168.1.16:4638/mcp

添加密码保护 : 对于需要更高安全性的团队,可以设置密码:

RELAY_PASSWORD=your_secure_password_here npx agentlytics --relay

所有客户端连接时都需要提供相同的密码。

5.3 客户端加入与数据同步

团队成员在项目目录下运行加入命令:

cd /path/to/your-project
npx agentlytics --join 192.168.1.16:4638

如果是密码保护的Relay:

RELAY_PASSWORD=your_secure_password_here npx agentlytics --join 192.168.1.16:4638

加入过程是交互式的:

  1. 工具会自动检测当前目录下的git仓库,将其作为项目标识
  2. 列出检测到的所有项目,让你选择要共享哪些
  3. 确认后,客户端开始每30秒同步一次数据到Relay服务器

用户名识别 : 默认情况下,客户端会使用git配置中的邮箱地址作为用户名。你也可以手动指定:

npx agentlytics --join 192.168.1.16:4638 --username "alice.dev"

5.4 MCP集成:让AI助手访问团队知识库

Relay最强大的功能之一是暴露为MCP(Model Context Protocol)服务器。这意味着你可以将Relay端点添加到支持MCP的AI客户端(如Claude Desktop、Cursor),然后直接向AI提问团队相关的编程问题。

配置示例 (以Claude Desktop为例): 在Claude Desktop的MCP配置文件中添加:

{
  "mcpServers": {
    "team-agentlytics": {
      "command": "npx",
      "args": ["-y", "agentlytics-mcp-client"],
      "env": {
        "RELAY_URL": "http://192.168.1.16:4638/mcp"
      }
    }
  }
}

可用的MCP工具

  1. list_users - 查看所有连接的团队成员及其共享的项目
  2. search_sessions - 在所有团队成员的会话中全文搜索
  3. get_user_activity - 获取特定成员最近的AI编程活动
  4. get_session_detail - 获取特定会话的完整对话内容

使用场景示例

  • 新成员Alice加入项目,可以问AI:“团队之前是如何处理身份验证的?”
  • 遇到一个棘手bug,可以问:“有没有人问过AI关于这个错误的问题?”
  • 代码评审时,可以查:“这个文件的历史重构建议有哪些?”

5.5 REST API与健康监控

除了MCP接口,Relay还提供简单的REST API,方便集成到其他工具中:

端点 方法 描述
/relay/health GET 健康检查,返回活跃用户数
/relay/users GET 列出所有连接的用户和他们的项目
/relay/search?q=<查询> GET 跨用户搜索消息
/relay/activity/:username GET 获取指定用户的活动
/relay/session/:chatId GET 获取完整会话详情
/relay/sync POST 客户端同步数据(内部使用)

这些API返回JSON格式数据,可以用curl直接调用,或集成到团队的监控面板中。

注意事项:网络环境与性能 Relay设计用于可信的本地网络环境。如果团队成员在远程工作,建议通过安全的VPN连接。另外要注意,同步大量历史数据可能会产生显著的网络流量。首次同步后,增量更新通常很小。

6. 支持的编辑器详解与适配策略

6.1 编辑器支持矩阵

Agentlytics目前支持16种编辑器和AI编程助手,覆盖了主流的开发工具生态。但“支持”的程度有所不同,主要分为三个级别:

完全支持 (✅消息、✅工具、✅模型、✅token):

  • Cursor - 通过SQLite数据库读取完整会话历史
  • Claude Code - 通过本地JSON文件读取
  • VS Code / VS Code Insiders - 通过扩展存储API读取
  • OpenCode - 类似VS Code的存储机制
  • Codex CLI - 解析命令行日志文件
  • Gemini CLI - 解析命令行日志文件

部分支持 (✅消息、✅工具、✅模型、❌token):

  • Zed - 能读取会话但token计数不准确
  • Goose - 工具和模型信息完整,但token数据缺失
  • Kiro - 同上,token数据不可用

有限支持 (✅消息、❌工具、❌模型、❌token):

  • Cursor Agent - 只能检测到基本会话
  • Command Code - 工具信息有限,无模型数据

运行时依赖

  • Windsurf / Windsurf Next / Antigravity - 需要应用正在运行,通过ConnectRPC获取数据

6.2 数据采集的技术挑战与解决方案

每个编辑器的数据采集都面临独特挑战,Agentlytics采用了多种技术策略应对:

SQLite数据库读取 (Cursor、部分VS Code扩展): 这是最理想的情况。SQLite是自包含的数据库文件,Agentlytics可以直接打开并查询。挑战在于不同版本可能修改数据库模式,所以需要版本检测和兼容性处理。

// 简化版的Cursor适配器示例
async function readCursorSessions() {
  const dbPath = path.join(os.homedir(), 'Library/Application Support/Cursor/User/globalStorage/cursor.sqlite');
  const db = new Database(dbPath, { readonly: true });
  
  // 查询会话和消息
  const sessions = db.prepare(`
    SELECT id, created_at, model, token_count, project_path
    FROM chats
    ORDER BY created_at DESC
  `).all();
  
  // 需要处理可能的模式版本差异
  const hasTools = await checkTableExists(db, 'tool_calls');
  
  db.close();
  return normalizeSessions(sessions);
}

JSON文件解析 (Claude Code、部分CLI工具): JSON文件更易读但可能很大。Agentlytics使用流式解析和增量读取来避免内存问题。另一个挑战是JSON结构可能随版本变化,需要灵活的解析逻辑。

进程间通信 (Windsurf系列): 这是最复杂的场景。Windsurf不将完整历史存储在磁盘上,而是通过语言服务器进程管理。Agentlytics需要:

  1. 检测Windsurf进程是否运行
  2. 通过ConnectRPC与语言服务器通信
  3. 请求历史数据并转换为统一格式 这种方式的缺点是必须保持编辑器运行,且RPC接口可能不稳定。

日志文件分析 (命令行工具): 像Codex CLI、Gemini CLI这样的工具将会话记录在日志文件中。Agentlytics需要解析这些半结构化的文本,提取会话边界、消息内容和元数据。正则表达式和状态机是这里的关键技术。

6.3 添加对新编辑器的支持

如果你使用的编辑器不在支持列表中,可以按照以下步骤添加支持:

  1. 研究数据存储位置

    • 在macOS上,用户数据通常位于 ~/Library/Application Support/ ~/Library/Preferences/ ~/.config/
    • 使用 lsof 命令查看运行中编辑器打开的文件
    • 检查是否有SQLite数据库、JSON配置文件或日志文件
  2. 创建适配器文件 : 在 editors/ 目录下创建新的js文件,实现标准接口:

    export const editorName = 'YourEditor';
    export const displayName = 'Your Editor';
    
    export async function isAvailable() {
      // 检查编辑器是否安装/可用
    }
    
    export async function getSessions(options = {}) {
      // 读取并返回标准化格式的会话数据
      return {
        editor: 'YourEditor',
        sessions: [...],
        version: '1.0.0'
      };
    }
    
  3. 标准化数据格式 : 无论原始数据格式如何,最终都要转换为:

    {
      id: 'unique-session-id',
      editor: 'EditorName',
      model: 'gpt-4o', // 或null
      timestamp: '2024-01-15T10:30:00Z',
      projectPath: '/path/to/project',
      messages: [
        {
          role: 'user', // 或 'assistant', 'system', 'tool'
          content: '如何优化这个函数?',
          tokens: { input: 20, output: 0 } // 可能为null
        }
      ],
      tools: ['file_read', 'command_execute'], // 可能为空数组
      tokenCount: 150 // 可能为null
    }
    
  4. 测试与优化

    • 使用真实数据测试适配器
    • 处理边缘情况(损坏的文件、权限问题、版本差异)
    • 优化性能,特别是处理大量历史数据时

实操心得:处理版本兼容性 编辑器的数据格式经常会变。好的适配器应该:

  1. 检测数据版本并应用相应的解析逻辑
  2. 优雅地处理缺失字段(提供默认值或null)
  3. 记录无法解析的数据以便调试
  4. 提供降级方案:即使不能读取完整数据,也尽量读取基本信息

7. 常见问题排查与性能优化

7.1 安装与运行问题

问题:Node.js版本不兼容

Error: Agentlytics requires Node.js version >= 20.19.0 or >= 22.12.0

解决方案

  1. 检查当前Node.js版本: node --version
  2. 使用nvm管理多版本Node.js:
    nvm install 20.19.0
    nvm use 20.19.0
    
  3. 或者使用Node版本管理工具如fnm或n。

问题:权限不足无法读取编辑器数据

Error: EACCES: permission denied, open '/Users/xxx/Library/Application Support/Cursor/...'

解决方案

  1. 确保你有读取这些文件的权限
  2. 如果是首次运行,某些编辑器可能需要先至少启动一次以创建数据文件
  3. 对于沙箱环境,可能需要调整安全设置

问题:端口已被占用

Error: listen EADDRINUSE: address already in use :::4637

解决方案

  1. 指定其他端口: PORT=8080 npx agentlytics
  2. 查找并终止占用端口的进程:
    lsof -ti:4637 | xargs kill -9
    

7.2 数据采集问题

问题:检测不到某些编辑器 可能的原因和解决方案:

  1. 编辑器未运行 :Windsurf、Antigravity等需要应用正在运行
  2. 非标准安装路径 :某些编辑器可能安装在自定义位置
  3. 数据目录权限 :检查 ~/Library/Application Support/ 下的对应目录
  4. 版本太新/太旧 :适配器可能不支持该版本

调试方法

# 启用详细日志
DEBUG=agentlytics:* npx agentlytics

# 或只检查特定编辑器
DEBUG=agentlytics:editor:* npx agentlytics

问题:数据不完整或错误 可能原因

  1. 编辑器更改了数据格式
  2. 会话数据损坏
  3. 编码问题(特别是非ASCII字符)

解决方案

  1. 清除缓存重新扫描:
    rm -rf ~/.agentlytics/cache.db
    npx agentlytics --collect
    
  2. 检查编辑器是否有数据导出功能,手动验证数据完整性
  3. 在GitHub Issues中报告具体问题,附上编辑器版本和错误日志

7.3 性能优化建议

首次扫描缓慢 : 首次运行Agentlytics可能需要较长时间(几分钟到十几分钟),因为要读取所有编辑器的完整历史。这是正常现象。

优化策略

  1. 增量扫描 :后续运行只会扫描新增或修改的数据
  2. 选择性扫描 :使用 --editors 参数只扫描特定编辑器:
    npx agentlytics --editors cursor,claude-code
    
  3. 调整缓存策略 :默认缓存位置在SSD上性能最好,如果使用网络存储或慢速硬盘,考虑更改缓存目录:
    export AGENTLYTICS_CACHE_DIR=/tmp/agentlytics
    

内存使用优化 : 处理大量会话数据(数万条消息)可能消耗较多内存。

建议

  1. 使用 --limit 参数限制处理的数据量:
    npx agentlytics --limit 5000  # 只处理最近的5000条消息
    
  2. 定期清理旧数据:手动删除 ~/.agentlytics/cache.db 并重新扫描
  3. 确保系统有足够可用内存,特别是在使用Deno版本时

仪表板加载缓慢 : 如果会话数量极大(10万+),前端渲染可能变慢。

解决方案

  1. 使用分页和虚拟滚动,仪表板默认已启用
  2. 在会话列表中使用过滤器缩小范围
  3. 考虑按时间范围分析,而不是一次性加载所有历史数据

7.4 Relay特定问题

问题:客户端无法连接到Relay服务器 排查步骤

  1. 确认服务器正在运行: curl http://服务器IP:4638/relay/health
  2. 检查防火墙设置,确保4638端口可访问
  3. 验证密码(如果设置了):确保客户端和服务器使用相同的 RELAY_PASSWORD
  4. 检查网络连接:是否在同一局域网,VPN是否影响连接

问题:数据同步延迟或失败 可能原因

  1. 网络不稳定
  2. 数据量过大
  3. 客户端或服务器资源不足

解决方案

  1. 调整同步间隔(当前固定为30秒,不可配置)
  2. 减少共享的项目数量
  3. 检查客户端和服务器的日志:
    # 服务器日志
    npx agentlytics --relay --verbose
    
    # 客户端日志
    npx agentlytics --join <server> --verbose
    

问题:MCP连接失败 排查步骤

  1. 确认Relay服务器正常运行且MCP端点可访问
  2. 检查AI客户端的MCP配置是否正确
  3. 验证网络连接和端口访问
  4. 查看Relay服务器的MCP日志

7.5 数据准确性问题

token计数不准确 : 这是最常见的数据质量问题,原因包括:

  1. 编辑器不提供token信息(如Zed)
  2. token计算方式不同(字符数vs实际token)
  3. 工具调用、图像输入等特殊内容未计入

应对策略

  1. 将Agentlytics的token计数视为相对值而非绝对值
  2. 关注趋势变化而非绝对数字
  3. 对于成本敏感的场景,以官方账单为准

项目识别错误 : Agentlytics通过文件路径推断项目,但在以下情况可能出错:

  1. 符号链接或别名路径
  2. 项目在多个位置有副本
  3. 临时文件或构建目录被误识别

解决方案

  1. 检查仪表板中的项目路径是否正确
  2. 如有必要,手动清理或调整缓存数据
  3. 考虑在项目根目录添加 .agentlyticsignore 文件排除特定路径

8. 高级用法与定制化

8.1 自动化与脚本集成

Agentlytics不仅可以通过Web界面交互,也提供了丰富的API和命令行选项,适合集成到自动化工作流中。

定期数据收集脚本 : 你可以设置cron任务或系统定时器,定期更新Agentlytics缓存,确保数据始终最新:

#!/bin/bash
# 每日凌晨2点收集数据
0 2 * * * /usr/local/bin/npx agentlytics --collect > /tmp/agentlytics.log 2>&1

数据导出与分析 : 虽然Agentlytics本身不提供导出功能,但你可以直接查询SQLite数据库:

# 查看数据库结构
sqlite3 ~/.agentlytics/cache.db ".schema"

# 导出所有会话为CSV
sqlite3 ~/.agentlytics/cache.db <<EOF
.headers on
.mode csv
.output sessions.csv
SELECT * FROM sessions;
EOF

# 自定义查询:按编辑器统计
sqlite3 ~/.agentlytics/cache.db "
SELECT editor, COUNT(*) as session_count, 
       SUM(token_count) as total_tokens
FROM sessions 
GROUP BY editor 
ORDER BY session_count DESC;
"

与监控系统集成 : 你可以编写脚本将关键指标推送到Prometheus、Datadog等监控系统:

#!/usr/bin/env python3
import sqlite3
import requests
import os

# 读取Agentlytics数据
db_path = os.path.expanduser('~/.agentlytics/cache.db')
conn = sqlite3.connect(db_path)
cursor = conn.cursor()

# 计算今日使用量
cursor.execute("""
    SELECT COUNT(*) as sessions_today, 
           SUM(token_count) as tokens_today
    FROM sessions 
    WHERE DATE(timestamp) = DATE('now')
""")
today = cursor.fetchone()

# 推送到监控系统
metrics = {
    'agentlytics.sessions.today': today[0] or 0,
    'agentlytics.tokens.today': today[1] or 0,
}

# 这里添加推送到你监控系统的代码
print(f"今日会话数: {metrics['agentlytics.sessions.today']}")
print(f"今日Token数: {metrics['agentlytics.tokens.today']}")

8.2 自定义分析与可视化

Agentlytics的React前端是开源的,你可以根据自己的需求进行定制。

添加自定义图表

  1. 克隆仓库并安装依赖
  2. src/components/ 中添加新的可视化组件
  3. src/api/ 中添加对应的数据获取逻辑
  4. 修改仪表板布局集成新组件

示例:添加编程语言分析

// 新增API端点,分析代码中的编程语言
app.get('/api/language-stats', async (req, res) => {
  const db = await getDatabase();
  const stats = await db.all(`
    SELECT 
      CASE 
        WHEN content LIKE '%function%' AND content LIKE '%{%' THEN 'JavaScript'
        WHEN content LIKE '%def %' THEN 'Python'
        WHEN content LIKE '%public class%' THEN 'Java'
        ELSE 'Other'
      END as language,
      COUNT(*) as count
    FROM messages
    WHERE role = 'assistant' AND content LIKE '%```%'
    GROUP BY language
    ORDER BY count DESC
  `);
  res.json(stats);
});

主题定制 : Agentlytics使用Tailwind CSS,你可以轻松修改颜色主题:

/* 在tailwind.config.js中添加自定义主题 */
module.exports = {
  theme: {
    extend: {
      colors: {
        'primary': '#3B82F6',
        'secondary': '#10B981',
        'accent': '#8B5CF6',
      }
    }
  }
}

8.3 扩展对新数据源的支持

除了现有的编辑器,你还可以扩展Agentlytics支持其他数据源:

支持聊天记录导出文件 : 许多AI工具支持导出聊天记录为JSON或Markdown。你可以编写适配器解析这些文件:

// editors/chat-export.js
export async function getSessions(options) {
  const exportDir = path.join(os.homedir(), 'Downloads', 'ai-exports');
  const sessions = [];
  
  for (const file of await fs.readdir(exportDir)) {
    if (file.endsWith('.json')) {
      const content = await fs.readFile(path.join(exportDir, file), 'utf-8');
      const data = JSON.parse(content);
      
      // 转换为标准格式
      sessions.push({
        id: `export-${file}`,
        editor: 'ChatExport',
        timestamp: data.timestamp || fileCreatedTime,
        messages: data.messages.map(msg => ({
          role: msg.role,
          content: msg.content,
          // ...其他字段
        }))
      });
    }
  }
  
  return sessions;
}

集成第三方API : 如果编辑器提供API访问历史数据,你可以通过API获取:

// editors/custom-api.js
export async function getSessions(options) {
  const apiKey = process.env.CUSTOM_EDITOR_API_KEY;
  if (!apiKey) return [];
  
  const response = await fetch('https://api.custom-editor.com/v1/chats', {
    headers: { 'Authorization': `Bearer ${apiKey}` }
  });
  
  const data = await response.json();
  // 转换和返回数据
}

8.4 安全与隐私强化

对于处理敏感数据的团队,可以考虑以下安全增强措施:

加密缓存数据库

# 使用SQLCipher加密缓存
export AGENTLYTICS_DB_KEY=$(openssl rand -hex 32)
npx agentlytics

网络隔离运行

# 在隔离的网络命名空间中运行
sudo ip netns add agentlytics-ns
sudo ip netns exec agentlytics-ns npx agentlytics

定期数据清理

#!/bin/bash
# 自动清理30天前的数据
find ~/.agentlytics -name "*.db" -mtime +30 -delete

审计日志

# 启用详细审计日志
DEBUG=agentlytics:* npx agentlytics 2>&1 | tee ~/agentlytics-audit-$(date +%Y%m%d).log

9. 实际应用场景与最佳实践

9.1 个人开发者:优化AI工具使用效率

作为独立开发者,我使用Agentlytics主要解决以下问题:

识别低效使用模式 : 通过分析会话数据,我发现自己在某些场景下过度依赖AI。比如:

  • 简单的语法问题也问AI,而不是查文档
  • 同一个问题反复问,没有保存好的答案
  • 使用过于复杂的模型处理简单任务

优化模型选择策略 : 数据告诉我,对于代码补全和简单重构,GPT-4o-mini和Claude Haiku足够好,成本只有GPT-4o的1/10。但对于复杂算法设计,GPT-4o的一次性成功率高,反而更节省总时间。

建立个人知识库 : 我将有价值的AI对话导出并整理到笔记中。特别是那些解决特定技术问题的会话,现在可以快速检索,避免重复提问。

月度成本回顾 : 每月初查看上月的token消耗和成本估算,调整使用习惯。我发现将大量小问题批量提问,比零散提问更节省token。

9.2 团队技术负责人:监控与指导AI使用

在团队环境中,Agentlytics的价值更加明显:

制定AI使用指南 : 基于团队数据,我们制定了这样的指南:

  • 新功能开发:建议使用Cursor或Windsurf进行头脑风暴
  • 代码审查:使用Claude Code分析潜在问题
  • 调试复杂问题:结合多个AI工具交叉验证
  • 简单任务:优先使用VS Code Copilot

识别培训需求 : 通过分析团队成员的AI使用模式,我发现:

  • 初级开发者过度依赖AI生成完整代码,缺乏理解
  • 高级开发者更擅长用AI解决特定难点
  • 某些技术栈(如Rust、Elixir)的AI支持不够好,需要额外培训

成本分摊与预算管理 : 对于按token计费的团队订阅,Agentlytics的数据帮助我们:

  • 公平分摊成本到各个项目
  • 设置每个项目的月度token预算
  • 识别异常使用(如某个开发者突然消耗大量token)

质量与效率监控 : 我们定义了一些关键指标:

  • AI辅助代码占比 :AI生成或修改的代码行数比例
  • 问题解决时间 :从提问到获得满意答案的时间
  • 代码采纳率 :AI建议被实际采纳的比例
  • 返工率 :AI生成的代码需要后续修改的比例

9.3 开源项目维护者:理解贡献者的AI使用

对于开源项目,Agentlytics的Relay功能特别有用:

集体智慧积累 : 所有贡献者的AI对话都汇聚到Relay中,形成项目的“集体记忆”。新贡献者可以查询:

  • “之前是如何处理这个API兼容性问题的?”
  • “有哪些关于性能优化的讨论?”
  • “这个模块的重构历史是怎样的?”

代码审查辅助 : 审查PR时,可以查看作者与AI的对话记录,了解:

  • 为什么选择这个实现方案?
  • 考虑了哪些替代方案?
  • 遇到了什么困难,如何解决的?

文档生成 : 基于AI对话自动生成或更新文档:

  • 常见问题解答(来自真实的问答)
  • 代码示例(从AI生成的代码中提取)
  • 最佳实践(总结多次对话中的建议)

9.4 教育机构:教学与评估工具

在编程教育中,Agentlytics提供了独特的视角:

学生学习过程分析 : 教师可以看到学生如何利用AI辅助学习:

  • 哪些概念学生反复提问?
  • 学生是否过度依赖AI完成作业?
  • AI的解释是否准确,有无误导?

个性化教学支持 : 基于AI使用数据,教师可以:

  • 为 struggling 的学生提供额外辅导
  • 为 advanced 的学生提供挑战性任务
  • 调整教学内容,弥补AI的不足

学术诚信监控 : 虽然不能完全防止作弊,但可以识别异常模式:

  • 短时间内大量使用AI
  • 代码风格突然变化
  • 解决复杂问题的速度异常快

10. 未来展望与社区贡献

10.1 路线图与计划功能

Agentlytics目前已经相当强大,但开发团队和社区还有更多计划:

离线Windsurf/Antigravity支持 : 当前这些编辑器需要应用运行才能获取数据。社区正在研究如何直接从本地文件读取历史数据。如果你了解Windsurf的数据存储格式,欢迎贡献代码或文档。

LLM驱动的深度分析 : 计划集成本地LLM(如Llama、Phi)来分析会话数据,提供:

  • 自动会话摘要
  • 编码习惯识别
  • 个性化改进建议
  • 自然语言查询(“我上个月在React项目上花了多少时间?”)

多平台支持 : 目前主要支持macOS,计划扩展对Linux和Windows的支持。这需要社区帮助测试和适配不同平台的路径和文件格式。

导出与报告

  • PDF报告生成,适合分享给非技术成员
  • CSV数据导出,用于进一步分析
  • 与BI工具(如Metabase、Tableau)集成

实时监控与告警

  • Token使用速率告警
  • 异常使用模式检测
  • 预算超支预警

10.2 如何贡献

Agentlytics是开源项目,欢迎各种形式的贡献:

报告问题 : 在GitHub Issues中报告bug或提出功能建议。请尽量提供:

  • 操作系统和版本
  • 受影响的编辑器及版本
  • 错误信息和日志
  • 复现步骤

提交代码

  1. Fork仓库并创建特性分支
  2. 遵循现有的代码风格和架构
  3. 添加测试覆盖
  4. 提交Pull Request

特别需要的贡献领域

  1. 编辑器适配器 :为你使用的编辑器添加支持
  2. 数据分析算法 :改进统计分析和可视化
  3. 性能优化 :处理大规模数据集
  4. 文档改进 :编写教程、用例文档
  5. 国际化 :翻译界面和文档

测试与反馈 : 即使不写代码,你也可以:

  • 测试新功能并提供反馈
  • 分享使用案例和最佳实践
  • 在社区中帮助其他用户

10.3 相关工具与生态集成

Agentlytics不是孤立存在的,它可以与许多现有工具集成:

与开发工具集成

  • Git Hooks :在提交时记录AI使用上下文
  • CI/CD管道 :分析AI辅助的代码变更质量
  • IDE插件 :在编辑器中直接查看AI使用统计

与监控系统集成

  • Prometheus/Grafana :将指标导入现有监控栈
  • Sentry :关联AI使用与错误发生
  • Slack/Teams :定期发送使用报告

与学习平台集成

  • GitHub Learning Lab :跟踪学习进度
  • 在线课程平台 :分析学生使用模式
  • 代码练习平台 :评估AI辅助的效果

10.4 伦理考量与负责任使用

随着AI编程工具的普及,我们需要思考如何负责任地使用它们:

透明度与披露

  • 在开源项目中披露AI辅助的程度
  • 在团队中明确AI使用的边界
  • 在学术工作中恰当引用AI贡献

技能平衡

  • 避免过度依赖导致基础技能退化
  • 将AI作为增强工具,而非替代品
  • 持续学习AI无法教授的核心概念

偏见与准确性

  • 意识到AI可能引入的偏见
  • 验证AI提供的所有信息
  • 培养批判性思维和验证能力

隐私与安全

  • 绝不向AI分享敏感信息
  • 了解不同工具的数据处理政策
  • 使用Agentlytics等工具保持数据控制

Agentlytics在这个生态中扮演着“镜子”的角色——它不决定你如何使用AI,而是如实反映你的使用模式。通过这面镜子,你可以做出更明智、更负责任的决定,让AI真正成为编程的助力,而不是依赖的拐杖。

更多推荐