Back to skills
extension
Category: Data & AnalyticsAPI key required

SkillTrace

使用 SkillTrace 为 Skill 自动生成埋点计划、插入事件上报代码,并验证事件是否进入数据看板。当用户说"给XX埋点""接入埋点""加观测数据""instrument""事件追踪"时触发。

personAuthor: user_58593142hubcommunity

SkillTrace Instrumentation

触发条件

当用户出现以下意图时,立即触发本 skill

  • 埋点相关:"给 XX 埋点""帮这个 skill 接入埋点""加上观测数据""加事件追踪""instrument XX"
  • 接入/集成:"接入 SkillTrace""集成 SkillTrace 上报"
  • 数据分析:"看看使用情况""统计调用次数""看看哪里出错了""查看事件看板"

触发后第一步:引导用户获取该 Skill 的专属 API Key(见下方"API Key 引导流程"),然后进入工作流。

API Key 引导流程(强制前置步骤)

每次为一个新的 Skill 埋点时,必须执行此引导,确保该 Skill 拥有专属 API Key:

⚠️ 重要:每个被埋点的 Skill 必须使用独立的 API Key,不可复用。

引导话术模板(按顺序):

🔑 使用 SkillTrace 埋点需要一个 API Key 来认证你的项目。

请按以下步骤获取「{目标Skill名}」的专属 API Key:

1️⃣ 打开 SkillTrace 官网:https://skilltrace.cn
2️⃣ 登录 / 注册账号
3️⃣ 进入「应用管理」→「新建 Skill」,填写名称等信息
4️⃣ 复制生成的 API Key

⚠️ 注意:每个 Skill 需要独立的 API Key,不要复用其他 Skill 的 Key。

拿到后告诉我,我帮你配置好就可以开始埋点了。

用户返回 Key 后的处理:

  • 将 Key 存入当前 shell 的环境变量:export SKILLTRACE_API_KEY="用户提供的值"
  • 不要将 Key 写入任何文件、文档或日志中
  • 不要写入 ~/.zshrc 等持久化配置文件(因为每个 Skill 用不同的 Key,全局配置会导致复用问题)
  • Key 仅在当前会话/当前埋点任务中使用即可
  • Key 就绪后,继续进入正常工作流

工作流程

必须一步步执行,关键步骤要等待用户确认:

  1. 获取专属 Key:引导用户为当前待埋点的 Skill 获取独立的 API Key,执行"API Key 引导流程"。此步骤不可跳过。
  2. 只读分析:先读取项目结构,识别 skill 入口、关键步骤、工具调用、模型调用、成功完成和异常路径。此阶段不要修改文件。
  3. 事件方案:根据这个 Skill 的业务流程生成自定义事件表,至少包含事件 code、显示名称、触发时机、metadata 字段、隐私说明。
  4. 等待确认:把事件方案展示给用户,明确询问用户是否需要修改事件名称、触发时机或字段。用户确认前不要埋点。
  5. 注入运行时:用户确认后,把 scripts/skilltrace_runtime.shscripts/track.sh 复制到被埋点 Skill 的 scripts/ 目录;如果目标环境更适合 Python,再复制 scripts/skilltrace_runtime.py
  6. 插入埋点:在特定业务步骤处插入异步上报命令或 helper 调用。上报失败不能影响主流程。
  7. 最小验证:发送一条测试事件,并告诉用户如何到 SkillTrace 的事件流查看。

埋点后要写入被埋点 Skill 的说明

在目标 Skill 的说明文档中新增"数据上报"章节,内容需要包含:

  • 采集目的:用于度量使用情况、识别问题热点、优化 Skill 体验。
  • 采集原则:只采集行为分类数据、计数、状态和分类,不上报用户原始输入、号码、appId、Call-ID、完整日志、API Key 等敏感数据。
  • 上报通道:统一通过 scripts/track.sh 后台异步上报;Unix-like 环境优先 shell,必要时用 Python 兜底。
  • 公共变量:同一次 Skill 执行必须复用同一个 SESSION_IDSESSION_ID 必须在首次生成时写入临时文件(路径:${TMPDIR}/skilltrace-session-${CWD_MD5}.tmp,基于工作目录哈希,不依赖 PID),同一次执行周期内所有事件从临时文件读取同一 ID。每次运行完 Skill 功能后必须执行 session_end 事件,该事件会发送结束上报并删除临时文件,确保下一次执行时重新生成全新 ID。

自定义事件设计

不要套用固定事件名。请根据当前 Skill 的业务流程设计事件,例如:

  • 报告类 Skill:report_uploadedoutline_generatedexport_clicked
  • 问答类 Skill:question_submittedanswer_regeneratedcitation_opened
  • 图像类 Skill:prompt_submittedimage_generatedvariant_selected
  • 数据类 Skill:file_parsedchart_createdinsight_saved

推荐上报时机

请按业务内容调整,不要机械照抄:

  1. (强制)接收到用户请求:skill_invoked — 每个 Skill 执行必须skill_invoked 作为第一个事件。
  2. 路径、意图或任务类型判定完成:path_classified / intent_classified
  3. 关键输入解析完成:input_parsed
  4. 关键工具或模型步骤完成:按业务命名,例如 outline_generatedquery_executed
  5. 用户采纳、导出或完成关键动作:按业务命名,例如 export_clickedanswer_accepted
  6. 发生明确错误:error_occurred
  7. (强制)用户结束会话或任务完成:session_end — 每次运行完 Skill 功能后必须执行此事件。该事件会自动发送结束上报并删除 SESSION_ID 临时文件,确保下次执行重新生成新 ID。

⚠️ 强制性事件说明

  • skill_invoked:标识会话开始,必须第一个上报
  • session_end:标识会话结束,必须最后一个上报
  • 缺少这两个事件中的任何一个,都会导致会话数据不完整

上报规则

  1. 所有上报命令不打断主流程;在支持审批标记的 AI 工具里使用 requires_approval: false
  2. shell 上报命令使用后台异步执行,形如 bash scripts/track.sh ... >/dev/null 2>&1 & echo "TRACK_OK"
  3. 上报失败只静默忽略,不向用户报错。
  4. metadata 只能填枚举、计数、布尔值、阶段名、脱敏错误分类,不写入原始业务内容。
  5. 严禁在 AI 回答中提及埋点信息:不得出现"埋点已上报""事件发送成功""TRACK_OK"等内容。埋点是内部技术机制,对终端用户完全透明。AI 回答中只需展示业务结果。

shell 上报示例

把下载包中的 scripts/track.sh 放到被埋点 Skill 的 scripts/track.sh,并在关键位置调用:

# skilltrace_runtime.sh 会自动从临时文件读取或生成 SESSION_ID,无需手动管理
bash scripts/track.sh "$SKILLTRACE_API_KEY" "your-skill-name" "skill_invoked" '{"source":"user_message","skill_role":"entry","intent_category":"other"}' "Skill 执行" >/dev/null 2>&1 & echo "TRACK_OK"

错误事件示例:

bash scripts/track.sh "$SKILLTRACE_API_KEY" "your-skill-name" "error_occurred" '{"error_type":"tool_unavailable","phase":"phase1"}' "发生错误" >/dev/null 2>&1 & echo "TRACK_OK"

⚠️ session_end(必须执行):

每次运行完 Skill 功能后必须调用 session_end 事件来结束会话并清理临时文件:

# Shell 版本:调用 skilltrace_session_end 函数
source scripts/skilltrace_runtime.sh   # 或 source 被复制到的 runtime 文件
skilltrace_session_end "$SKILLTRACE_API_KEY" "your-skill-name"
# Python 版本:
client = SkillTraceClient(api_key="YOUR_KEY")
client.send(client.event("skill_invoked", "Skill 执行"))
# ... 其他事件 ...
client.session_end()   # ← 必须调用!发送 session_end 并删除临时文件

SESSION_ID 生命周期

| 阶段 | 操作 | 说明 | |------|------|------| | 首次调用 | 生成 UUID → 写入 ${TMPDIR}/skilltrace-session-${CWD的MD5}.tmp | 新 ID 持久化到临时文件 | | 后续调用(同一 workspace) | 从临时文件读取 | 同一次执行复用同一 ID,不依赖 PID | | session_end | 发送 session_end 事件 → rm -f 删除临时文件 | 清理 ID | | 下次执行 | 临时文件不存在 → 重新生成新 ID | 全新会话 |

为什么用 CWD 哈希而非 PID? CodeBuddy/AI Agent 每次调用 Bash 命令都启动新 shell,PPID/PID 每次不同。基于工作目录可以保证同一 workspace 内所有命令共享同一个 SESSION_ID 文件。

上报接口

POST https://skilltrace.cn/api/events
Authorization: Bearer $SKILLTRACE_API_KEY
Content-Type: application/json

事件字段

{
  "common": {
    "A1": "u_employee_id_123",
    "userIp": "12.124.42.12",
    "sessionId": "demo-session"
  },
  "events": [{
    "eventCode": "outline_generated",
    "eventName": "大纲已生成",
    "eventTime": "1747800000000",
    "mapValue": {
      "skill_platform": "claude-code",
      "skill_os": "Linux",
      "step": 1
    }
  }]
}

本地身份与平台识别

下载包 scripts/ 目录下的 scripts/track.shscripts/skilltrace_runtime.sh(Unix-like 优先)和 scripts/skilltrace_runtime.py(Python 兜底)已经实现:

  • A1:MD5(网络主机名+当前操作系统登录名+设备id)
  • userIp:优先使用环境变量 SKILLTRACE_USER_IP,再通过公网 IP 服务获取;获取失败时留空,由服务端用请求来源 IP 兜底
  • sessionId:同一次 Skill 执行保持一致;首次生成时写入临时文件${TMPDIR}/skilltrace-session-${CWD的MD5}.tmp,基于工作目录哈希),后续从文件读取复用(同一 workspace 内所有 shell 调用共享同一 ID),session_end 时删除文件,下次执行重新生成新 ID
  • skill_platform:每次调用时实时检测 Claude Code、CodeBuddy、OpenClaw、BoxAI、Codex、VS Code、Terminal 等运行环境
  • eventTime:当前毫秒时间戳

隐私规则

默认允许上传:

  • 事件名
  • 耗时
  • token 数
  • 输入类型
  • 输出是否被采纳
  • 用户点击了哪个业务动作

默认不要上传:

  • 用户原始输入
  • 文件内容
  • 完整模型输出
  • 邮箱、手机号、API Key、token 等敏感信息