快速结论:在 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 对象必须包含
name、value和dataType。
解决步骤
- 定位 Code Evaluator 的 Python 源码中返回字典的位置。
- 将 score 对象中的键名
data_type替换为dataType(保持值不变)。 - 保存并重新部署 Evaluator。
- 手动触发一次 Evaluation Rule 测试。
验证方法
运行 Evaluation Rule 后,在 Langfuse 后台查看该次评估状态。若状态变为 Completed 且不返回 INVALID_RESULT 错误,则表示问题已解决。也可直接调用相关 API 查看返回结果中无错误信息。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Question]: Models disappear after upgrading RAGFlow from v0.25.6 to v0.26.0](https://www.chat-gpts.plus/wp-content/uploads/2026/07/15972-570c996c-768x403.jpg)
![[Bug]: vllm instance already exist, while trying to add models with different host ports](https://www.chat-gpts.plus/wp-content/uploads/2026/07/16126-1c98a863-768x403.jpg)
![[Bug]: OIDC login allows new user registration even when REGISTER_ENABLED=0](https://www.chat-gpts.plus/wp-content/uploads/2026/07/16103-4071df7a-768x403.jpg)