news 2026/4/19 7:29:38

辅助压缩调用返回空响应导致 Hermes 网关崩溃 / Auxiliary compression empty response crashes Hermes gateway

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
辅助压缩调用返回空响应导致 Hermes 网关崩溃 / Auxiliary compression empty response crashes Hermes gateway

辅助压缩调用返回空响应导致 Hermes 网关崩溃 / Auxiliary compression empty response crashes Hermes gateway

作者: cosmoslife
日期: 2026/04/18 14:30:00
博文链接: https://blog.csdn.net/cosmoslife

仓库: https://github.com/NousResearch/hermes-agent
创建时间: 2026-04-18 |关闭时间: 未关闭
修复 PR: 无(尚未修复)
关联 Issue: #11914(同类根因:压缩失败后静态文本注入)、#11906(空文本内容块致 HTTP 400)
关联 PR: #11929(_build_api_kwargs空文本消毒防御)


问题概述

用户使用glm-5.1通过自定义 provider(cmkey.cn/v1)运行 Hermes Agent v0.10.0,当对话触发上下文压缩时,辅助压缩模型返回空响应。Hermes 的 fallback 模型(glm-5)同样返回空。两次调用均未产生有效摘要,导致网关进入异常状态并最终崩溃。

这是一个辅助客户端 provider 兼容性 + 压缩 fallback 链脆弱性的复合问题:自定义 OpenAI 兼容端点在特定 prompt 模式下返回空 content,而压缩流程对空响应的容错不足。

复现路径

  1. 配置config.yaml:model provider=custom,base_url=https://cmkey.cn/v1,default=glm-5.1
  2. 配置 auxiliary.compression:provider=custom,model=glm-5.1,base_url=https://cmkey.cn/v1
  3. 正常对话直到上下文超过阈值(默认 85%)
  4. 压缩触发 →call_llm(task="compression")→ cmkey.cn 返回空 content
  5. fallback 到 glm-5 → 同样返回空
  6. _generate_summary返回 None → 插入静态 fallback 文本
  7. 但后续操作中空 content 累积,最终网关崩溃

根因分析

置信度: 🟡中(cmkey.cn 为第三方代理,无法直接检查其端行为;Hermes 侧的代码路径已完整追踪)

触发条件

  1. 用户配置自定义 OpenAI 兼容端点作为辅助压缩 provider
  2. 对话上下文超过压缩阈值(默认 85% context length)
  3. 自定义端点对压缩 prompt 返回content: ""content: null

执行路径追踪

对话超过阈值 ↓ context_compressor.py:compress() [L999] ↓ 检查 should_compress() ↓ 分离 head/middle/tail 消息 ↓ context_compressor.py:_generate_summary() [L551] ↓ 构建 summary prompt(~670行结构化 prompt) ↓ 调用 call_llm(task="compression", ...) ↓ auxiliary_client.py:call_llm() [L2410] ↓ _resolve_task_provider_model() 解析 provider/model ↓ _get_cached_client() 获取 OpenAI client ↓ client.chat.completions.create(**kwargs) ↓ *** cmkey.cn 返回 response,但 choices[0].message.content = "" 或 null *** ↓ context_compressor.py:_generate_summary() [L700-704] ↓ content = response.choices[0].message.content ← 空字符串或 None ↓ summary = content.strip() ← 空字符串 ↓ return self._with_summary_prefix(summary) ← 只返回 SUMMARY_PREFIX ↓ context_compressor.py:compress() [L1088-1096] ↓ if not summary: ← 空字符串被视为 falsy ↓ 插入静态 fallback 文本 ↓ 后续轮次:网关累积异常状态 → 崩溃

代码位置

角色文件函数/模块关键行
压缩入口agent/context_compressor.pycompress()L999
摘要生成agent/context_compressor.py_generate_summary()L551
LLM 调用agent/auxiliary_client.pycall_llm()L2410
响应验证agent/auxiliary_client.py_validate_llm_response()L2379
静态 fallbackagent/context_compressor.pycompress()L1088
空文本消毒run_agent.py_build_api_kwargs()(PR #11929)

缺陷本质

问题出在三层防御的缺口

缺口 1:_generate_summary不区分"空摘要"和"调用失败"

# agent/context_compressor.py:L700-704content=response.choices[0].message.contentifnotisinstance(content,str):content=str(content)ifcontentelse""summary=content.strip()

content为空字符串时,summary = "",函数返回_with_summary_prefix(""),结果为只有前缀的空摘要。但调用者compress()中:

# agent/context_compressor.py:L1088ifnotsummary:# 插入静态 fallback

空摘要被正确识别为 falsy 并触发 fallback。但问题在于:如果自定义端点返回的不是空字符串,而是" "(空白)或某个无意义的短字符串(如"ok"),summary会被视为 truthy,一个无用的"摘要"会被注入到上下文中,后续对话质量严重下降。

缺口 2:fallback 模型使用同一 provider

# agent/context_compressor.py:L736-742if_is_model_not_foundandself.summary_modelandself.summary_model!=self.model:self._summary_model_fallen_back=True
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 7:25:58

LVGL蒙板遮罩避坑指南:为什么你的ObjectMask总是不显示文字?

LVGL蒙板遮罩避坑指南:为什么你的ObjectMask总是不显示文字? 第一次在LVGL里尝试ObjectMask功能时,我盯着空白的屏幕发呆了半小时——明明按照文档写了代码,为什么文字就是显示不出来?如果你也遇到过类似问题&#xff…

作者头像 李华
网站建设 2026/4/19 7:23:48

绿色低碳区块链平台的应用场景方案

目录 一、平台定位与核心目标 二、平台核心架构与账户体系 三、关键应用场景方案 场景1:结构化碳数据采集与上链存证 场景2:试点企业碳排放数据填报与核验 场景3:在线碳核查认证(第三方核查机构) 场景4&#xff…

作者头像 李华
网站建设 2026/4/19 7:22:44

文脉定序系统效果深度评测:在不同操作系统下的性能对比

文脉定序系统效果深度评测:在不同操作系统下的性能对比 最近在折腾一个挺有意思的AI项目,叫文脉定序系统。简单说,它是个能帮你理解和组织长文本、生成连贯内容的好帮手。但项目到手,第一个现实问题就来了:该在哪个系…

作者头像 李华
网站建设 2026/4/19 7:18:38

文件版本管理:企业云盘如何做到每一次修改都有迹可循

凌晨3点的崩溃:一次版本事故的代价 2019年双十一前夜,某电商公司技术团队连续奋战72小时,准备上线核心促销系统。凌晨2点47分,后端工程师王磊发现最新版API文档里有一处关键参数写错了。他想回退到上一个版本,却发现—…

作者头像 李华
网站建设 2026/4/19 7:13:40

CSS如何解决Bootstrap表格溢出问题_利用table-responsive容器

table-responsive 失效主因是父级元素设置 overflow: hidden 或 display: flex 等限制样式,截断其 overflow-x: auto;需检查并修正父级样式,确保流式布局链路完整。Bootstrap表格内容横向溢出时,table-responsive 容器为什么没生效…

作者头像 李华