pi-langfuse 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README_CN.md CHANGED
@@ -1,32 +1,106 @@
1
1
  # pi-langfuse
2
2
 
3
- [Pi Coding Agent](https://github.com/earendil-works/pi-coding-agent) 的 Langfuse 可观测性扩展。将跟踪发送到 [Langfuse](https://langfuse.com) 以监控令牌、成本、延迟和工具调用。
3
+ [![npm version](https://img.shields.io/npm/v/pi-langfuse)](https://www.npmjs.com/package/pi-langfuse)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
+
6
+ [**English**](./README.md) | [**简体中文**](./README_CN.md)
7
+
8
+ [Pi Coding Agent](https://github.com/earendil-works/pi-coding-agent) 的 Langfuse 可观测性扩展。将完整的 Pi 代理运行发送到 [Langfuse](https://langfuse.com),以便您可以在一个追踪(trace)中检查用户提示词、根代理工作流、每次 LLM 生成、每次工具调用、最终助手响应、使用情况、成本和健康分数。
4
9
 
5
10
  ## 为什么选择 Langfuse?
6
11
 
7
- Langfuse 为 LLM 应用程序提供开源的可观测性。此扩展允许您以生产级细节**跟踪**、**监控**和**调试**您的 Pi 会话,帮助您准确了解代理的性能、成本以及可能失败的地方。
12
+ Langfuse 为 LLM 应用程序提供开源的可观测性。此扩展允许您以生产级细节**追踪**、**监控**和**调试**您的 Pi 会话,帮助您准确了解代理的执行情况、成本消耗以及可能出现故障的环节。
8
13
 
9
14
  ## 功能
10
15
 
11
- - **分层跟踪**:将用户提示映射到每轮跨度和嵌套工具执行,实现深度可见性。
12
- - **LLM 元数据**:自动记录每轮的模型名称、提供商、令牌使用情况和 API 成本。
13
- - **工具可观测性**:每个工具调用的详细日志,包括参数、结果和错误状态。
14
- - **会话关联**:将同一 Pi 会话中的所有提示分组到单个 Langfuse 会话中。
15
- - **成本跟踪**:记录每代输入/输出/总成本(美元)。
16
- - **令牌使用**:跟踪每轮的输入和输出令牌。
16
+ - **完整的代理追踪**:为每个用户提示词创建一个追踪,包含一个根 `agent`(代理)观察节点,其中记录了提示词输入和最终助手输出。
17
+ - **每次请求生成记录**:为每次提供商请求记录单独的 `generation`(生成)观察节点,包含实际的提供商请求负载,而不仅仅是原始提示词。
18
+ - **捕获最终消息**:在生成和根输出中使用已定型的助手消息,因此 Langfuse 会显示用户在 Pi 中实际看到的内容。
19
+ - **工具可观测性**:为每次工具调用创建 Langfuse `tool`(工具)观察节点,包括参数、结果和错误状态。
20
+ - **并行工具安全性**:通过 `toolCallId` 关联工具观察节点,避免在 Pi 并发运行工具时出现结果混淆。
21
+ - **会话关联**:将同一 Pi 会话中的所有追踪分组到一个共享的 Langfuse 会话 ID 下。
22
+ - **成本和 Token 追踪**:当 Pi/提供商负载公开时,记录每次生成的使用情况和成本详细信息。
23
+ - **评估分数**:自动计算并发送工具成功率、错误计数和会话健康指标。
24
+ - **防御性负载整形**:尽可能解析类似 JSON 的字符串,限制对象深度,并在上传前截断超大负载。
25
+
26
+ ## 亮点
27
+
28
+ `pi-langfuse` 旨在使 Pi 运行作为代理工作流具有可读性,而不仅仅是一堆日志:
29
+
30
+ - 追踪(trace)的输入/输出与根 `agent` 观察节点镜像同步,使得从 Langfuse 追踪列表和详情视图中即可理解运行情况。
31
+ - 使用工具的运行中的首次生成可以显示助手的工具调用消息,工具观察节点显示执行的输入/输出,而后续的生成显示最终的自然语言答案。
32
+ - 工具故障会在工具观察节点上标记,并反映在追踪级别的分数中,而后续的生成仍会在其输入历史中保留工具错误结果。
33
+ - 关机和中断的运行会刷新待处理的遥测数据,并将未完成的观察节点标记为已取消/警告,而不是默默丢失追踪记录。
34
+
35
+ ## 前提条件
36
+
37
+ - **Node.js** >= 22
38
+ - **Pi Coding Agent** 已安装并配置
39
+ - **Langfuse** 账户([云服务](https://cloud.langfuse.com)或自托管)
40
+
41
+ ## 安装
17
42
 
18
- ## 快速安装
43
+ ### 方式 1:通过 npm 安装(推荐给用户)
19
44
 
20
- ### 通过 npm(推荐)
21
45
  ```bash
22
46
  pi install npm:pi-langfuse
23
47
  ```
24
48
 
49
+ Pi 会自动下载包并将其注册为扩展。
50
+
51
+ ### 方式 2:从本地源码安装(推荐给开发者)
52
+
53
+ ```bash
54
+ git clone <你的仓库地址>
55
+ cd pi-langfuse
56
+ npm install
57
+ ```
58
+
59
+ 然后告诉 Pi 使用它:
60
+
61
+ ```bash
62
+ pi link /path/to/pi-langfuse
63
+ ```
64
+
65
+ 或者直接在项目目录中运行 Pi——Pi 会自动发现当前目录中 `package.json` 的扩展。
66
+
25
67
  ## 配置
26
68
 
27
- [Langfuse Cloud](https://cloud.langfuse.com)设置 → API 密钥获取您的密钥。
69
+ 你需要 Langfuse API 密钥。从 **Langfuse Cloud****设置****API 密钥** 获取。
70
+
71
+ 有三种配置方式:
72
+
73
+ ### 方式 1:交互式设置(最简单)
74
+
75
+ 加载扩展后运行任意 `pi` 命令。首次运行且未配置时,Pi 会在 CLI 或 TUI 中提示输入:
76
+
77
+ 1. **Langfuse 公钥** — 以 `pk-lf-...` 开头
78
+ 2. **Langfuse 密钥** — 以 `sk-lf-...` 开头
79
+ 3. **Langfuse 主机地址** — 默认为 `https://cloud.langfuse.com`
80
+
81
+ 扩展会将这些保存到本地的 `config.json`(被 git 忽略)。
82
+
83
+ 随时重新运行设置:
84
+
85
+ ```
86
+ /langfuse-setup
87
+ ```
88
+
89
+ ### 方式 2:环境变量
90
+
91
+ 在启动 Pi 前设置:
92
+
93
+ ```bash
94
+ export LANGFUSE_PUBLIC_KEY="pk-lf-xxxx"
95
+ export LANGFUSE_SECRET_KEY="sk-lf-xxxx"
96
+ export LANGFUSE_BASE_URL="https://cloud.langfuse.com" # 可选;也支持 LANGFUSE_HOST
97
+ ```
98
+
99
+ 扩展会先检查本地的 `config.json`,然后回退到环境变量。
100
+
101
+ ### 方式 3:本地 config.json(仅限开发)
28
102
 
29
- 在扩展目录中创建 `config.json`:
103
+ 对于本地开发,在项目根目录创建 `config.json`:
30
104
 
31
105
  ```json
32
106
  {
@@ -36,85 +110,223 @@ pi install npm:pi-langfuse
36
110
  }
37
111
  ```
38
112
 
39
- 对于 npm 安装,扩展位于:
40
- ```
41
- ~/.pi/agent/npm/@ravan08/pi-langfuse/index.ts
42
- ```
113
+ > **⚠️ 安全提醒**:`config.json` 不会被 git 跟踪。切勿将 API 密钥提交到版本控制。
43
114
 
44
115
  ## 使用
45
116
 
46
- ### 启用跟踪运行 pi
117
+ ### 基本使用
118
+
119
+ 像往常一样运行 Pi——扩展会自动加载并追踪每次代理运行:
120
+
121
+ ```bash
122
+ pi "解释 Redis 的架构"
123
+ ```
124
+
125
+ 会话结束后,在 [Langfuse 仪表板](https://cloud.langfuse.com) 中查看追踪信息。
126
+
127
+ ### 验证扩展已加载
47
128
 
48
129
  ```bash
49
- pi "your prompt"
130
+ pi list
50
131
  ```
51
132
 
52
- Pi 自动加载扩展。所有会话都将被跟踪到 Langfuse。
133
+ 你应该能看到 `pi-langfuse` 在已安装包列表中。
134
+
135
+ ### 多个会话
136
+
137
+ 每个 Pi 会话对应一个独立的 Langfuse 会话 ID。在该 Pi 会话中的每个用户提示词都会成为归入同一会话下的独立 Langfuse 追踪。
138
+
139
+ ## 开发设置
140
+
141
+ 如果你为此扩展贡献代码:
142
+
143
+ ```bash
144
+ # 克隆并安装依赖
145
+ git clone <你的仓库地址>
146
+ cd pi-langfuse
147
+ npm install
53
148
 
54
- ## 跟踪模型
149
+ # 检查 TypeScript 类型
150
+ npm run typecheck
55
151
 
152
+ # 用 Pi 测试
153
+ pi "test prompt"
56
154
  ```
57
- 跟踪(名称:"pi-agent")
58
- ├── 会话 ID:<pi-session-id>
59
- ├── 元数据:模型、提供商、cwd
60
- └── 跨度(名称:"tool:<name>")
61
- └── 输入/输出日志
62
155
 
63
- 生成(名称:"llm-response")
64
- ├── 模型:MiniMax-M2.7
65
- ├── 使用:输入/输出令牌
66
- └── 成本:输入/输出/总美元
156
+ ### 项目结构
157
+
158
+ ```
159
+ pi-langfuse/
160
+ ├── index.ts # 扩展入口和核心逻辑
161
+ ├── package.json # 包元数据
162
+ ├── tsconfig.json # TypeScript 配置
163
+ ├── config.json # 本地凭据(git 忽略)
164
+ ├── types/
165
+ │ ├── pi-coding-agent.d.ts # Pi 扩展 API 类型
166
+ │ └── node-shims.d.ts # Node.js 模块 shims
167
+ ├── .agents/
168
+ │ └── skills/
169
+ │ └── langfuse/
170
+ │ └── SKILL.md # 用于数据查询的 Langfuse CLI 技能
171
+ ├── AGENTS.md # 开发者指南(扩展版)
172
+ ├── README.md # 英文 README
173
+ ├── README_CN.md # 本文件(中文)
174
+ └── AGENTS_CN.md # 开发者指南(中文)
67
175
  ```
68
176
 
69
- ## 跟踪内容
177
+ ### 验证
178
+
179
+ 目前没有专门的测试套件。验证更改的方法:
180
+
181
+ 1. 运行 `npm run typecheck` 检查 TypeScript 错误
182
+ 2. 启用扩展启动 Pi
183
+ 3. 运行几个提示词
184
+ 4. 确认追踪、根代理观察节点、工具观察节点、生成和评估分数出现在您的 Langfuse 项目中
70
185
 
71
- ### 跟踪级别
72
- - `input` - 用户提示
73
- - `output` - 助手响应
74
- - `sessionId` - Pi 会话标识符
75
- - `metadata` - 模型、提供商、cwd
186
+ ## 追踪模型
76
187
 
77
- ### 生成观察(LLM 调用)
78
- - `model` - 模型标识符(例如,"MiniMax-M2.7"
79
- - `usage` - 令牌计数(输入/输出/总计)
80
- - `costDetails` - 成本细分(美元)
188
+ ```
189
+ Trace (name: "pi-agent")
190
+ ├── Session ID: <pi-session-id>
191
+ ├── input: 用户提示词,存在时包含图片/上下文摘要
192
+ ├── output: 最终助手响应
193
+ └── Agent observation (name: "pi-agent", type: agent)
194
+ ├── input: 当前用户提示词
195
+ ├── output: 最终助手响应
196
+ ├── Generation observation (name: "llm-generation", type: generation)
197
+ │ ├── input: 提供商请求负载 / 消息历史记录
198
+ │ ├── output: 已定型的助手消息或工具调用消息
199
+ │ ├── model, usageDetails, costDetails
200
+ │ └── metadata: 提供商/请求详细信息
201
+ └── Tool observation (name: "<tool-name>", type: tool)
202
+ ├── input: 工具参数
203
+ ├── output: 工具结果
204
+ └── metadata: toolCallId, isError
205
+ ```
81
206
 
82
- ### 跨度观察(工具调用)
83
- - `name` - 工具名称(例如,"tool:bash")
84
- - `input` - 工具参数(JSON)
85
- - `output` - 工具结果
86
- - `metadata.isError` - 工具是否失败
207
+ ## 追踪内容
208
+
209
+ ### 追踪级别 (Trace Level)
210
+ | 字段 | 说明 |
211
+ |------|------|
212
+ | `input` | 用户提示词,可用时包含图片/上下文摘要 |
213
+ | `output` | Pi 中显示的最终助手响应 |
214
+ | `sessionId` | Pi 会话标识符 |
215
+ | `metadata.model` | 模型标识符(例如 "MiniMax-M2.7") |
216
+ | `metadata.provider` | LLM 提供商名称 |
217
+ | `metadata.cwd` | 工作目录 |
218
+
219
+ ### 代理观察节点 (Agent Observation / 根工作流)
220
+ | 字段 | 说明 |
221
+ |------|------|
222
+ | `type` | `agent` |
223
+ | `name` | `pi-agent` |
224
+ | `input` | 当前用户提示词负载 |
225
+ | `output` | 最终助手响应 |
226
+ | `metadata.sessionId` | Pi 会话标识符 |
227
+ | `metadata.cwd` | 工作目录 |
228
+ | `metadata.model` | 可用时的所选模型 |
229
+ | `metadata.provider` | 可用时的提供商 |
230
+
231
+ ### 评估分数 (追踪级别)
232
+
233
+ | 分数名称 | 类型 | 说明 |
234
+ |----------|------|------|
235
+ | `tool_call_count` | number | 会话中的工具调用总数 |
236
+ | `turn_count` | number | 助手交互轮数 |
237
+ | `total_tool_errors` | number | 返回错误的工具数 |
238
+ | `tool_success_rate` | float (0-1) | 工具调用成功率 |
239
+ | `session_had_errors` | 0 或 1 | 是否有任何工具出错 |
240
+
241
+ ### 生成观察节点 (Generation Observations / LLM 调用)
242
+ | 字段 | 说明 |
243
+ |------|------|
244
+ | `type` | `generation` |
245
+ | `name` | `llm-generation` |
246
+ | `input` | 实际提供商请求负载 / 消息历史记录 |
247
+ | `output` | 已定型的助手消息,包含工具调用轮次的工具调用负载 |
248
+ | `model` | 模型标识符(例如 "MiniMax-M2.7") |
249
+ | `usageDetails.input` | 输入 Token 数 |
250
+ | `usageDetails.output` | 输出 Token 数 |
251
+ | `usageDetails.total` | 总 Token 数 |
252
+ | `costDetails.total` | 总成本(美元) |
253
+ | `costDetails.input` | 输入成本(美元) |
254
+ | `costDetails.output` | 输出成本(美元) |
255
+ | `metadata.provider` | 提供商名称 |
256
+ | `metadata.requestId` | 可用时的提供商/Pi 请求标识符 |
257
+ | `metadata.status` | 可用时的 HTTP/提供商状态 |
258
+
259
+ ### 工具观察节点 (Tool Observations)
260
+ | 字段 | 说明 |
261
+ |------|------|
262
+ | `type` | `tool` |
263
+ | `name` | 工具名称(例如 "bash", "read") |
264
+ | `input` | 工具参数 |
265
+ | `output` | 工具结果,为了可读性进行整形和截断 |
266
+ | `metadata.toolCallId` | 稳定的 Pi 工具调用标识符 |
267
+ | `metadata.isError` | 工具是否失败 |
268
+ | `level` | 失败的工具调用为 `ERROR`,否则为 `DEFAULT` |
269
+
270
+ ### 观察节点级别分数
271
+ | 分数名称 | 说明 |
272
+ |----------|------|
273
+ | `tool_is_error` | 分配给出错个体工具观察节点的值 1 |
87
274
 
88
275
  ## Langfuse 仪表板
89
276
 
90
277
  运行后,在您的 Langfuse 项目中检查:
91
278
 
92
- 1. **跟踪** - 所有 pi 代理运行及其 I/O
93
- 2. **会话** - 按会话 ID 分组的跟踪
94
- 3. **观察** - 工具调用和 LLM 生成
95
- 4. **分数** - 评估指标,如工具错误和成功率
96
- 5. **模型使用** - 按模型划分的使用情况细分
279
+ 1. **Traces(追踪)** 所有带输入/输出的 pi 代理运行
280
+ 2. **Sessions(会话)** 按会话 ID 分组的追踪
281
+ 3. **Observations(观察)** 工具调用和 LLM 生成
282
+ 4. **Scores(分数)** 评估指标(工具错误、成功率等)
283
+ 5. **Model Usage(模型使用)** 按模型划分的使用情况细分
284
+
285
+ 您也可以通过内置的 Langfuse 技能直接在终端中监控 Langfuse 数据:
286
+
287
+ ```
288
+ /pi-langfuse-langfuse <您的查询>
289
+ ```
97
290
 
98
291
  ## 故障排除
99
292
 
100
- **没有跟踪出现?**
101
- - 验证 `config.json` 中的 API 密钥是否正确
102
- - 检查 Langfuse 项目是否活跃
103
- - 确保 API 密钥具有写入权限
293
+ ### 没有追踪出现?
294
+ - 验证 API 密钥是否正确 运行 `/langfuse-setup` 重新配置
295
+ - 检查您的 Langfuse 项目是否活跃且有写入容量
296
+ - 确保 API 密钥有写入权限(非只读)
297
+ - 在 Pi 输出中查找 `📊 Langfuse:` 日志信息
298
+
299
+ ### 扩展未加载?
300
+ ```bash
301
+ pi list # 确认 pi-langfuse 已安装
302
+ pi install npm:pi-langfuse # 如果缺失则重新安装
303
+ ```
104
304
 
105
- **扩展未加载?**
106
- - 运行 `pi list` 检查已安装的包
107
- - 尝试重启 pi
305
+ ### 启动时显示 "Missing config"?
306
+ - 扩展需要凭据。使用交互式 `/langfuse-setup` 命令
307
+ - 或设置 `LANGFUSE_PUBLIC_KEY` 和 `LANGFUSE_SECRET_KEY` 环境变量
108
308
 
109
- **模型/成本未显示?**
309
+ ### 模型/成本未显示?
110
310
  - 并非所有提供商都公开成本信息
111
- - 检查 Langfuse 跟踪 API 获取原始观察数据
311
+ - 检查 Langfuse traces API 获取原始观察数据
312
+ - 生成中的 `model` 字段来自提供商事件、已定型的助手消息、`model_select` 或 `ctx.model`
313
+
314
+ ### API 密钥错误?
315
+ - Langfuse 公钥以 `pk-lf-` 开头,密钥以 `sk-lf-` 开头
316
+ - 如果使用自托管,请验证您的主机 URL 是否正确
112
317
 
113
318
  ## 依赖项
114
319
 
115
- - [langfuse](https://www.npmjs.com/package/langfuse) - Langfuse SDK
116
- - [@earendil-works/pi-coding-agent](https://www.npmjs.com/package/@earendil-works/pi-coding-agent) - Pi 扩展 API
320
+ - [@langfuse/tracing](https://www.npmjs.com/package/@langfuse/tracing) 用于 `agent`、`generation` 和 `tool` 追踪的 Langfuse 观察 API
321
+ - [@langfuse/otel](https://www.npmjs.com/package/@langfuse/otel) 用于将追踪导出到 Langfuse 的 OpenTelemetry 跨度处理器
322
+ - [@langfuse/client](https://www.npmjs.com/package/@langfuse/client) — 用于分数的 Langfuse API 客户端
323
+ - [@opentelemetry/sdk-node](https://www.npmjs.com/package/@opentelemetry/sdk-node) — Node OpenTelemetry SDK
324
+ - [@earendil-works/pi-coding-agent](https://www.npmjs.com/package/@earendil-works/pi-coding-agent) — Pi 扩展 API(对等依赖)
325
+
326
+ ## 关于 Langfuse 技能
327
+
328
+ 此包包含一个 Langfuse CLI 技能(位于 `.agents/skills/langfuse/`),使您可以直接从 Pi 查询 Langfuse 数据。无需离开终端即可查看追踪、提示词、数据集和分数。全局安装扩展时该技能会自动注册。
117
329
 
118
330
  ## 许可证
119
331
 
120
- MIT
332
+ MIT
package/image.png ADDED
Binary file