DEBUG.WIKI
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
雨云;给项目一台云服务器
RackNerd;$21.99/年 · 1GB KVM

Runner.run 能接受空列表,run_streamed 却报 Prepared model input is empty

Runner.run_streamed 曾在模型调用前拒绝空列表。区分 SDK 输入检查与供应商约束,核对包含修复的版本;业务需要非空输入时,仍应在应用边界校验。

Runner.run 能接受空列表,run_streamed 却报 Prepared model input is empty

自定义模型可以处理空输入,普通 Runner.run 也能得到答案。一旦换成流式入口,程序却在模型调用前停住:

RuntimeError: Prepared model input is empty

先确认这一点:失败发生在 runner 准备输入阶段,还是供应商返回了拒绝空输入的 HTTP 错误?两者的修复方向不同。

曾经存在一个流式路径独有的限制

Agents SDK #3994 的复现基于 v0.19.0 之后的 main 421deb75061c6dc4e5c8ee2352ef2390413906da。相同空列表在非流式入口会交给模型,在流式入口却被 SDK 提前拒绝。

#3995 于 2026 年 7 月 28 日合并,移除了这道额外检查。修复让两条路径保持一致,把供应商是否接受空输入的判断交回对应模型实现。这里没有确认首次发布该修复的发行版本,升级前需要对照安装包的变更记录。

排查时把“空”产生的位置找出来

检查传入 Runner 的 input,再检查 call_model_input_filter 是否裁剪了输入。有些应用最初传入非空消息,但过滤后列表为空,最终也会走到同一边界。

如果业务确实允许空输入,采用包含修复的 SDK。暂时无法升级且业务不要求流式时,可以先保留非流式入口。若业务根本不允许空输入,则应在应用入口拒绝并提示用户补充内容,避免把偶然的空列表一路传下去。

回归测试要看到模型真正收到什么

使用不联网的自定义测试模型,让它记录收到的 input,并返回一个固定结果。分别调用普通与流式 runner:

  • 两次模型调用都应收到空列表
  • 两次都应返回预期结果
  • 流式测试必须把 stream_events 消费到结束,不能只读首个事件

这类测试验证 SDK 路径是否一致。换回真实供应商后仍要检查其输入约束;本地测试模型能处理空列表,并不保证所有 API 都接受。为了绕过旧检查而塞入空白用户消息,还可能改变模型行为,不适合作为默认方案。