oh-langfuse 0.1.60 → 0.1.61
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.md +245 -245
- package/bin/cli.js +22 -22
- package/codex_langfuse_notify.py +422 -56
- package/package.json +6 -6
- package/scripts/auto-update-runtime.mjs +56 -54
- package/scripts/codex-langfuse-setup.mjs +127 -117
- package/scripts/langfuse-setup.mjs +71 -71
- package/scripts/opencode-langfuse-run.mjs +23 -23
- package/scripts/opencode-langfuse-setup.mjs +140 -64
- package/scripts/real-self-verify.mjs +114 -104
- package/scripts/update-langfuse-runtime.mjs +7 -6
- package/scripts/verify-update-runtime.mjs +162 -162
- package/scripts/verify-update-utils.mjs +60 -60
package/README.md
CHANGED
|
@@ -1,245 +1,245 @@
|
|
|
1
|
-
# oh-langfuse
|
|
2
|
-
|
|
3
|
-
`oh-langfuse` 是用于给 Claude Code、OpenCode、Codex 配置 Langfuse 追踪的命令行工具。它既提供交互式安装向导,也支持 `setup`、`check`、`update`、`auto-update` 等直接命令。
|
|
4
|
-
|
|
5
|
-
当前 npm 版本:`0.1.60`
|
|
6
|
-
|
|
7
|
-
## 能做什么
|
|
8
|
-
|
|
9
|
-
- 为 Claude Code 安装 `Stop` hook,把会话事件写入 Langfuse。
|
|
10
|
-
- 为 OpenCode 安装并 patch `opencode-plugin-langfuse`,开启 OpenTelemetry,并输出 `OpenCode Agent Turn` 指标。
|
|
11
|
-
- 为 Codex 安装 `notify` hook,增量读取 session JSONL 并写入 Langfuse。
|
|
12
|
-
- 记录本地 runtime 版本,支持启动前更新检查和手动更新。
|
|
13
|
-
- 校验员工号、环境变量、插件、hook、launcher、命令 shim 是否安装完整。
|
|
14
|
-
|
|
15
|
-
员工号必须匹配:
|
|
16
|
-
|
|
17
|
-
```text
|
|
18
|
-
^[a-z](?:\d{8}|wx\d{7})$
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
示例:`h00613222`、`hwx1234567`。
|
|
22
|
-
|
|
23
|
-
## 快速使用
|
|
24
|
-
|
|
25
|
-
建议始终带 `@latest`:
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
npx oh-langfuse@latest
|
|
29
|
-
npx oh-langfuse@latest setup
|
|
30
|
-
npx oh-langfuse@latest check
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
指定目标:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
npx oh-langfuse@latest setup claude
|
|
37
|
-
npx oh-langfuse@latest setup opencode
|
|
38
|
-
npx oh-langfuse@latest setup codex
|
|
39
|
-
|
|
40
|
-
npx oh-langfuse@latest check claude
|
|
41
|
-
npx oh-langfuse@latest check opencode
|
|
42
|
-
npx oh-langfuse@latest check codex
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
更新已安装运行时:
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
npx oh-langfuse@latest update all
|
|
49
|
-
npx oh-langfuse@latest update claude
|
|
50
|
-
npx oh-langfuse@latest update opencode
|
|
51
|
-
npx oh-langfuse@latest update codex
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
确认是否已经更新到 npm 最新版本:
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
npx oh-langfuse@latest verify-update all
|
|
58
|
-
npx oh-langfuse@latest verify-update opencode
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## 交互式菜单
|
|
62
|
-
|
|
63
|
-
运行 `npx oh-langfuse@latest` 会打开菜单:
|
|
64
|
-
|
|
65
|
-
- `Setup Langfuse`:选择 Claude Code、OpenCode、Codex 中的一个或多个目标安装。
|
|
66
|
-
- `Update Installed Runtimes`:刷新已安装目标的 hook、plugin、launcher、命令 shim 和 runtime 版本记录。
|
|
67
|
-
- `Check Environment`:检查 Node.js、npm、Python、pip、OpenCode CLI 等基础依赖。
|
|
68
|
-
- `Check Configuration`:检查已写入的目标配置。
|
|
69
|
-
|
|
70
|
-
多选菜单默认不选中任何目标,避免误写本地配置。
|
|
71
|
-
|
|
72
|
-
## 自动更新
|
|
73
|
-
|
|
74
|
-
安装或更新 runtime 后,工具会在:
|
|
75
|
-
|
|
76
|
-
```text
|
|
77
|
-
~/.config/oh-langfuse/runtime.json
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
记录 Claude Code / OpenCode / Codex 当前写入本机 runtime 的包名和版本。
|
|
81
|
-
|
|
82
|
-
`verify-update` 会读取这份记录,并对比 npm `oh-langfuse@latest`:
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
npx oh-langfuse@latest verify-update all
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
输出示例:
|
|
89
|
-
|
|
90
|
-
```text
|
|
91
|
-
[OK] OpenCode Langfuse runtime is current: 0.1.60
|
|
92
|
-
[FAIL] Codex Langfuse runtime is outdated: installed 0.1.59, latest 0.1.60
|
|
93
|
-
[FIX] Run: npx oh-langfuse@latest update codex
|
|
94
|
-
[SKIP] Claude not installed
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
`check` 用于检查配置完整性;`verify-update` 才用于确认本机 runtime 是否已经更新到 npm 最新版本。
|
|
98
|
-
|
|
99
|
-
OpenCode setup 会生成直接命令 shim:
|
|
100
|
-
|
|
101
|
-
- Windows:`~/.config/opencode/bin/opencode.cmd`
|
|
102
|
-
- Linux/macOS:`~/.config/opencode/bin/opencode`
|
|
103
|
-
|
|
104
|
-
新开终端后直接运行 `opencode`,会先做轻量更新检查,再转发到真实 OpenCode CLI。为了避免在 agent 启动链路里嵌套运行完整 installer,shim 默认只提示更新命令;需要更新时关闭 agent 后运行:
|
|
105
|
-
|
|
106
|
-
```bash
|
|
107
|
-
npx oh-langfuse@latest update opencode
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Claude Code 和 Codex 也会生成 launcher:
|
|
111
|
-
|
|
112
|
-
- `~/.claude/launch-claude-langfuse.cmd` / `~/.claude/launch-claude-langfuse.sh`
|
|
113
|
-
- `~/.codex/launch-codex-langfuse.cmd` / `~/.codex/launch-codex-langfuse.sh`
|
|
114
|
-
|
|
115
|
-
也可以手动触发轻量检查:
|
|
116
|
-
|
|
117
|
-
```bash
|
|
118
|
-
npx oh-langfuse@latest auto-update opencode
|
|
119
|
-
npx oh-langfuse@latest auto-update claude
|
|
120
|
-
npx oh-langfuse@latest auto-update codex
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## Skill 使用统计
|
|
124
|
-
|
|
125
|
-
当前版本把 skill 使用汇总写入每次交互的 agent-specific `Agent Turn` observation,不再额外生成独立 `Skill Use` observation。
|
|
126
|
-
|
|
127
|
-
Agent Turn 的 observation name 会带上来源,方便在 Langfuse 后台直接区分:
|
|
128
|
-
|
|
129
|
-
- `Claude Agent Turn`
|
|
130
|
-
- `OpenCode Agent Turn`
|
|
131
|
-
- `Codex Agent Turn`
|
|
132
|
-
|
|
133
|
-
常见字段:
|
|
134
|
-
|
|
135
|
-
```text
|
|
136
|
-
metadata.skill_use_count
|
|
137
|
-
metadata.unique_skill_count
|
|
138
|
-
metadata.repeated_skill_count
|
|
139
|
-
metadata.skill_names
|
|
140
|
-
metadata.skill_names_all
|
|
141
|
-
metadata.skill_invocation_modes
|
|
142
|
-
metadata.skill_agent_paths
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
Dashboard 统计建议:
|
|
146
|
-
|
|
147
|
-
```text
|
|
148
|
-
View: Observations
|
|
149
|
-
Filter: Observation Name contains Agent Turn
|
|
150
|
-
Metric: Sum skill_use_count
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
如果 Langfuse Dashboard 支持 metadata 维度,可用 `metadata.skill_names` 聚合;导出数据时可用 `metadata.skill_names_all` 保留重复调用顺序。
|
|
154
|
-
|
|
155
|
-
## 各目标写入内容
|
|
156
|
-
|
|
157
|
-
### OpenCode
|
|
158
|
-
|
|
159
|
-
写入或更新:
|
|
160
|
-
|
|
161
|
-
- `~/.config/opencode/opencode.json`
|
|
162
|
-
- `~/.config/opencode/plugins/opencode-plugin-langfuse`
|
|
163
|
-
- `~/.config/opencode-plugin-langfuse/config.json`
|
|
164
|
-
- `~/.config/opencode/launch-opencode-langfuse.cmd` 或 `.sh`
|
|
165
|
-
- `~/.config/opencode/bin/opencode.cmd` 或 `opencode`
|
|
166
|
-
|
|
167
|
-
Windows 下会尝试写入用户级 `LANGFUSE_PUBLIC_KEY`、`LANGFUSE_SECRET_KEY`、`LANGFUSE_BASEURL`、`LANGFUSE_USER_ID`。当前终端不会立即继承用户级环境变量,新开终端或使用 launcher 即可生效。
|
|
168
|
-
|
|
169
|
-
### Claude Code
|
|
170
|
-
|
|
171
|
-
写入或更新:
|
|
172
|
-
|
|
173
|
-
- `~/.claude/hooks/langfuse_hook.py`
|
|
174
|
-
- `~/.claude/langfuse-venv`
|
|
175
|
-
- `~/.claude/settings.json`
|
|
176
|
-
- `~/.claude/bin/claude.cmd` 或 `claude`
|
|
177
|
-
- `~/.claude/launch-claude-langfuse.cmd` 或 `.sh`
|
|
178
|
-
|
|
179
|
-
Linux 环境缺少 `python3-venv/ensurepip` 时,安装器会降级尝试 `python3 -m pip --user`、`pip3 --user`、`pip --user` 安装 `langfuse`。
|
|
180
|
-
|
|
181
|
-
### Codex
|
|
182
|
-
|
|
183
|
-
写入或更新:
|
|
184
|
-
|
|
185
|
-
- `~/.codex/hooks/codex_langfuse_notify.py`
|
|
186
|
-
- `~/.codex/langfuse-venv`
|
|
187
|
-
- `~/.codex/langfuse/config.json`
|
|
188
|
-
- `~/.codex/config.toml` 顶层 `notify`
|
|
189
|
-
- `~/.codex/bin/codex.cmd` 或 `codex`
|
|
190
|
-
- `~/.codex/launch-codex-langfuse.cmd` 或 `.sh`
|
|
191
|
-
|
|
192
|
-
配置后需要重启 Codex,让新的 notify 命令加载。notify hook 会增量读取 `~/.codex/sessions/**/*.jsonl`,并把读取偏移记录到 `~/.codex/langfuse/state.json`。
|
|
193
|
-
|
|
194
|
-
notify hook 会读取 `~/.codex/langfuse/config.json`(或 `CODEX_HOME/langfuse/config.json`)中的 `baseUrl` / `host`,并把该主机补入 `NO_PROXY`,避免自建 Langfuse 服务被代理干扰。
|
|
195
|
-
|
|
196
|
-
## 环境变量
|
|
197
|
-
|
|
198
|
-
| 变量 | 作用 |
|
|
199
|
-
| --- | --- |
|
|
200
|
-
| `LANGFUSE_BASEURL` / `LANGFUSE_HOST` | Langfuse 服务地址 |
|
|
201
|
-
| `LANGFUSE_PUBLIC_KEY` | Langfuse public key |
|
|
202
|
-
| `LANGFUSE_SECRET_KEY` | Langfuse secret key |
|
|
203
|
-
| `LANGFUSE_USER_ID` / `CC_USER_ID` | 用户标识,必须匹配员工号规则 |
|
|
204
|
-
| `CODEX_HOME` | 自定义 Codex home 目录 |
|
|
205
|
-
| `OPENCODE_SKIP_PLUGIN_INSTALL` | 跳过 OpenCode npm 插件安装 |
|
|
206
|
-
| `OPENCODE_NPM_REGISTRY` | OpenCode 插件 npm 安装 registry |
|
|
207
|
-
| `LANGFUSE_PIP_INDEX_URL` | Python `langfuse` 安装 index |
|
|
208
|
-
|
|
209
|
-
Secret key 不会在交互式界面中明文展示。
|
|
210
|
-
|
|
211
|
-
## WSL
|
|
212
|
-
|
|
213
|
-
WSL 用户请在 WSL shell 中直接安装和检查:
|
|
214
|
-
|
|
215
|
-
```bash
|
|
216
|
-
npx oh-langfuse@latest setup opencode --userId=h00613222 --yes
|
|
217
|
-
npx oh-langfuse@latest check opencode
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
工具不会做 Windows 到 WSL 的转发;在 WSL 中运行时,配置写入 WSL 用户自己的 `$HOME/.config/opencode`。
|
|
221
|
-
|
|
222
|
-
## 开发与验证
|
|
223
|
-
|
|
224
|
-
```bash
|
|
225
|
-
npm run check
|
|
226
|
-
npm test
|
|
227
|
-
npm pack --dry-run
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
涉及安装、hook、CLI、OpenCode、Claude Code、Codex、Langfuse、packaging 或 verification 行为的修改,应运行真实闭环验证:
|
|
231
|
-
|
|
232
|
-
```bash
|
|
233
|
-
npm run self:verify -- --targets=opencode --userId=h00613222
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
完整覆盖可运行:
|
|
237
|
-
|
|
238
|
-
```bash
|
|
239
|
-
npm run self:verify -- --targets=claude,opencode,codex --userId=h00613222
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
发布包暴露两个命令:
|
|
243
|
-
|
|
244
|
-
- `oh-langfuse`
|
|
245
|
-
- `code-tool-langfuse`
|
|
1
|
+
# oh-langfuse
|
|
2
|
+
|
|
3
|
+
`oh-langfuse` 是用于给 Claude Code、OpenCode、Codex 配置 Langfuse 追踪的命令行工具。它既提供交互式安装向导,也支持 `setup`、`check`、`update`、`auto-update` 等直接命令。
|
|
4
|
+
|
|
5
|
+
当前 npm 版本:`0.1.60`
|
|
6
|
+
|
|
7
|
+
## 能做什么
|
|
8
|
+
|
|
9
|
+
- 为 Claude Code 安装 `Stop` hook,把会话事件写入 Langfuse。
|
|
10
|
+
- 为 OpenCode 安装并 patch `opencode-plugin-langfuse`,开启 OpenTelemetry,并输出 `OpenCode Agent Turn` 指标。
|
|
11
|
+
- 为 Codex 安装 `notify` hook,增量读取 session JSONL 并写入 Langfuse。
|
|
12
|
+
- 记录本地 runtime 版本,支持启动前更新检查和手动更新。
|
|
13
|
+
- 校验员工号、环境变量、插件、hook、launcher、命令 shim 是否安装完整。
|
|
14
|
+
|
|
15
|
+
员工号必须匹配:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
^[a-z](?:\d{8}|wx\d{7})$
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
示例:`h00613222`、`hwx1234567`。
|
|
22
|
+
|
|
23
|
+
## 快速使用
|
|
24
|
+
|
|
25
|
+
建议始终带 `@latest`:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npx oh-langfuse@latest
|
|
29
|
+
npx oh-langfuse@latest setup
|
|
30
|
+
npx oh-langfuse@latest check
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
指定目标:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npx oh-langfuse@latest setup claude
|
|
37
|
+
npx oh-langfuse@latest setup opencode
|
|
38
|
+
npx oh-langfuse@latest setup codex
|
|
39
|
+
|
|
40
|
+
npx oh-langfuse@latest check claude
|
|
41
|
+
npx oh-langfuse@latest check opencode
|
|
42
|
+
npx oh-langfuse@latest check codex
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
更新已安装运行时:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npx oh-langfuse@latest update all
|
|
49
|
+
npx oh-langfuse@latest update claude
|
|
50
|
+
npx oh-langfuse@latest update opencode
|
|
51
|
+
npx oh-langfuse@latest update codex
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
确认是否已经更新到 npm 最新版本:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npx oh-langfuse@latest verify-update all
|
|
58
|
+
npx oh-langfuse@latest verify-update opencode
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 交互式菜单
|
|
62
|
+
|
|
63
|
+
运行 `npx oh-langfuse@latest` 会打开菜单:
|
|
64
|
+
|
|
65
|
+
- `Setup Langfuse`:选择 Claude Code、OpenCode、Codex 中的一个或多个目标安装。
|
|
66
|
+
- `Update Installed Runtimes`:刷新已安装目标的 hook、plugin、launcher、命令 shim 和 runtime 版本记录。
|
|
67
|
+
- `Check Environment`:检查 Node.js、npm、Python、pip、OpenCode CLI 等基础依赖。
|
|
68
|
+
- `Check Configuration`:检查已写入的目标配置。
|
|
69
|
+
|
|
70
|
+
多选菜单默认不选中任何目标,避免误写本地配置。
|
|
71
|
+
|
|
72
|
+
## 自动更新
|
|
73
|
+
|
|
74
|
+
安装或更新 runtime 后,工具会在:
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
~/.config/oh-langfuse/runtime.json
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
记录 Claude Code / OpenCode / Codex 当前写入本机 runtime 的包名和版本。
|
|
81
|
+
|
|
82
|
+
`verify-update` 会读取这份记录,并对比 npm `oh-langfuse@latest`:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
npx oh-langfuse@latest verify-update all
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
输出示例:
|
|
89
|
+
|
|
90
|
+
```text
|
|
91
|
+
[OK] OpenCode Langfuse runtime is current: 0.1.60
|
|
92
|
+
[FAIL] Codex Langfuse runtime is outdated: installed 0.1.59, latest 0.1.60
|
|
93
|
+
[FIX] Run: npx oh-langfuse@latest update codex
|
|
94
|
+
[SKIP] Claude not installed
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`check` 用于检查配置完整性;`verify-update` 才用于确认本机 runtime 是否已经更新到 npm 最新版本。
|
|
98
|
+
|
|
99
|
+
OpenCode setup 会生成直接命令 shim:
|
|
100
|
+
|
|
101
|
+
- Windows:`~/.config/opencode/bin/opencode.cmd`
|
|
102
|
+
- Linux/macOS:`~/.config/opencode/bin/opencode`
|
|
103
|
+
|
|
104
|
+
新开终端后直接运行 `opencode`,会先做轻量更新检查,再转发到真实 OpenCode CLI。为了避免在 agent 启动链路里嵌套运行完整 installer,shim 默认只提示更新命令;需要更新时关闭 agent 后运行:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npx oh-langfuse@latest update opencode
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Claude Code 和 Codex 也会生成 launcher:
|
|
111
|
+
|
|
112
|
+
- `~/.claude/launch-claude-langfuse.cmd` / `~/.claude/launch-claude-langfuse.sh`
|
|
113
|
+
- `~/.codex/launch-codex-langfuse.cmd` / `~/.codex/launch-codex-langfuse.sh`
|
|
114
|
+
|
|
115
|
+
也可以手动触发轻量检查:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npx oh-langfuse@latest auto-update opencode
|
|
119
|
+
npx oh-langfuse@latest auto-update claude
|
|
120
|
+
npx oh-langfuse@latest auto-update codex
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Skill 使用统计
|
|
124
|
+
|
|
125
|
+
当前版本把 skill 使用汇总写入每次交互的 agent-specific `Agent Turn` observation,不再额外生成独立 `Skill Use` observation。
|
|
126
|
+
|
|
127
|
+
Agent Turn 的 observation name 会带上来源,方便在 Langfuse 后台直接区分:
|
|
128
|
+
|
|
129
|
+
- `Claude Agent Turn`
|
|
130
|
+
- `OpenCode Agent Turn`
|
|
131
|
+
- `Codex Agent Turn`
|
|
132
|
+
|
|
133
|
+
常见字段:
|
|
134
|
+
|
|
135
|
+
```text
|
|
136
|
+
metadata.skill_use_count
|
|
137
|
+
metadata.unique_skill_count
|
|
138
|
+
metadata.repeated_skill_count
|
|
139
|
+
metadata.skill_names
|
|
140
|
+
metadata.skill_names_all
|
|
141
|
+
metadata.skill_invocation_modes
|
|
142
|
+
metadata.skill_agent_paths
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Dashboard 统计建议:
|
|
146
|
+
|
|
147
|
+
```text
|
|
148
|
+
View: Observations
|
|
149
|
+
Filter: Observation Name contains Agent Turn
|
|
150
|
+
Metric: Sum skill_use_count
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
如果 Langfuse Dashboard 支持 metadata 维度,可用 `metadata.skill_names` 聚合;导出数据时可用 `metadata.skill_names_all` 保留重复调用顺序。
|
|
154
|
+
|
|
155
|
+
## 各目标写入内容
|
|
156
|
+
|
|
157
|
+
### OpenCode
|
|
158
|
+
|
|
159
|
+
写入或更新:
|
|
160
|
+
|
|
161
|
+
- `~/.config/opencode/opencode.json`
|
|
162
|
+
- `~/.config/opencode/plugins/opencode-plugin-langfuse`
|
|
163
|
+
- `~/.config/opencode-plugin-langfuse/config.json`
|
|
164
|
+
- `~/.config/opencode/launch-opencode-langfuse.cmd` 或 `.sh`
|
|
165
|
+
- `~/.config/opencode/bin/opencode.cmd` 或 `opencode`
|
|
166
|
+
|
|
167
|
+
Windows 下会尝试写入用户级 `LANGFUSE_PUBLIC_KEY`、`LANGFUSE_SECRET_KEY`、`LANGFUSE_BASEURL`、`LANGFUSE_USER_ID`。当前终端不会立即继承用户级环境变量,新开终端或使用 launcher 即可生效。
|
|
168
|
+
|
|
169
|
+
### Claude Code
|
|
170
|
+
|
|
171
|
+
写入或更新:
|
|
172
|
+
|
|
173
|
+
- `~/.claude/hooks/langfuse_hook.py`
|
|
174
|
+
- `~/.claude/langfuse-venv`
|
|
175
|
+
- `~/.claude/settings.json`
|
|
176
|
+
- `~/.claude/bin/claude.cmd` 或 `claude`
|
|
177
|
+
- `~/.claude/launch-claude-langfuse.cmd` 或 `.sh`
|
|
178
|
+
|
|
179
|
+
Linux 环境缺少 `python3-venv/ensurepip` 时,安装器会降级尝试 `python3 -m pip --user`、`pip3 --user`、`pip --user` 安装 `langfuse`。
|
|
180
|
+
|
|
181
|
+
### Codex
|
|
182
|
+
|
|
183
|
+
写入或更新:
|
|
184
|
+
|
|
185
|
+
- `~/.codex/hooks/codex_langfuse_notify.py`
|
|
186
|
+
- `~/.codex/langfuse-venv`
|
|
187
|
+
- `~/.codex/langfuse/config.json`
|
|
188
|
+
- `~/.codex/config.toml` 顶层 `notify`
|
|
189
|
+
- `~/.codex/bin/codex.cmd` 或 `codex`
|
|
190
|
+
- `~/.codex/launch-codex-langfuse.cmd` 或 `.sh`
|
|
191
|
+
|
|
192
|
+
配置后需要重启 Codex,让新的 notify 命令加载。notify hook 会增量读取 `~/.codex/sessions/**/*.jsonl`,并把读取偏移记录到 `~/.codex/langfuse/state.json`。
|
|
193
|
+
|
|
194
|
+
notify hook 会读取 `~/.codex/langfuse/config.json`(或 `CODEX_HOME/langfuse/config.json`)中的 `baseUrl` / `host`,并把该主机补入 `NO_PROXY`,避免自建 Langfuse 服务被代理干扰。
|
|
195
|
+
|
|
196
|
+
## 环境变量
|
|
197
|
+
|
|
198
|
+
| 变量 | 作用 |
|
|
199
|
+
| --- | --- |
|
|
200
|
+
| `LANGFUSE_BASEURL` / `LANGFUSE_HOST` | Langfuse 服务地址 |
|
|
201
|
+
| `LANGFUSE_PUBLIC_KEY` | Langfuse public key |
|
|
202
|
+
| `LANGFUSE_SECRET_KEY` | Langfuse secret key |
|
|
203
|
+
| `LANGFUSE_USER_ID` / `CC_USER_ID` | 用户标识,必须匹配员工号规则 |
|
|
204
|
+
| `CODEX_HOME` | 自定义 Codex home 目录 |
|
|
205
|
+
| `OPENCODE_SKIP_PLUGIN_INSTALL` | 跳过 OpenCode npm 插件安装 |
|
|
206
|
+
| `OPENCODE_NPM_REGISTRY` | OpenCode 插件 npm 安装 registry |
|
|
207
|
+
| `LANGFUSE_PIP_INDEX_URL` | Python `langfuse` 安装 index |
|
|
208
|
+
|
|
209
|
+
Secret key 不会在交互式界面中明文展示。
|
|
210
|
+
|
|
211
|
+
## WSL
|
|
212
|
+
|
|
213
|
+
WSL 用户请在 WSL shell 中直接安装和检查:
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
npx oh-langfuse@latest setup opencode --userId=h00613222 --yes
|
|
217
|
+
npx oh-langfuse@latest check opencode
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
工具不会做 Windows 到 WSL 的转发;在 WSL 中运行时,配置写入 WSL 用户自己的 `$HOME/.config/opencode`。
|
|
221
|
+
|
|
222
|
+
## 开发与验证
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
npm run check
|
|
226
|
+
npm test
|
|
227
|
+
npm pack --dry-run
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
涉及安装、hook、CLI、OpenCode、Claude Code、Codex、Langfuse、packaging 或 verification 行为的修改,应运行真实闭环验证:
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
npm run self:verify -- --targets=opencode --userId=h00613222
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
完整覆盖可运行:
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
npm run self:verify -- --targets=claude,opencode,codex --userId=h00613222
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
发布包暴露两个命令:
|
|
243
|
+
|
|
244
|
+
- `oh-langfuse`
|
|
245
|
+
- `code-tool-langfuse`
|
package/bin/cli.js
CHANGED
|
@@ -794,13 +794,13 @@ function printHelp() {
|
|
|
794
794
|
"oh-langfuse check codex",
|
|
795
795
|
"oh-langfuse update",
|
|
796
796
|
"oh-langfuse update all",
|
|
797
|
-
"oh-langfuse update claude",
|
|
798
|
-
"oh-langfuse update opencode",
|
|
799
|
-
"oh-langfuse update codex",
|
|
800
|
-
"oh-langfuse verify-update all",
|
|
801
|
-
"oh-langfuse verify-update opencode",
|
|
802
|
-
"oh-langfuse auto-update opencode"
|
|
803
|
-
]);
|
|
797
|
+
"oh-langfuse update claude",
|
|
798
|
+
"oh-langfuse update opencode",
|
|
799
|
+
"oh-langfuse update codex",
|
|
800
|
+
"oh-langfuse verify-update all",
|
|
801
|
+
"oh-langfuse verify-update opencode",
|
|
802
|
+
"oh-langfuse auto-update opencode"
|
|
803
|
+
]);
|
|
804
804
|
renderSection("Options", [
|
|
805
805
|
`${paint("--dry-run", t.gold)} Preview actions without writing files or installing packages.`,
|
|
806
806
|
`${paint("--userId=ID", t.gold)} Provide the Langfuse user id without prompting.`,
|
|
@@ -867,23 +867,23 @@ async function main() {
|
|
|
867
867
|
];
|
|
868
868
|
return runNodeScript("update-langfuse-runtime.mjs", updateArgs, options);
|
|
869
869
|
}
|
|
870
|
-
if (cmd === "auto-update") {
|
|
871
|
-
return runNodeScript("auto-update-runtime.mjs", [
|
|
872
|
-
target || "all",
|
|
873
|
-
...(hasValue(options.npmRegistry) ? [`--npmRegistry=${options.npmRegistry}`] : []),
|
|
874
|
-
...(hasValue(options.pipIndexUrl) ? [`--pipIndexUrl=${options.pipIndexUrl}`] : []),
|
|
870
|
+
if (cmd === "auto-update") {
|
|
871
|
+
return runNodeScript("auto-update-runtime.mjs", [
|
|
872
|
+
target || "all",
|
|
873
|
+
...(hasValue(options.npmRegistry) ? [`--npmRegistry=${options.npmRegistry}`] : []),
|
|
874
|
+
...(hasValue(options.pipIndexUrl) ? [`--pipIndexUrl=${options.pipIndexUrl}`] : []),
|
|
875
875
|
...(options.skipCheck ? ["--skip-check"] : []),
|
|
876
876
|
...(options.startupStatus ? ["--startup-status"] : []),
|
|
877
|
-
...(options.yes ? ["--yes"] : []),
|
|
878
|
-
], { ...options, quiet: true });
|
|
879
|
-
}
|
|
880
|
-
if (cmd === "verify-update") {
|
|
881
|
-
return runNodeScript("verify-update-runtime.mjs", [
|
|
882
|
-
target || "all",
|
|
883
|
-
...(hasValue(options.npmRegistry) ? [`--npmRegistry=${options.npmRegistry}`] : []),
|
|
884
|
-
], { ...options, quiet: true });
|
|
885
|
-
}
|
|
886
|
-
if (cmd === "check" && target === "claude") return checkClaude(options);
|
|
877
|
+
...(options.yes ? ["--yes"] : []),
|
|
878
|
+
], { ...options, quiet: true });
|
|
879
|
+
}
|
|
880
|
+
if (cmd === "verify-update") {
|
|
881
|
+
return runNodeScript("verify-update-runtime.mjs", [
|
|
882
|
+
target || "all",
|
|
883
|
+
...(hasValue(options.npmRegistry) ? [`--npmRegistry=${options.npmRegistry}`] : []),
|
|
884
|
+
], { ...options, quiet: true });
|
|
885
|
+
}
|
|
886
|
+
if (cmd === "check" && target === "claude") return checkClaude(options);
|
|
887
887
|
if (cmd === "check" && target === "opencode") return checkOpenCode(options);
|
|
888
888
|
if (cmd === "check" && target === "codex") return checkCodex(options);
|
|
889
889
|
if (cmd === "check" && target === "environment") {
|