Skip to content

fix(eval): LANGFUSE_TRACING 的开关解析有两套实现,TRUE / ' on ' 等写法在真实后台上静默失效 #304

Description

@wxrbyte

问题与复现

LANGFUSE_TRACING 这个开关在仓库里有两个解析器。

唯一被生产调用的是 resolveLangfuseBackend(packages/shared/src/evaluation/langfuse/resolve.ts:22-26),它用精确匹配:

const enabled = input.settings.langfuseTracingEnabled === true
  || env.LANGFUSE_TRACING === 'true'
  || env.LANGFUSE_TRACING === '1'
  || env.LANGFUSE_TRACING === 'yes'
  || env.LANGFUSE_TRACING === 'on';

被导出、被测试、但生产从不调用的是 isLangfuseTracingEnabled(packages/shared/src/evaluation/langfuse/backend.ts:224-233):trim().toLowerCase(),并且显式处理 0/false/off/no。它经 barrel 导出(.../langfuse/index.ts 的 export * from './backend.ts'),但全仓只有一处引用,就是 langfuse.test.ts:356 自己。

于是同一个环境变量在两个导出函数下给出相反结论:

isLangfuseTracingEnabled({ langfuseTracingEnabled: false }, { LANGFUSE_TRACING: 'TRUE' })
// => true

resolveLangfuseBackend({
  settings: { langfuseTracingEnabled: false, langfuseHost: 'http://localhost:9', privacyLevel: 'standard' },
  storedCredential: serializeLangfuseCredential('pk', 'sk'),
  env: { LANGFUSE_TRACING: 'TRUE' },
}).kind
// => 'none'      真实后端根本不会被创建

受影响的是所有"拼写正确但大小写/空白不同"的写法:TRUE、True、YES、ON、' on '、' true '。export LANGFUSE_TRACING=TRUE、CI/Docker 的 env、.env 里带尾随空格的行都很容易产生这类值。

影响(生产路径)

docs/langfuse-tracing.md:13 把 LANGFUSE_TRACING 列为开启跟踪的开关(:18 只说明用 false 关闭)。按上述写法设置时跟踪被静默跳过:

  • resolveLangfuseBackend 返回 NoopEvaluationBackend(kind === 'none')
  • kernel 侧 refreshEvaluationBackend(apps/electron/src/main/kernelHost.ts:1294)因此拿不到 LangfuseEvaluationBackend,把 this.langfuseBackend 置为 undefined
  • scripts/eval/run.ts:826 走同一条路径,评估 CLI 同样不报错

没有任何错误提示,表现只是"开了但没数据"。

预期与修复方向

同一次开关解析应当只有一份实现:resolveLangfuseBackend 直接调用已导出的 isLangfuseTracingEnabled(settings, env),这样 settings.langfuseTracingEnabled === true 的优先级、以及 0/false/off/no 的负面词处理都保持不变,同时把大小写/空白写法统一进来。

另注:scripts/eval/run.ts:828-831 还有第三份内联副本(只认 true/1/yes)。因为 resolve.ts 也会读 env,这份副本在最终结果上不起作用,属于可以后续清理的重复;本 issue 不改该文件。

复现证据

  • OS:Windows 11;Bun 1.4.2;上游 main 3a17eca6
  • 新增 packages/shared/src/evaluation/langfuse/tracing-flag.test.ts(4 条):修复前 2 pass / 2 fail(Expected: "langfuse" / Received: "none"),修复后 4 pass / 0 fail
  • bun test packages/shared/src/evaluation/langfuse --isolate:修复后 16 pass / 1 fail;唯一失败 langfuse backend > does not throw when Langfuse is down — agent path keeps a diagnostic 在 main 原始字节下同样失败(A/B 后已还原、md5 校验一致),属既存问题
  • bun run typecheck:core / i18n / shared / ui / electron 五工作区 exit 0

范围

只改 resolve.ts 的开关判定(改用导出解析器)。不改 isLangfuseTracingEnabled 自身的语义,不改 scripts/eval/run.ts,不改凭证解析、host 归一化、脱敏级别或任何后端行为。

No activity

Activity on this issue will appear here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

claimedClaimed by a contributor and currently in progress

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions