<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>故障修复 on Zampo Blog</title><link>https://blog.cpdd.fyi/tags/%E6%95%85%E9%9A%9C%E4%BF%AE%E5%A4%8D/</link><description>Recent content in 故障修复 on Zampo Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 27 May 2026 11:10:00 +0800</lastBuildDate><atom:link href="https://blog.cpdd.fyi/tags/%E6%95%85%E9%9A%9C%E4%BF%AE%E5%A4%8D/index.xml" rel="self" type="application/rss+xml"/><item><title>Hermes 今天挂了？别重装，一行补丁先救 Codex</title><link>https://blog.cpdd.fyi/posts/hermes-codex-fix-tutorial/</link><pubDate>Wed, 27 May 2026 11:10:00 +0800</pubDate><guid>https://blog.cpdd.fyi/posts/hermes-codex-fix-tutorial/</guid><description>&lt;p&gt;你只是让 Hermes 回一句 &lt;code&gt;ping&lt;/code&gt;，它却开始连续 fallback。&lt;/p&gt;
&lt;p&gt;日志里反复出现这几行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Provider: openai-codex Model: gpt-5.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TypeError: &amp;#39;NoneType&amp;#39; object is not iterable
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;trying fallback...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这时候最容易做错一件事：开始重装 Hermes、重配 token、怀疑自己的 profile 坏了。&lt;/p&gt;
&lt;p&gt;先别急。&lt;/p&gt;
&lt;p&gt;今天这类报错，大概率不是你本地配置突然失忆，而是 Codex 后端返回流和 &lt;code&gt;openai-python&lt;/code&gt; 解析逻辑撞上了一个兼容坑。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.cpdd.fyi/images/hermes-codex-fix-tutorial/cover.png" alt="Hermes Codex/OpenAI 快速止血教程"&gt;&lt;/p&gt;
&lt;p&gt;今天先别重装 Hermes，先绕开 Codex 这颗雷。&lt;/p&gt;
&lt;h2 id="这次到底坏在哪"&gt;这次到底坏在哪&lt;/h2&gt;
&lt;p&gt;把故障链路压短一点说：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;openai-codex&lt;/code&gt; 通过 Codex Responses API 流式返回结果时，前面的 &lt;code&gt;response.output_item.done&lt;/code&gt; 事件里已经带了输出内容，但最后的 &lt;code&gt;response.completed&lt;/code&gt; 事件里，&lt;code&gt;response.output&lt;/code&gt; 可能是 &lt;code&gt;null&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;问题来了。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;openai-python&lt;/code&gt; 的 Responses stream accumulator 在处理 completed 事件时，会把最终 response 交给 &lt;code&gt;parse_response()&lt;/code&gt;。而解析函数里有一段逻辑等价于：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果 &lt;code&gt;response.output&lt;/code&gt; 是 &lt;code&gt;None&lt;/code&gt;，Python 就会直接炸：&lt;/p&gt;</description></item></channel></rss>