CodeX 通过 Langfuse 插件接入百度 LLM
Codex 通过 Langfuse 插件接入百度 LLM
通过 Langfuse Codex Observability Plugin 将 Codex 的对话 Trace 上报至BCM-> LLM应用性能监控。该插件以 Codex Stop Hook 机制运行,每次 Codex turn 完成后读取会话记录,转换为 Langfuse 格式的 Trace 并上报。接入后,Codex 的每次对话会在 LLM应用性能监控 中展示为一条 Trace,包含 LLM 调用、工具执行、子 Agent 等完整调用链。可参考 langfuse官方文档 了解插件的完整功能和配置选项。
前提条件
- Codex 版本 ≥ 0.128
- Node.js ≥ 22
- 百度 LLM 接入点与 Token(见步骤1)
步骤1:获取接入点与 Token
注:该信息因地域和用户而异,可在控制台“接入应用”页面获取,下方为示例
- 接入点:http://apm-collector.bj.baidubce.com
- Authentication:UFSpMM***lnFrVBqtPDK
步骤2:安装 Langfuse 插件
1codex plugin marketplace add langfuse/codex-observability-plugin
步骤3:启用插件
在 ~/.codex/config.toml 中启用:(注意自己实际运行的CodeX的目录)
1[features]
2plugin_hooks = true
3
4[plugins."tracing@codex-observability-plugin"]
5enabled = true
步骤4:配置接入凭证
在 ~/.codex/langfuse.json 中配置:
1{
2 "enabled": true,
3 "public_key": "<Authentication>",
4 "secret_key": "sk-placeholder",
5 "base_url": "http://apm-collector.bj.baidubce.com"
6}
对应的字段说明如下:
| 参数 | 描述 | 示例 |
|---|---|---|
public_key> |
步骤1获取的鉴权 Token | UFSpMM*******lnFrVBqtPDK |
<secret_key> |
任意非空字符串,服务端不校验,但必须非空 | sk-placeholder |
<endpoint> |
任意非空字符串,服务端不校验,但必须非空 | http://apm-collector.bj.baidubce.com |
<base_url> |
百度 APM 接入点 | http://apm-collector.bj.baidubce.com |
也可以使用环境变量配置:
1export TRACE_TO_LANGFUSE=true
2export LANGFUSE_PUBLIC_KEY="<Authentication>"
3export LANGFUSE_SECRET_KEY="sk-placeholder"
4export LANGFUSE_BASE_URL="http://apm-collector.bj.baidubce.com"
步骤5:设置 service.name 和 host.name(可选)
⚠️ Langfuse 插件 v0.1.0 使用 NodeTracerProvider 时未传入 resource 参数,导致 OTel SDK 使用 defaultResource() 硬编码 service.name = unknown_service:node,且不读取 OTEL_SERVICE_NAME、OTEL_RESOURCE_ATTRIBUTES 等标准环境变量。host.name 同理需手动注入。
解决方式: 设置以下环境变量,同时修改插件 bundle。
1export OTEL_SERVICE_NAME="<应用名>"
2export OTEL_RESOURCE_ATTRIBUTES="host.name=<主机名>"
编辑以下两个文件(相同修改):
| 文件 | 描述 |
|---|---|
| marketplace 源 | ~/.codex/.tmp/marketplaces/codex-observability-plugin/plugins/tracing/dist/index.mjs |
| 运行时缓存 | ~/.codex/plugins/cache/codex-observability-plugin/tracing/<版本号>/dist/index.mjs |
在 setupInstrumentation 函数中,将:
1const provider = new import_src.NodeTracerProvider({ spanProcessors: [spanProcessor] });
改为:
1const attrs = { "service.name": process.env.OTEL_SERVICE_NAME || "codex" };
2if (process.env.OTEL_RESOURCE_ATTRIBUTES) {
3 process.env.OTEL_RESOURCE_ATTRIBUTES.split(",").forEach(pair => {
4 const [k, ...v] = pair.trim().split("=");
5 if (k) attrs[k.trim()] = v.join("=").trim();
6 });
7}
8const provider = new import_src.NodeTracerProvider({
9 spanProcessors: [spanProcessor],
10 resource: require_src$3().defaultResource().merge(
11 require_src$3().resourceFromAttributes(attrs)
12 )
13});
步骤6:验证接入
重启 Codex 后发起一次对话,插件会在每个 turn 完成后触发。查看本地日志确认导出成功:
1sqlite3 ~/.codex/logs_2.sqlite "
2SELECT ts, level, feedback_log_body
3FROM logs
4WHERE feedback_log_body LIKE '%ExportSucceeded%'
5ORDER BY ts DESC LIMIT 5;"
看到 HttpMetricsClient.ExportSucceeded 或类似记录说明导出成功。
然后到 LLM应用性能监控 搜索 service.name = <你设置的应用名> 查看 Trace 数据。由于数据的处理存在一定延时,如果接入后在控制台没有查询到应用,请等待 30 秒左右。
评价此篇文章
