当前位置: 首页 > news >正文

AI多Agent协作系统实战(三十三):AI被一张截图噎住了:纯文本模型的Session里,不该有图片

一个凌晨2点的报错:unknown variant 'image_url', expected 'text'——我们的AI助手,被自己聊天记录里的一张截图噎死了。

事情是这样的

我们的系统里有四个AI"员工":小密(统筹)、小虾(开发)、小牛(测试)、小白(体验)。他们通过一个类似微信的收件箱机制协作——小密派任务,小虾开发,小牛测试,小密复核。

一切运转良好,直到那天凌晨。

任务派发出去后,小虾迟迟没有回复。去看它的会话界面,一条刺眼的红色报错循环刷屏:

错误: LLM request failed: provider rejected the request schema or tool payload.

翻译过来就是:大模型拒绝了我的请求。再往深挖,原始报错是:

400 Failed to deserialize the JSON body into the target type: messages[161]: unknown variant `image_url`, expected `text`

messages[161]——第161条消息。也就是说,我们的AI在跟大模型对话时,发过去的第161条消息是一张图片,而对方是纯文本模型,不认图片。

图片是怎么混进对话里的

小虾是开发Agent,它的工作流里有一步是"截图验证"——改完代码后用无头浏览器截图,确认页面效果。

截图是任务要求的证据,但它有个副作用:截图会以图片消息的形式,进入Agent的会话记录

我们的Agent用的是deepseek-v4-flash——一个纯文本模型。它不支持图片输入。但Agent框架并不管这些:你给了截图,我就把截图塞进消息流里发给模型。

于是一次、两次、三次……每次开发任务都攒一两张截图,会话记录越来越大。终于有一天,消息列表里第161条是一张图,模型直接拒绝解析整个请求。

不是某一张图特别大,是积累的图片让整个会话"变味"了。

排查过程:先看Session

报错出现后,第一反应是查Agent的会话状态(Session)。

小虾 Session: 4.2MB,27个会话文件

27个会话文件、4.2MB——对于一个纯文本模型来说,这是危险的信号。会话里塞满了截图、工具输出、长上下文。模型每次请求都要携带这4.2MB的"历史包袱",而其中还藏着模型根本不支持的图片。

查了模型配置、查了API密钥、查了网络……最后才在错误日志里看到那一行被淹没的原始报错:

messages[161]: unknown variant `image_url`

不是配置错了,不是密钥失效,是消息内容本身不合法——模型不认识图片这种消息类型。

修复:给Session定个"卫生标准"

问题清楚了,修复思路也就出来了——Session需要定期清理

我们写了一个自动清理脚本,规则很简单:

# 清理规则ifsession_size>3MB:# 会话太大 → 清delete(session)ifcontains_image(session):# 会话里有图片 → 清delete(session)

两个条件,命中任意一个就清理。清理掉之后,Agent下次启动会用干净的会话重新开始——它的指令在HEARTBEAT文件里(持久化),不依赖会话记忆,所以清理不会让它"失忆"。

然后把这个脚本挂到了每分钟运行的定时任务里。从此以后:

以前: Session积累图片 → 模型400拒绝 → Agent卡死 → 人工救火 现在: Session超3MB或含图 → 自动清理 → Agent永远用干净会话

这件事教给我们的三件事

第一,模型的能力边界是硬约束。不是所有模型都能看图。用纯文本模型,就要接受"图片不能进对话"这个事实。框架不会替你考虑这些——工具给了截图就塞进去,管你模型认不认。

第二,Session是会被"污染"的。会话记录不只是对话历史,它会积累工具输出、截图、中间过程。对支持图片的模型,这是上下文;对纯文本模型,这是毒药。长期运行的Agent,Session卫生和代码卫生一样重要。

第三,报错要看原始信息。provider rejected the request schema or tool payload这种报错模棱两可——真正有用的信息藏在rawError里:unknown variant 'image_url', expected 'text'框架层的报错是给运维看的,底层的原始报错才是给排查者看的。

结尾

那天凌晨,我们给AI做完"会话大扫除"之后,它立刻就活了过来——继续开发、继续测试、继续认真回复每一个任务。

后来我在清理脚本的注释里写了一句话:

对话记录里有截图,是给会看图的模型准备的。给纯文本模型的对话里塞图片,就像给一个不识字的人读报纸——不是他不想看,是这报纸递错了人。

工具不会替你想"这个模型认不认这张图"——这是你的事。

(完)


本文是"多Agent派发系统"系列第33篇。前情:一个换行符毁了一张任务表、为了省token拆了1613行代码、0字节的信任危机……技术事故都是相似的:看起来是灵异事件,查到底都是人的疏忽。

欢迎加入QQ频道共同交流。

http://www.jsqmd.com/news/1351701/

相关文章:

  • 芜湖下水道堵塞、反水反臭不用慌!各类管道故障成因,解决办法一次性讲全 - 宅安选房屋修缮
  • 如何用NVIDIA Profile Inspector实现终极显卡性能优化
  • 怀化本地防水补漏哪家专业?屋顶、卫生间、外墙、地下室、阳台漏水师傅测评(2026年8月新) - 北京金修达天津维修部
  • 基于LangChain为DeepSeek构建三层记忆系统:从对话连贯到知识增强
  • 从Prompt到系统:AI Agent管理范式的演进与工程实践
  • 吃了40年的兰州拉面,居然是青海人开的?如今集体改名,背后的大战比电视剧还精彩
  • 检修明纬S-500-24V开关电源实例
  • 代谢激素多因子同步定量破局——GCG/ GHRL/GLP1/IAPP/INS/LEP/NPY/OX/PYY九联Panel开辟能量调控研究新方法
  • 2026深圳家庭企业搬家口碑公司怎么选?合规实力amp;多场景适配盘点+避坑FAQ全指南 - 深圳家顺兴搬家
  • AI 观测站|AI 开始让传统运维解释不了问题
  • 银川下水道堵塞、反水反臭不用慌!各类管道故障成因,解决办法一次性讲全 - 宅安选房屋修缮
  • Spring Boot高并发下集合操作引发的NullPointerException排查与修复
  • 深度解锁NVIDIA显卡隐藏设置:NVIDIA Profile Inspector完全配置指南
  • 项目里程碑如何设置才合理?从关键节点、成果标准到验收确认,一文讲透
  • Godot富文本增强:打字机效果与自定义BBCode实现详解
  • 2026年找糊箱机供应商哪家靠谱?看这里了解元鼎包装机械 - 热点品牌推荐
  • MySQL单表数据量管理与性能优化实战
  • 2026年植酸供货商优选指南:从资质到性价比的3个对比维度 - geo交流
  • 分清人事运营与人才组织管理,避开数字化建设无效投入误区
  • UC3842和431可控精密稳压源
  • 【Matlab】SVM文本情感分类与分析程序
  • C语言指针与数组:本质区别与高级应用
  • Kimi LeetCode 3836. 恰好 K 个下标对的最大得分 TypeScript实现
  • 200基于SpringBoot4+Vue3的化妆品交易微信小程序、化妆品电商平台、化妆品微信小程序商城、在线化妆品销售系统、化妆品电商系统、化妆品商城小程序、美妆商城系统;毕业设计、课程设计
  • 2026年不锈钢型钢厂家**:C型钢/U型钢/Z型钢冷弯型钢,热镀锌C型导轨与屋面檩条优质厂商深度解析 - 优企名品
  • PostgreSQL多进程架构解析与性能优化实践
  • 2026年达州艺术培训行业观察:从资质选择到权益保障,家长关心的五大核心问题解析! - 优质品牌商家
  • NVIDIA GPU实战指南:从驱动安装到性能压榨与疑难排查
  • 施密特触发器反相器SN74LVC14AQ:信号调理与波形整形的工程实践
  • GitHub中文插件:3分钟让你的GitHub界面告别英文困扰