快速结论:这是 Langfuse v4 自托管版的回归 bug:当数据集条目超过约 16,383 条时,GET /api/public/datasets/{datasetName} 会返回 500 错误,根因是单条 Prisma 查询生成了过多 OR 条件,触发了 PostgreSQL 的 32,767 绑定变量硬限制。优先检查数据集条目数量是否超过该阈值,并关注官方分块修复的发布版本。
适用环境:Langfuse v4.x(v4.21.0 及 main 分支均已确认存在),自托管部署,PostgreSQL 16(该限制属于 PostgreSQL 线协议约束,适用于所有 PostgreSQL 版本)。v3 不受影响。
最快修复方案:暂无确认的一步修复方案。官方已确认问题并采纳分块查询的修复方向,但 Issue 关闭时尚未发布包含修复的版本,需等待官方发布或自行应用补丁。
注意事项:临时规避方案(如改用分页接口)不能修复根因;自行修改代码时需注意合并媒体引用结果的正确性,避免遗漏或重复。
问题场景
自托管 Langfuse v4 用户通过 GET /api/public/datasets/{datasetName} 获取数据集详情时,如果数据集条目超过约 16,383 条,接口稳定返回 500 错误。该问题与负载或时序无关,属确定性失败。同一数据集通过分页接口 GET /api/public/dataset-items?datasetName={datasetName}&page=1&limit=50 访问时正常(因为分页只传入一页数据)。生产环境中已在约 27,700 条和约 37,100 条的数据集上复现。
报错原文
Invalid `prisma.datasetItemMedia.findMany()` invocation:
Assertion violation on the database: `too many bind variables in prepared statement,
expected maximum of 32767, received 55493`
HTTP 响应体为通用错误信息:
{"message":"Internal Server Error","error":"An unknown error occurred"}
原因分析
已确认根因位于 web/src/features/media/server/datasetItemMediaReferences.ts(v4.21.0 第 40 行)。resolveDatasetItemMediaReferences 函数在一次 Prisma 查询中为每个数据集条目构建一个 OR 条件(每个条件贡献 2 个绑定变量),当数据集条目超过 16,383 条时,绑定变量总数(1 + 2 × 条目数)超过 PostgreSQL 的 32,767 硬限制,导致查询在真正执行前就失败。
该函数被四个调用方使用,其中三个是安全的(分页或单条路径),唯一不受限的是 getDatasetByNameForApi,它会把整个数据集传入。该文件是在 v4 中引入的(#14257),因此 v3 不存在此问题,属于 v3 → v4 的回归。
环境排查
- Langfuse 版本:确认是否为 v4.x(v4.21.0 及 main 分支均受影响,v3 正常)
- PostgreSQL 版本:任何版本均受影响(32,767 绑定变量限制属于 PostgreSQL 线协议约束,与具体版本无关)
- 数据集条目数:确认是否超过约 16,383 条(可通过分页接口的 total 字段确认)
- 部署方式:自托管(Docker / 源码部署)
解决步骤
- 确认问题范围:通过分页接口
GET /api/public/dataset-items?datasetName={datasetName}&page=1&limit=50确认接口正常,同时查看总条目数。 - 临时规避(仅限紧急恢复):如果业务允许,可暂时改用分页接口获取数据集内容,或通过数据库直接查询所需数据。注意这仅是绕过方案,不能修复根本问题。
- 等待官方修复:官方已确认该 bug,并计划参考仓库中已有的分块模式(如 #10246 使用 1,000 条一批、#13072 使用 10,000 条一批)来修复
resolveDatasetItemMediaReferences。请关注 Langfuse 发布说明。 - 自行应用补丁(如果愿意承担风险):可参考 Issue 建议,将
resolveDatasetItemMediaReferences中的查询按约 5,000 条目分块执行,合并结果到 map 中,确保绑定变量低于限制。修改后需进行充分测试。另一个更简单的方案是让getDatasetByNameForApi跳过媒体引用解析(因为分页接口已经安全地处理了媒体引用)。
验证方法
修复后,对包含超过 16,383 条数据集执行 GET /api/public/datasets/{datasetName},应返回 200 和完整数据集内容,不再出现 500 错误。可在服务器日志中确认不再出现 too many bind variables 的断言错误。如果自行修改了代码,建议用 20,000+ 条数据集回归测试,并同时验证分页接口和单条接口的媒体引用解析仍然正常。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


