bug: code evaluator docs show `data_type`/`dataType` as equivalent, but a plain dict return requires camelCase in both languages

在 Langfuse 的 Code Evaluator 中,如果 Python 函数返回一个普通字典(plain dict),则字典内每个 score 都必须使用 dataType (camelCase)键名,即使是在 Python 环境中。若使用 data_type (snake_case),运行

快速结论:在 Langfuse 的 Code Evaluator 中,如果 Python 函数返回一个普通字典(plain dict),则字典内每个 score 都必须使用 dataType(camelCase)键名,即使是在 Python 环境中。若使用 data_type(snake_case),运行时会报 INVALID_RESULT。优先检查字典键名是否为 dataType

适用环境:Langfuse Cloud(Issue 确认);Python 编写的 Code Evaluator;返回普通字典(非 Score 数据类)的场景。

最快修复方案:将字典中每个 score 的 "data_type" 改为 "dataType"。例如将 {"name": "example", "value": True, "data_type": "BOOLEAN"} 改为 {"name": "example", "value": True, "dataType": "BOOLEAN"}。此方案已在 Issue 讨论中验证有效。

注意事项:

  • 如果使用 Score 数据类(dataclass)返回结果(如 Issue 中 Python 示例所示),则不会触发此问题,因为数据类的序列化由框架处理,内部 data_type 字段会被正确转换。
  • 该问题仅影响直接返回普通字典的 Code Evaluator;使用 TypeScript 编写时无此歧义。
  • Langfuse 官方尚未在验证层支持 data_type 作为别名,未来可能更新,但目前必须遵守后端 schema 的 dataType 要求。

问题场景

用户在 Langfuse 中创建了一个 Code Evaluator(通过 POST /api/public/unstable/evaluators 或 UI 页面),并编写了 Python 源码返回一个普通字典,例如:

def evaluate(ctx: EvaluationContext) -> EvaluationResult:
    return {
        "scores": [
            {"name": "example", "value": True, "data_type": "BOOLEAN"}
        ]
    }

随后通过 Evaluation Rule 运行该 Evaluator 时,触发错误。

报错原文

{
  "error": {
    "code": "INVALID_RESULT",
    "message": "The evaluator returned an invalid result. Return { scores: [...] } with at least one score. Each score requires a name, dataType, and value; dataType must match the value type. See https://langfuse.com/docs/evaluation/evaluation-methods/code-evaluators for details."
  }
}

原因分析

Langfuse 后端的校验逻辑(位于 packages/shared/src/features/evals/outputDefinition.ts)仅接受 camelCase 的 dataType 字段,没有为 snake_case 的 data_type 提供别名或自动转换。官方文档中将 data_type(Python)与 dataType(TypeScript)并列展示,容易让 Python 用户误以为字典中也可直接使用 data_type。实际上,只有使用 Score 数据类(dataclass)时框架才会处理命名转换,返回普通字典时需严格按照 schema 使用 dataType

环境排查

  • Python 版本:无特定限制,Issue 中未指定版本(通常 Python 3.8+ 即可)。
  • Langfuse 版本:仅在使用 Langfuse Cloud 时确认;自托管版本可能也存在相同问题(Issue 未说明)。
  • Evaluator 类型:必须为 Code Evaluator,且返回值是普通字典(plain dict)而非 Pydantic 模型或数据类。
  • 结果中 scores 字段为必选,score 对象必须包含 namevaluedataType

解决步骤

  1. 定位 Code Evaluator 的 Python 源码中返回字典的位置。
  2. 将 score 对象中的键名 data_type 替换为 dataType(保持值不变)。
  3. 保存并重新部署 Evaluator。
  4. 手动触发一次 Evaluation Rule 测试。

验证方法

运行 Evaluation Rule 后,在 Langfuse 后台查看该次评估状态。若状态变为 Completed 且不返回 INVALID_RESULT 错误,则表示问题已解决。也可直接调用相关 API 查看返回结果中无错误信息。

参考来源

langfuse/langfuse #15506

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 15527

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注