oh-langfuse 0.1.34 → 0.1.35

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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  `oh-langfuse` 是用于给 Claude Code、OpenCode 和 Codex 配置 Langfuse 追踪的命令行工具。它提供交互式安装向导,也支持 `setup` / `check` 直接命令,方便在用户机器上安装、修复和校验配置。
4
4
 
5
- 当前 npm 版本:`0.1.34`
5
+ 当前 npm 版本:`0.1.35`
6
6
 
7
7
  ## 能做什么
8
8
 
@@ -55,22 +55,23 @@ npx oh-langfuse@latest auto-update codex
55
55
 
56
56
  ## Skill 使用量统计
57
57
 
58
- 工具会为每次识别到的 skill 使用额外写入一条 observation
58
+ 工具会为每次识别到的 skill 使用额外写入一条通用 observation,skill 名称放在 metadata 中:
59
59
 
60
60
  ```text
61
- Skill Use / <skill_name>
61
+ Observation Name: Skill Use
62
+ metadata.skill_name: <skill_name>
63
+ metadata.skill_use_count: 1
62
64
  ```
63
65
 
64
- Dashboard 中统计各 skill 使用量可配置:
66
+ Dashboard 中统计全部 skill 使用量可配置:
65
67
 
66
68
  ```text
67
69
  View: Observations
68
70
  Metric: Count
69
- Filter: Observation Name contains Skill Use /
70
- Breakdown Dimension: Observation Name
71
+ Filter: Observation Name equals Skill Use
71
72
  ```
72
73
 
73
- `AI Interaction` 仍然保留 `skill_use_count`、`skill_names`、`skill_names_json` 和 `skill_names_csv`,用于查看单次交互的效率汇总。为避免极端情况下产生过多 observation,OpenCode 每次交互最多记录 20 个去重后的 skill 使用事件。
74
+ 如果当前 Langfuse Dashboard 支持 metadata 维度,可用 `metadata.skill_name` 做 Breakdown 来看各 skill 使用量;否则可用 Metrics API 或导出数据按 `metadata.skill_name` 聚合。`AI Interaction` 仍然保留 `skill_use_count`、`skill_names`、`skill_names_json` 和 `skill_names_csv`,用于查看单次交互的效率汇总。为避免极端情况下产生过多 observation,OpenCode 每次交互最多记录 20 个去重后的 skill 使用事件。
74
75
 
75
76
  本地开发运行:
76
77
 
@@ -655,7 +655,7 @@ def emit_codex_turn(
655
655
 
656
656
  for skill in skill_usages:
657
657
  with langfuse.start_as_current_observation(
658
- name=f"Skill Use / {skill['name']}",
658
+ name="Skill Use",
659
659
  metadata={
660
660
  "source": "codex",
661
661
  "user_id": user_id or "",
package/langfuse_hook.py CHANGED
@@ -689,7 +689,7 @@ def emit_turn(
689
689
 
690
690
  for skill in skill_usages:
691
691
  with langfuse.start_as_current_observation(
692
- name=f"Skill Use / {skill['name']}",
692
+ name="Skill Use",
693
693
  metadata={
694
694
  "source": "claude",
695
695
  "user_id": user_id or "",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-langfuse",
3
- "version": "0.1.34",
3
+ "version": "0.1.35",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Use npm scripts to configure Claude Code / OpenCode / Codex with Langfuse tracing.",
@@ -468,7 +468,7 @@ function getPatchedLangfuseDistIndexJs() {
468
468
  " };",
469
469
  " const emitSkillUseSpans = ({ skillNames, sessionId, messageId, interactionId }) => {",
470
470
  " for (const skillName of skillNames.slice(0, MAX_SKILL_USE_SPANS_PER_INTERACTION)) {",
471
- " const span = metricsTracer.startSpan(`Skill Use / ${skillName}`);",
471
+ " const span = metricsTracer.startSpan('Skill Use');",
472
472
  ' span.setAttribute("oh.langfuse.source", "opencode");',
473
473
  ' span.setAttribute("oh.langfuse.user_id", userId || "");',
474
474
  ' span.setAttribute("oh.langfuse.metrics_schema_version", "1.0");',
@@ -980,7 +980,14 @@ async function main() {
980
980
  };
981
981
  const merged = deepMerge(existing, desired);
982
982
  writeJsonPretty(opencodeJsonPath, merged);
983
- const realOpencodeCli = resolveOpencodeCli(args.cmd);
983
+ let realOpencodeCli = resolveOpencodeCli(args.cmd);
984
+ const shimDir = path.join(opencodeDir, "bin");
985
+ if (realOpencodeCli) {
986
+ const relativeToShim = path.relative(path.resolve(shimDir), path.resolve(realOpencodeCli));
987
+ if (relativeToShim && !relativeToShim.startsWith("..") && !path.isAbsolute(relativeToShim)) {
988
+ realOpencodeCli = "";
989
+ }
990
+ }
984
991
  console.log(`已更新:${opencodeJsonPath}`);
985
992
 
986
993
  const launcher = writeWindowsLauncherCmd(opencodeDir, { publicKey, secretKey, baseUrl, userId });