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/.trae/documents/optimize_langfuse_reporting.md +68 -0
- package/.trae/documents/pi-langfuse-refactor.md +78 -0
- package/AGENTS.md +33 -42
- package/README.md +270 -59
- package/README_CN.md +273 -61
- package/image.png +0 -0
- package/index.ts +109 -491
- package/package.json +18 -3
- package/src/config.ts +98 -0
- package/src/constants.ts +15 -0
- package/src/handlers/agent.ts +136 -0
- package/src/handlers/generation.ts +239 -0
- package/src/handlers/tool.ts +126 -0
- package/src/handlers/turn.ts +53 -0
- package/src/langfuse.ts +75 -0
- package/src/state.ts +38 -0
- package/src/types.ts +94 -0
- package/src/utils.ts +273 -0
- package/tsconfig.json +1 -0
package/README_CN.md
CHANGED
|
@@ -1,32 +1,106 @@
|
|
|
1
1
|
# pi-langfuse
|
|
2
2
|
|
|
3
|
-
[
|
|
3
|
+
[](https://www.npmjs.com/package/pi-langfuse)
|
|
4
|
+
[](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
|
|
12
|
+
Langfuse 为 LLM 应用程序提供开源的可观测性。此扩展允许您以生产级细节**追踪**、**监控**和**调试**您的 Pi 会话,帮助您准确了解代理的执行情况、成本消耗以及可能出现故障的环节。
|
|
8
13
|
|
|
9
14
|
## 功能
|
|
10
15
|
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
40
|
-
```
|
|
41
|
-
~/.pi/agent/npm/@ravan08/pi-langfuse/index.ts
|
|
42
|
-
```
|
|
113
|
+
> **⚠️ 安全提醒**:`config.json` 不会被 git 跟踪。切勿将 API 密钥提交到版本控制。
|
|
43
114
|
|
|
44
115
|
## 使用
|
|
45
116
|
|
|
46
|
-
###
|
|
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
|
|
130
|
+
pi list
|
|
50
131
|
```
|
|
51
132
|
|
|
52
|
-
|
|
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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.
|
|
93
|
-
2.
|
|
94
|
-
3.
|
|
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
|
-
- 验证
|
|
102
|
-
-
|
|
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
|
-
-
|
|
107
|
-
-
|
|
305
|
+
### 启动时显示 "Missing config"?
|
|
306
|
+
- 扩展需要凭据。使用交互式 `/langfuse-setup` 命令
|
|
307
|
+
- 或设置 `LANGFUSE_PUBLIC_KEY` 和 `LANGFUSE_SECRET_KEY` 环境变量
|
|
108
308
|
|
|
109
|
-
|
|
309
|
+
### 模型/成本未显示?
|
|
110
310
|
- 并非所有提供商都公开成本信息
|
|
111
|
-
- 检查 Langfuse
|
|
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/
|
|
116
|
-
- [@
|
|
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
|