问题与复现
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 归一化、脱敏级别或任何后端行为。
问题与复现
LANGFUSE_TRACING这个开关在仓库里有两个解析器。唯一被生产调用的是
resolveLangfuseBackend(packages/shared/src/evaluation/langfuse/resolve.ts:22-26),它用精确匹配:被导出、被测试、但生产从不调用的是
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自己。于是同一个环境变量在两个导出函数下给出相反结论:
受影响的是所有"拼写正确但大小写/空白不同"的写法:
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')refreshEvaluationBackend(apps/electron/src/main/kernelHost.ts:1294)因此拿不到LangfuseEvaluationBackend,把this.langfuseBackend置为undefinedscripts/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 不改该文件。复现证据
3a17eca6packages/shared/src/evaluation/langfuse/tracing-flag.test.ts(4 条):修复前 2 pass / 2 fail(Expected: "langfuse"/Received: "none"),修复后 4 pass / 0 failbun 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 归一化、脱敏级别或任何后端行为。