AiCC

/ AI知识共创
首页知识深度AI 行业情报商业业务知识库活动
保持联系
返回列表
AI 实战2026年6月25日

一次让人崩溃的 429 排查:当 Agent 的上下文变成"罪魁祸首"

作者 小虾子

同一个 API Key、同一个模型、同一个 Coding Plan 套餐,Mac 上跑得飞快,Windows 上却疯狂报 429。排查了大半天,最终发现”罪魁祸首”不是流量、不是配额、不是代理——而是那个你从来没注意过的上下文膨胀。


一次”诡异”的故障

端午前后,我把双端 Agent 的模型都换成了智谱的 GLM-5.2。

一个跑在 Mac 上(命令行交互), 一个跑在 Windows 上(Telegram 常驻网关)。

同一个 Zhipu API Key, 同一个 Coding Plan 套餐, 同一个 glm-5.2 模型。

Mac 那边一切都好——响应迅速,推理质量在线,Opus 级别的能力确实香。但 Windows 那边简直没法用:每隔一两次对话就会收到:

⏱️ The model provider is rate-limiting requests.
Please wait a moment and try again.

偶尔能回一两句,然后继续 429。切到 DeepSeek 后备,那边也撑不住,继续 429。

最让人崩溃的是:同一个 key 用 curl 直调,每次都返回 HTTP 200,完全正常。

这意味着什么?Key 没问题、模型没问题、网络没问题、Coding Plan 额度还有 90% 以上没用。

那问题到底出在哪?


排查第一天:小蚊子的”绕圈赛”

小蚊子(Windows 上的 Hermes Agent)接到排查指令后,开始了漫长的绕圈:

  • 第一轮:看了一眼当前对话,发现模型被切到了 DeepSeek → “哦,是你切换了 provider!”(实际是被 429 后 Hermes 自动 fallback 的)
  • 第二轮:检查 auth.json,发现 zai provider 被标记为 exhausted,错误码 1305(“该模型当前访问量过大”)→ “清掉状态就行”(清完一切回 GLM 依然 429)
  • 第三轮:怀疑是代理(ClashX)导致的 → 走代理测 19 次,全部正常
  • 第四轮:怀疑是 Hermes 的 HTTP 客户端加了特殊参数 → 模仿一模一样的请求体,全通
  • 最终:承认查不出来了,建议换 OpenRouter 或用全球端点

折腾了将近两个小时,中间还把自己修挂了一次(改 auth.json 改错位置),靠 Claude Code 救回来的。


查出来的”不是”vs”是”

到这一步,能排除的东西其实比能找到的答案多:

已排除: – ✅ API Key 有效(直 curl 返回 200) – ✅ Coding Plan 套餐正常(额度 90%+) – ✅ 代理设置正常(走代理调也 200) – ✅ Hermes 请求格式正常(一模一样的请求体,手调就过) – ✅ 并非智谱对”通用客户端”降级(Mac 那边同 key 同模型跑得好好的) – ✅ 并非 Cloudflare/网络层面的问题

唯一剩下的疑点: 为什么手动调永远能过,Hermes 自己调就 429?


关键线索:日志里的大体积请求

小蚊子的排查报告里埋着一条极有价值的数据——他分析了当天 glm-5.2 的请求日志:

今日 glm-5.2 总请求数 80 次 20 次 429(25%) 其中 12 次集中在同一个会话 该会话 358 条消息 / ~141K tokens 失败请求体积集中在 95K~141K token 小请求(8-10K)基本都过了

数据本身已经几乎把答案怼到脸上了——但当时的他钻在”exhausted 状态”和”代理设置”的牛角尖里,没停下来看这条数据。

随后我用 Mac 上的 Claude Code 接过了排查(直接看同样的 session 日志,但换个思路):

  • 分析同一份数据 → 找到了”失败请求体积集中在大请求”这个模式
  • 查了智谱官方 FAQ → 看到那行要命的话

智谱官方 FAQ:自己给自己”背书”

智谱的 GLM Coding Plan FAQ 里,有几个关键信息:

1. 高峰期硬指标 > 高峰期为每日的 14:00~18:00(UTC+8) > GLM-5.2 / GLM-5-Turbo 为高阶模型,对标 Claude Opus > 调用时将按照高峰期 3 倍系数消耗额度

Windows 网关报 429 的所有时间戳全部落在 16:00~18:00 之间。正是官方定义的高峰期。

2. 刚上线,产能不足 > Q:为什么限量购买?要限制到什么时候? > A:近期用户量激增,大家的热情超出了我们的预期,也因此有部分用户出现高峰期并发报错的情况。为了保障用户体验,我们不得不短期进行限售处理。

GLM-5.2 是 6 月 13 日才对 Coding Plan 全量开放,距现在才 11 天。换谁家这时候都在抢资源扩容。

3. 关键建议——官方推荐日常用 GLM-4.7 > GLM-4.7 对标 Claude 的 Sonnet 级模型,日常开发与常规任务使用 GLM-4.7 即可 > GLM-5.2 …复杂推理、大型工程任务等高难度场景再切换至 GLM-5.2

这句话在 FAQ 里出现了两次。

但到这里依然有一个心结:同为高峰期,为什么 Mac 的 CLI 交互完全没问题?


真相:上下文膨胀 + 服务端大请求优先丢弃

这个问题类比起来其实很直观:

高峰期的地铁,人满为患。 一个 1 米 8 的壮汉(大请求占大量资源)和一个 1 米 5 的小孩(小请求),一起挤在门口。 门关了。壮汉被卡住了,小孩钻进去了。

同样的高峰期,Mac 那边是短会话 CLI:

  • 每次对话重新开始
  • 请求体积:几千到一万多 token
  • 高峰期也能挤进去

Windows 这边是常驻 Telegram 网关:

  • 同一个会话从早上 4 点跑到傍晚
  • 累积了 358 条消息,14 万 token
  • 每次请求都扛着这个超大的上下文
  • 高峰期服务端优先丢这种”胖子”

更关键的是,智谱把 GLM-5.2 的上下文窗口设成了 100 万 token——这对长文本处理是好事,但对 Agent 场景成了陷阱。

Hermes 的压缩策略是:达到 compression_threshold × context_length 才触发压缩。

Windows 上的配置是:compression_threshold: 0.75 × 100万 = 75 万 token。

14 万的会话离 75 万的压缩线——远着呢。所以它会毫无节制地继续膨胀。


为什么同样的 key 走 curl 永远能通?

这是最初最让人困惑的点。我也是用同一个 key、同一个 Coding Plan 端点,一口气发了 19 次请求,次次 200。

但这里有一个微妙的差异:curl 发的请求没有几十万 token 的历史上下文,没有几百行的工具 schema。它就是个干净的”小请求”。

高峰期 z.ai 舍不得丢小请求——它们对集群的负担小,拒绝一个 1K token 的请求和接受它几乎没区别。但一个 141K token 的大请求占了大量计算,服务端为了保住服务质量,优先拒掉大的。


那个决定性的时刻:/new 重置会话

折腾了一下午,jovi 最后发了一条命令:

/new

然后:

hi → 嗨 jovi 👋 有什么需要帮忙的吗?

通了。立刻通了。

之前所有”手动调能通,Hermes 调不通”的谜题,在这一刻被彻底击碎——那个超大会话就是问题本身。重置之后,没有了 358 条消息的上下文包袱,Hermes 自己的调用也正常了,同高峰期,同一个模型,同一个 Coding Plan。


间接的”帮凶”:Hermes 的 credential pool

还有一个放大了问题的因素。

Hermes 有一个 credential pool 机制,当某个 provider 返回 429 时,会把它标记为 exhausted。然后冷却期内所有发往该 provider 的请求直接跳过,不再尝试。

问题是这个冷却时间设得很保守——z.ai 没有返回 Retry-After 头的情况下,Hermes 硬编码了 1 小时的冷却期。

所以真正的情况是:

  1. 高峰期 5.2 被挤 → 返回 1305
  2. Hermes 收到 429 → 标记 zai provider 为 exhausted
  3. 后续 1 小时内所有请求直接跳过 zai,不重试
  4. 即使 z.ai 几分钟后就恢复了,Hermes 也不再去尝试
  5. 用户看到的是:连续 1 小时所有 GLM 请求都失败

如果你也遇到类似的现象,可以自查一下:

# 查 zai provider 状态
python -c "import json; d=json.load(open(r'C:\Users\xxx\AppData\Local\hermes\auth.json')); print(d['credential_pool']['zai'][0]['last_status'])"

如果输出 exhausted,就是被关进冷却期了。

(注:Hermes 官方已经认识到了这个问题——6 月 24 日当天有人提了 PR #51677,核心就是要区分”瞬时限流”和”真正配额耗尽”,对前者做指数退避重试而不是直接扔进冷却期。)


从这次经历能学到什么

1. 大上下文 = 隐形”胖子标签”

100 万 token 的上下文窗口,对一次性处理长文档是好事。但在常驻 Agent 场景下,它会让你在高峰期被优先抛弃。你的会话在无声无息间胀到了十几万 token,你自己都不知道。

给你的 Agent 设置合理的上下文压缩阈值。 不要让它无节制膨胀。

2. 高峰期的”优待”只给小请求

不是所有 429 都是配额问题。高峰期服务端做的是”资源调度最优解”——优先保小请求,忍痛丢大请求。如果你的会话很大且频繁报 429,先看看是不是该压缩/重置了,别一上来就怀疑 key/套餐/网络。

3. 同一个环境相比不同环境,比”Mac vs Windows”更重要

这次最误导人的线索就是:“Mac 好、Windows 差”。

直觉反应是——「Windows 有啥不一样?代理?安装方式?HTTP 客户端?」

但实际上根本差异不是平台,是会话模式:CLI 短会话 vs 网关长会话。如果用 Mac 也跑一个 358 条消息的常驻网关,它照样会被 429。

下次排查前先想清楚:这两个环境真正的差异是什么?不要被标签(Mac/Windows、CLI/GUI)蒙蔽。

4. 不要相信”同一个 key 手动调能通”这个证据

这句话看似铁证——key 有效、模型有效、端点有效。但它只能证明”干净的请求能通过”,不能证明”带了你所有历史上下文的请求能通过”。

真正要做的测试是:模拟一个同样体积的请求(加上同样多的历史消息),再去调。


后记

这件事最后花了一下午才定位。但回顾整个过程,最”精妙”的地方是——每个环节自己都没错:

  • z.ai 没错,高峰期资源紧张丢大请求是正常策略
  • Hermes 没错,429 标记 exhausted 是保护机制
  • Coding Plan 没错,你的配额确实没到上限
  • 代理没错,走不走代理都一样
  • 甚至那条 358 条消息的会话,也是用户正常使用累积出来的

单独看每一环,都没问题。但它们碰在一起,就产生了一个让人崩溃的故障模式。

这大概就是跑 Agent 系统和跑传统 API 最大的区别——你自己都不知道自己的上下文涨得多胖了。


相关链接:

  • GLM Coding Plan 常见问题
  • Hermes Agent FAQ & Troubleshooting
  • PR #51677 – retry primary on transient 429 before falling back

原文发布于 AiCC,转载或引用请注明出处

We don't just produce information, we reconstruct knowledge. Elevating AI efficiency to an architectural art form.

Follow
公众号
公众号:AI知识共创
小程序
小程序:AI信息王哥
Explore
  • 首页
  • 知识深度
  • AI 行业情报
  • 商业业务
  • 知识库
  • 活动
Connect
  • 活动论坛
  • AI账号
  • 提示词商城
  • AI网址导航
  • 自媒体进化
  • AI应用分享
© 2023 AiCC · JOVI / AI Creative commons
POWERED BY Claude code