<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>zg</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://zeng-gui.github.io/</id>
  <link href="https://zeng-gui.github.io/" rel="alternate"/>
  <link href="https://zeng-gui.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, zg</rights>
  <subtitle>技术记录与学习笔记</subtitle>
  <title>zg's Blog</title>
  <updated>2026-05-10T02:57:10.002Z</updated>
  <entry>
    <author>
      <name>zg</name>
    </author>
    <category term="实战项目" scheme="https://zeng-gui.github.io/categories/%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/"/>
    <category term="python" scheme="https://zeng-gui.github.io/tags/python/"/>
    <category term="FOC" scheme="https://zeng-gui.github.io/tags/FOC/"/>
    <category term="电机控制" scheme="https://zeng-gui.github.io/tags/%E7%94%B5%E6%9C%BA%E6%8E%A7%E5%88%B6/"/>
    <category term="PI调参" scheme="https://zeng-gui.github.io/tags/PI%E8%B0%83%E5%8F%82/"/>
    <category term="嵌入式" scheme="https://zeng-gui.github.io/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/"/>
    <content>
      <![CDATA[<h2 id="背景：调参的痛点"><a href="#背景：调参的痛点" class="headerlink" title="背景：调参的痛点"></a>背景：调参的痛点</h2><p>做 FOC（Field-Oriented Control）电机控制的工程师，一定对 PI 参数整定不陌生。电流环的 Kp、Ki 怎么算？速度环的带宽取多少合适？拿到一台新电机，光是把电流环调到能用，往往就要花半天时间。</p><p>更麻烦的是，不同电机参数差异巨大——小功率伺服电机的电阻可能只有几十毫欧，而大功率电机的电阻可能有好几欧姆。用同一套经验值去套，效果天差地别。</p><p>motor_para 就是为了解决这个问题：输入电机参数，自动计算出一组可用的 PI 增益，还能直接生成 STM32、GD32、TI C2000 平台的 C 代码。</p><span id="more"></span><h2 id="项目简介"><a href="#项目简介" class="headerlink" title="项目简介"></a>项目简介</h2><p>motor_para 是一个 FOC PI 参数整定辅助工具，支持三种调参算法、AI 辅助分析、多平台代码生成。技术栈是 Python + FastAPI，提供 Web UI 和 CLI 两种使用方式。</p><p>核心能力：</p><ul><li><strong>离线调参</strong>：输入电机参数（电阻、电感、磁链、转动惯量、极对数），自动计算 d 轴&#x2F;q 轴电流环和速度环的 Kp&#x2F;Ki</li><li><strong>AI 辅助</strong>：接入 DeepSeek 等大模型，提供参数估算、波形分析、故障诊断</li><li><strong>代码生成</strong>：一键生成 STM32&#x2F;GD32&#x2F;TI C2000 平台的 PI 控制器 C 代码，支持浮点和定点（Q15&#x2F;Q24&#x2F;IQ）</li></ul><h2 id="三种调参算法"><a href="#三种调参算法" class="headerlink" title="三种调参算法"></a>三种调参算法</h2><h3 id="带宽法（Bandwidth-Method）"><a href="#带宽法（Bandwidth-Method）" class="headerlink" title="带宽法（Bandwidth Method）"></a>带宽法（Bandwidth Method）</h3><p>最常用的方法。核心思想是把电流环当作一阶系统，设定目标带宽 omega_c，直接算出增益：</p><figure class="highlight abnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">Kp</span> <span class="operator">=</span> omega_c * L</span><br><span class="line"><span class="attribute">Ki</span> <span class="operator">=</span> omega_c * R</span><br></pre></td></tr></table></figure><p>速度环用二阶系统模型，设定自然频率 omega_n 和阻尼比 zeta：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">Kp</span> = <span class="number">2</span> * zeta * omega_n * J / Kt</span><br><span class="line"><span class="attr">Ki</span> = omega_n^<span class="number">2</span> * J / Kt</span><br></pre></td></tr></table></figure><p>优点是直观，缺点是忽略了电阻的影响（对低阻抗电机误差小，高阻抗电机误差大）。</p><h3 id="极点配置法（Pole-Placement）"><a href="#极点配置法（Pole-Placement）" class="headerlink" title="极点配置法（Pole Placement）"></a>极点配置法（Pole Placement）</h3><p>把闭环极点放在期望位置，数学上更严谨：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">Kp</span> = <span class="number">2</span> * pole * L - R</span><br><span class="line"><span class="attr">Ki</span> = pole^<span class="number">2</span> * L</span><br></pre></td></tr></table></figure><p>相比带宽法，多了 <code>-R</code> 项来补偿电阻。当电机电阻大于 1 欧姆时，工具会自动切换到这个方法。</p><h3 id="Ziegler-Nichols-法"><a href="#Ziegler-Nichols-法" class="headerlink" title="Ziegler-Nichols 法"></a>Ziegler-Nichols 法</h3><p>基于系统时间常数的经典方法：</p><figure class="highlight abnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">tau</span> <span class="operator">=</span> L / R</span><br><span class="line"><span class="attribute">Kp</span> <span class="operator">=</span> <span class="number">0.9</span> * R</span><br><span class="line"><span class="attribute">Ki</span> <span class="operator">=</span> Kp / (<span class="number">3.33</span> * tau)</span><br></pre></td></tr></table></figure><p>适合快速估算，但精度不如前两种。</p><h2 id="自动算法选择"><a href="#自动算法选择" class="headerlink" title="自动算法选择"></a>自动算法选择</h2><p>工具支持 AUTO 模式，根据电机电阻自动选择算法：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> Rs &gt; <span class="number">1.0</span>:</span><br><span class="line">    <span class="comment"># 高阻抗电机，用极点配置法补偿电阻</span></span><br><span class="line">    algorithm = PolePlacement()</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="comment"># 低阻抗电机，带宽法足够精确</span></span><br><span class="line">    algorithm = BandwidthMethod()</span><br></pre></td></tr></table></figure><p>这个设计很实用——实际工程中，不同功率等级的电机确实需要不同的处理方式。</p><h2 id="参数校验"><a href="#参数校验" class="headerlink" title="参数校验"></a>参数校验</h2><p>不只是算数，还会帮你检查参数是否合理：</p><ul><li><strong>范围校验</strong>：每个参数都有 min&#x2F;max 边界（比如 Rs: 0.001~100 欧姆）</li><li><strong>一致性检查</strong>：IPM 电机的 Ld 应该小于 Lq，如果不满足会报警</li><li><strong>缺失参数提示</strong>：如果没填磁链 Psi_f，会告诉你”可以用反电动势常数 Ke 估算，Psi_f &#x3D; Ke &#x2F; (sqrt(3) * 2 * pi * fe)”</li></ul><h2 id="AI-辅助调参"><a href="#AI-辅助调参" class="headerlink" title="AI 辅助调参"></a>AI 辅助调参</h2><p>接入 DeepSeek 等大模型后，可以做四件事：</p><ol><li><strong>智能参数估算</strong>：给部分参数，AI 估算缺失值并给出置信度</li><li><strong>波形分析</strong>：输入响应数据（上升时间、超调、纹波），诊断控制性能</li><li><strong>故障诊断</strong>：描述故障现象（过流、振荡、堵转），给出排查步骤</li><li><strong>调参建议</strong>：分析当前 PI 增益，提出优化方向</li></ol><p>没有 API Key 也能用——内置了关键词匹配的兜底回答，覆盖振荡、超调、过流、低速抖动等常见问题。</p><h2 id="多平台代码生成"><a href="#多平台代码生成" class="headerlink" title="多平台代码生成"></a>多平台代码生成</h2><p>这是最实用的功能之一。调完参数，直接生成可用的 C 代码：</p><h3 id="STM32（浮点）"><a href="#STM32（浮点）" class="headerlink" title="STM32（浮点）"></a>STM32（浮点）</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> &#123;</span></span><br><span class="line">    <span class="type">float</span> Kp;</span><br><span class="line">    <span class="type">float</span> Ki;</span><br><span class="line">    <span class="type">float</span> integral;</span><br><span class="line">    <span class="type">float</span> output;</span><br><span class="line">    <span class="type">float</span> out_min;</span><br><span class="line">    <span class="type">float</span> out_max;</span><br><span class="line">&#125; PI_Controller;</span><br><span class="line"></span><br><span class="line"><span class="type">float</span> <span class="title function_">PI_Compute</span><span class="params">(PI_Controller *pi, <span class="type">float</span> error)</span> &#123;</span><br><span class="line">    pi-&gt;integral += pi-&gt;Ki * error;</span><br><span class="line">    <span class="comment">// 积分限幅（抗饱和）</span></span><br><span class="line">    <span class="keyword">if</span> (pi-&gt;integral &gt; pi-&gt;out_max) pi-&gt;integral = pi-&gt;out_max;</span><br><span class="line">    <span class="keyword">if</span> (pi-&gt;integral &lt; pi-&gt;out_min) pi-&gt;integral = pi-&gt;out_min;</span><br><span class="line"></span><br><span class="line">    pi-&gt;output = pi-&gt;Kp * error + pi-&gt;integral;</span><br><span class="line">    <span class="comment">// 输出限幅</span></span><br><span class="line">    <span class="keyword">if</span> (pi-&gt;output &gt; pi-&gt;out_max) pi-&gt;output = pi-&gt;out_max;</span><br><span class="line">    <span class="keyword">if</span> (pi-&gt;output &lt; pi-&gt;out_min) pi-&gt;output = pi-&gt;out_min;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> pi-&gt;output;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="STM32（Q15-定点）"><a href="#STM32（Q15-定点）" class="headerlink" title="STM32（Q15 定点）"></a>STM32（Q15 定点）</h3><p>没有 FPU 的 MCU 用定点数，乘法变成移位：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int16_t</span> <span class="title function_">PI_Compute_Q15</span><span class="params">(PI_Controller_Q15 *pi, <span class="type">int16_t</span> error)</span> &#123;</span><br><span class="line">    pi-&gt;integral += (<span class="type">int32_t</span>)pi-&gt;Ki * error &gt;&gt; <span class="number">15</span>;</span><br><span class="line">    <span class="comment">// 积分限幅</span></span><br><span class="line">    <span class="keyword">if</span> (pi-&gt;integral &gt; pi-&gt;out_max) pi-&gt;integral = pi-&gt;out_max;</span><br><span class="line">    <span class="keyword">if</span> (pi-&gt;integral &lt; pi-&gt;out_min) pi-&gt;integral = pi-&gt;out_min;</span><br><span class="line"></span><br><span class="line">    <span class="type">int32_t</span> output = ((<span class="type">int32_t</span>)pi-&gt;Kp * error &gt;&gt; <span class="number">15</span>) + pi-&gt;integral;</span><br><span class="line">    <span class="keyword">if</span> (output &gt; pi-&gt;out_max) output = pi-&gt;out_max;</span><br><span class="line">    <span class="keyword">if</span> (output &lt; pi-&gt;out_min) output = pi-&gt;out_min;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> (<span class="type">int16_t</span>)output;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="TI-C2000（IQmath）"><a href="#TI-C2000（IQmath）" class="headerlink" title="TI C2000（IQmath）"></a>TI C2000（IQmath）</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">_iq <span class="title function_">PI_Compute_IQ</span><span class="params">(PICTRL *pi, _iq error)</span> &#123;</span><br><span class="line">    pi-&gt;integral += _IQmpy(pi-&gt;Ki, error);</span><br><span class="line">    <span class="keyword">if</span> (pi-&gt;integral &gt; pi-&gt;out_max) pi-&gt;integral = pi-&gt;out_max;</span><br><span class="line">    <span class="keyword">if</span> (pi-&gt;integral &lt; pi-&gt;out_min) pi-&gt;integral = pi-&gt;out_min;</span><br><span class="line"></span><br><span class="line">    _iq output = _IQmpy(pi-&gt;Kp, error) + pi-&gt;integral;</span><br><span class="line">    <span class="keyword">if</span> (output &gt; pi-&gt;out_max) output = pi-&gt;out_max;</span><br><span class="line">    <span class="keyword">if</span> (output &lt; pi-&gt;out_min) output = pi-&gt;out_min;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> output;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>三种平台的代码都包含积分抗饱和和输出限幅，拿到就能用。</p><h2 id="Web-UI"><a href="#Web-UI" class="headerlink" title="Web UI"></a>Web UI</h2><p>基于 Tailwind CSS + Alpine.js 的单页应用，四个页面：</p><ul><li><strong>离线调参</strong>：填表单、选算法、看结果（带颜色卡片和 KaTeX 公式渲染）</li><li><strong>在线调试</strong>：串口通信，实时读写参数（开发中）</li><li><strong>AI 助手</strong>：聊天界面，支持快捷提问</li><li><strong>文档</strong>：内置 FOC 理论和公式推导</li></ul><h2 id="快速上手"><a href="#快速上手" class="headerlink" title="快速上手"></a>快速上手</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/zeng-gui/motor_para.git</span><br><span class="line"><span class="built_in">cd</span> motor_para</span><br><span class="line">pip install -r requirements.txt</span><br><span class="line">python run_web.py</span><br></pre></td></tr></table></figure><p>浏览器打开 <code>http://localhost:8000</code>，填入电机参数，点击”开始计算”即可。</p><p>CLI 模式：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python -m src.ui.cli</span><br></pre></td></tr></table></figure><h2 id="串口通信协议"><a href="#串口通信协议" class="headerlink" title="串口通信协议"></a>串口通信协议</h2><p>工具还支持通过 UART 和实际电机控制器通信，自定义二进制协议：</p><figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">HEAD</span>(<span class="number">0</span>xAA) + <span class="built_in">LEN</span>(<span class="number">2</span>B) + <span class="built_in">CMD</span>(<span class="number">1</span>B) + <span class="built_in">DATA</span>(nB) + <span class="built_in">CRC16</span>(<span class="number">2</span>B) + <span class="built_in">TAIL</span>(<span class="number">0</span>x55)</span><br></pre></td></tr></table></figure><p>支持读写参数、启停波形监控、心跳检测。后台 RX 线程负责帧重组和回调分发。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>motor_para 解决的是一个很具体的问题：FOC 调参太依赖经验，新手上手慢，老手效率低。它的价值在于：</p><ul><li><strong>算法可选</strong>：三种方法覆盖不同场景，AUTO 模式自动选择</li><li><strong>参数校验</strong>：不只是算数，还会帮你检查参数是否合理</li><li><strong>代码即用</strong>：生成的 C 代码包含抗饱和和限幅，拿到 MCU 上就能跑</li><li><strong>AI 加持</strong>：没有示波器也能靠 AI 分析波形和诊断故障</li></ul><p>项目地址：<a href="https://github.com/zeng-gui/motor_para">https://github.com/zeng-gui/motor_para</a></p><p>如果你也在做电机控制，不妨试试。</p>]]>
    </content>
    <id>https://zeng-gui.github.io/2026/05/10/foc-pi-tuning-tool/</id>
    <link href="https://zeng-gui.github.io/2026/05/10/foc-pi-tuning-tool/"/>
    <published>2026-05-10T02:00:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="背景：调参的痛点"><a href="#背景：调参的痛点" class="headerlink" title="背景：调参的痛点"></a>背景：调参的痛点</h2><p>做 FOC（Field-Oriented Control）电机控制的工程师，一定对 PI 参数整定不陌生。电流环的 Kp、Ki 怎么算？速度环的带宽取多少合适？拿到一台新电机，光是把电流环调到能用，往往就要花半天时间。</p>
<p>更麻烦的是，不同电机参数差异巨大——小功率伺服电机的电阻可能只有几十毫欧，而大功率电机的电阻可能有好几欧姆。用同一套经验值去套，效果天差地别。</p>
<p>motor_para 就是为了解决这个问题：输入电机参数，自动计算出一组可用的 PI 增益，还能直接生成 STM32、GD32、TI C2000 平台的 C 代码。</p>]]>
    </summary>
    <title>FOC PI 参数整定工具：从理论到代码的一站式调参助手</title>
    <updated>2026-05-10T02:57:10.002Z</updated>
  </entry>
  <entry>
    <author>
      <name>zg</name>
    </author>
    <category term="技术笔记" scheme="https://zeng-gui.github.io/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    <category term="python" scheme="https://zeng-gui.github.io/tags/python/"/>
    <category term="openai" scheme="https://zeng-gui.github.io/tags/openai/"/>
    <category term="api" scheme="https://zeng-gui.github.io/tags/api/"/>
    <category term="proxy" scheme="https://zeng-gui.github.io/tags/proxy/"/>
    <content>
      <![CDATA[<h2 id="背景：为什么需要代理"><a href="#背景：为什么需要代理" class="headerlink" title="背景：为什么需要代理"></a>背景：为什么需要代理</h2><p>OpenAI 推出了 Responses API，它是 Chat Completions API 的下一代接口，支持更复杂的交互模式——多轮 tool call、reasoning 内容输出、多模态输入等。但问题来了：</p><ol><li><strong>工具链滞后</strong>：Codex CLI、Cursor 等工具已经对接了 Responses API，但很多国产模型（MiMo、DeepSeek、Qwen）只提供 Chat Completions 接口。</li><li><strong>接口不兼容</strong>：Responses API 和 Chat Completions API 的请求&#x2F;响应格式完全不同，直接替换行不通。</li><li><strong>多 provider 管理混乱</strong>：不同模型散落在不同平台，每个平台一套 API key、一个 endpoint，切换成本高。</li></ol><p>responses-proxy 就是为了解决这三个问题：它是一个 FastAPI 代理服务，接收 Responses API 请求，自动转换为 Chat Completions API 转发给后端 provider，再把响应转换回来。对上游工具来说，它就是一个标准的 Responses API 端点。</p><span id="more"></span><h2 id="项目简介"><a href="#项目简介" class="headerlink" title="项目简介"></a>项目简介</h2><h3 id="架构总览"><a href="#架构总览" class="headerlink" title="架构总览"></a>架构总览</h3><figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">┌─────────────────┐         ┌──────────────────────┐         ┌─────────────────┐</span><br><span class="line">│                 │  HTTP   │                      │  HTTP   │                 │</span><br><span class="line">│   Codex <span class="keyword">CLI</span> /   │────────▶│   responses-proxy    │────────▶│  LLM Providers  │</span><br><span class="line">│   任意客户端     │◀────────│   (FastAPI)          │◀────────│                 │</span><br><span class="line">│                 │         │                      │         │  - MiMo         │</span><br><span class="line">└─────────────────┘         │  Responses API       │         │  - DeepSeek     │</span><br><span class="line">                            │  ⇄ Chat Completions  │         │  - Qwen         │</span><br><span class="line">                            │                      │         │  - OpenAI       │</span><br><span class="line">                            │  ┌──────────────┐    │         │  - ...          │</span><br><span class="line">                            │  │ Web 管理界面  │    │         │                 │</span><br><span class="line">                            │  └──────────────┘    │         └─────────────────┘</span><br><span class="line">                            └──────────────────────┘</span><br></pre></td></tr></table></figure><h3 id="工作流程"><a href="#工作流程" class="headerlink" title="工作流程"></a>工作流程</h3><ol><li>客户端发送 Responses API 格式的请求到 proxy</li><li>proxy 根据路由规则选择目标 provider</li><li>将请求从 Responses API 格式转换为 Chat Completions API 格式</li><li>转发到对应的 provider endpoint</li><li>接收 Chat Completions 响应，转换回 Responses API 格式</li><li>返回给客户端</li></ol><p>整个过程对客户端透明——它只看到一个标准的 Responses API 服务。</p><h2 id="快速上手"><a href="#快速上手" class="headerlink" title="快速上手"></a>快速上手</h2><h3 id="环境要求"><a href="#环境要求" class="headerlink" title="环境要求"></a>环境要求</h3><ul><li>Python 3.10+</li><li>pip 或 uv</li></ul><h3 id="安装依赖"><a href="#安装依赖" class="headerlink" title="安装依赖"></a>安装依赖</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/zeng-gui/responses-proxy.git</span><br><span class="line"><span class="built_in">cd</span> responses-proxy</span><br><span class="line">pip install -r requirements.txt</span><br></pre></td></tr></table></figure><h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><p>复制示例配置并填入你的 API Key：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cp</span> providers.json.example providers.json</span><br></pre></td></tr></table></figure><p>编辑 <code>providers.json</code>：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;providers&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;base_url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://api.deepseek.com/v1&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;api_key&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sk-your-deepseek-key&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;models&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;deepseek-chat&quot;</span><span class="punctuation">,</span> <span class="string">&quot;deepseek-reasoner&quot;</span><span class="punctuation">]</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;base_url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://coding.dashscope.aliyuncs.com/v1&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;api_key&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sk-your-qwen-key&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;models&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;qwen3.6-plus&quot;</span><span class="punctuation">]</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;base_url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://token-plan-cn.xiaomimimo.com/v1&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;api_key&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sk-your-mimo-key&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;models&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;mimo-v2.5-pro&quot;</span><span class="punctuation">,</span> <span class="string">&quot;mimo-v2.5&quot;</span><span class="punctuation">]</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="启动服务"><a href="#启动服务" class="headerlink" title="启动服务"></a>启动服务</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python proxy.py</span><br></pre></td></tr></table></figure><p>启动后终端会显示：</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">INFO</span>:     Uvicorn running <span class="literal">on</span> http://<span class="number">127.0.0.1:8000</span></span><br></pre></td></tr></table></figure><p>然后浏览器访问 <code>http://127.0.0.1:8000</code> 即可打开 Web 配置管理界面，无需手动编辑 JSON。</p><p>服务默认监听 <code>http://localhost:8000</code>，你可以用 curl 快速验证：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">curl http://localhost:8000/v1/responses \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">    &quot;model&quot;: &quot;deepseek-chat&quot;,</span></span><br><span class="line"><span class="string">    &quot;input&quot;: &quot;你好，请用一句话介绍自己&quot;</span></span><br><span class="line"><span class="string">  &#125;&#x27;</span></span><br></pre></td></tr></table></figure><h3 id="对接-Codex-CLI"><a href="#对接-Codex-CLI" class="headerlink" title="对接 Codex CLI"></a>对接 Codex CLI</h3><p>编辑 Codex 配置文件（Linux&#x2F;Mac: <code>~/.codex/config.toml</code>，Windows: <code>%USERPROFILE%\.codex\config.toml</code>）：</p><figure class="highlight toml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">model</span> = <span class="string">&quot;mimo-v2.5-pro&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="section">[model_providers.proxy]</span></span><br><span class="line"><span class="attr">name</span> = <span class="string">&quot;proxy&quot;</span></span><br><span class="line"><span class="attr">base_url</span> = <span class="string">&quot;http://127.0.0.1:8000/v1&quot;</span></span><br><span class="line"><span class="attr">wire_api</span> = <span class="string">&quot;responses&quot;</span></span><br><span class="line"><span class="attr">requires_openai_auth</span> = <span class="literal">false</span></span><br></pre></td></tr></table></figure><p>编辑 <code>~/.codex/auth.json</code>（代理侧管理真实密钥，这里可留空）：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;OPENAI_API_KEY&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>然后正常使用 codex，所有请求会自动通过 proxy 路由到对应的 provider。</p><h2 id="核心特性"><a href="#核心特性" class="headerlink" title="核心特性"></a>核心特性</h2><h3 id="多-Provider-路由"><a href="#多-Provider-路由" class="headerlink" title="多 Provider 路由"></a>多 Provider 路由</h3><p>proxy 根据请求中的 <code>model</code> 字段自动路由到对应的上游 provider：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 路由到 MiMo</span></span><br><span class="line">curl -X POST http://localhost:8000/v1/responses \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;&quot;model&quot;: &quot;mimo-v2.5-pro&quot;, &quot;input&quot;: &quot;你好&quot;&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 路由到 DeepSeek</span></span><br><span class="line">curl -X POST http://localhost:8000/v1/responses \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;&quot;model&quot;: &quot;deepseek-chat&quot;, &quot;input&quot;: &quot;用 Python 实现二分查找&quot;&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 路由到 Qwen</span></span><br><span class="line">curl -X POST http://localhost:8000/v1/responses \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;&quot;model&quot;: &quot;qwen3.6-plus&quot;, &quot;input&quot;: &quot;解释量子计算&quot;&#125;&#x27;</span></span><br></pre></td></tr></table></figure><p>每个 provider 独立配置 <code>base_url</code> 和 <code>api_key</code>，互不干扰。</p><h3 id="流式与非流式响应"><a href="#流式与非流式响应" class="headerlink" title="流式与非流式响应"></a>流式与非流式响应</h3><p>两种模式都完整支持。流式模式下，proxy 会实时将后端的 SSE 事件转换为 Responses API 的流式格式：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 非流式（默认）</span></span><br><span class="line">curl -X POST http://localhost:8000/v1/responses \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">    &quot;model&quot;: &quot;deepseek-chat&quot;,</span></span><br><span class="line"><span class="string">    &quot;input&quot;: &quot;用 Python 实现二分查找&quot;,</span></span><br><span class="line"><span class="string">    &quot;stream&quot;: false</span></span><br><span class="line"><span class="string">  &#125;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 流式</span></span><br><span class="line">curl -X POST http://localhost:8000/v1/responses \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">    &quot;model&quot;: &quot;deepseek-chat&quot;,</span></span><br><span class="line"><span class="string">    &quot;input&quot;: &quot;用 Python 实现二分查找&quot;,</span></span><br><span class="line"><span class="string">    &quot;stream&quot;: true</span></span><br><span class="line"><span class="string">  &#125;&#x27;</span></span><br></pre></td></tr></table></figure><p>流式响应是 SSE 格式，每个事件包含增量内容：</p><figure class="highlight nix"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="params">event:</span> response.output_text.delta</span><br><span class="line"><span class="params">data:</span> &#123;<span class="string">&quot;delta&quot;</span>: <span class="string">&quot;def &quot;</span>&#125;</span><br><span class="line"></span><br><span class="line"><span class="params">event:</span> response.output_text.delta</span><br><span class="line"><span class="params">data:</span> &#123;<span class="string">&quot;delta&quot;</span>: <span class="string">&quot;binary_search&quot;</span>&#125;</span><br><span class="line"></span><br><span class="line"><span class="params">event:</span> response.output_text.delta</span><br><span class="line"><span class="params">data:</span> &#123;<span class="string">&quot;delta&quot;</span>: <span class="string">&quot;(arr, target):<span class="char escape_">\n</span>&quot;</span>&#125;</span><br></pre></td></tr></table></figure><h3 id="完整-Tool-Call-生命周期"><a href="#完整-Tool-Call-生命周期" class="headerlink" title="完整 Tool Call 生命周期"></a>完整 Tool Call 生命周期</h3><p>对于支持 function calling 的模型，proxy 完整转换 tool call 的生命周期：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">curl -X POST http://localhost:8000/v1/responses \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">    &quot;model&quot;: &quot;deepseek-chat&quot;,</span></span><br><span class="line"><span class="string">    &quot;input&quot;: &quot;北京今天天气怎么样？&quot;,</span></span><br><span class="line"><span class="string">    &quot;tools&quot;: [</span></span><br><span class="line"><span class="string">      &#123;</span></span><br><span class="line"><span class="string">        &quot;type&quot;: &quot;function&quot;,</span></span><br><span class="line"><span class="string">        &quot;name&quot;: &quot;get_weather&quot;,</span></span><br><span class="line"><span class="string">        &quot;description&quot;: &quot;获取指定城市的天气信息&quot;,</span></span><br><span class="line"><span class="string">        &quot;parameters&quot;: &#123;</span></span><br><span class="line"><span class="string">          &quot;type&quot;: &quot;object&quot;,</span></span><br><span class="line"><span class="string">          &quot;properties&quot;: &#123;</span></span><br><span class="line"><span class="string">            &quot;city&quot;: &#123;&quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;城市名称&quot;&#125;</span></span><br><span class="line"><span class="string">          &#125;,</span></span><br><span class="line"><span class="string">          &quot;required&quot;: [&quot;city&quot;]</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;</span></span><br><span class="line"><span class="string">    ]</span></span><br><span class="line"><span class="string">  &#125;&#x27;</span></span><br></pre></td></tr></table></figure><p>proxy 会：</p><ol><li>将 Responses API 的 tool 定义转换为 Chat Completions 格式</li><li>接收后端返回的 tool_call</li><li>转换回 Responses API 的 function_call 输出格式</li><li>处理 tool 结果的回传（后续轮次）</li></ol><h3 id="多模态输入"><a href="#多模态输入" class="headerlink" title="多模态输入"></a>多模态输入</h3><p>支持图片等多模态内容：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">curl -X POST http://localhost:8000/v1/responses \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">    &quot;model&quot;: &quot;qwen-vl-plus&quot;,</span></span><br><span class="line"><span class="string">    &quot;input&quot;: [</span></span><br><span class="line"><span class="string">      &#123;</span></span><br><span class="line"><span class="string">        &quot;type&quot;: &quot;message&quot;,</span></span><br><span class="line"><span class="string">        &quot;role&quot;: &quot;user&quot;,</span></span><br><span class="line"><span class="string">        &quot;content&quot;: [</span></span><br><span class="line"><span class="string">          &#123;&quot;type&quot;: &quot;input_text&quot;, &quot;text&quot;: &quot;这张图片里有什么？&quot;&#125;,</span></span><br><span class="line"><span class="string">          &#123;&quot;type&quot;: &quot;input_image&quot;, &quot;image_url&quot;: &quot;https://example.com/photo.jpg&quot;&#125;</span></span><br><span class="line"><span class="string">        ]</span></span><br><span class="line"><span class="string">      &#125;</span></span><br><span class="line"><span class="string">    ]</span></span><br><span class="line"><span class="string">  &#125;&#x27;</span></span><br></pre></td></tr></table></figure><p>proxy 自动将多模态内容转换为 Chat Completions 的 <code>content</code> 数组格式。</p><h3 id="reasoning-content-自动注入"><a href="#reasoning-content-自动注入" class="headerlink" title="reasoning_content 自动注入"></a>reasoning_content 自动注入</h3><p>DeepSeek-R1、QwQ 等 reasoning 模型会在响应中返回 <code>reasoning_content</code>（思考过程）。proxy 会自动将这部分内容注入到 Responses API 的输出中，客户端无需特殊处理：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;output&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;reasoning&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;content&quot;</span><span class="punctuation">:</span> <span class="string">&quot;让我分析一下这个问题...&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;message&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;role&quot;</span><span class="punctuation">:</span> <span class="string">&quot;assistant&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;content&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span><span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;output_text&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;text&quot;</span><span class="punctuation">:</span> <span class="string">&quot;最终答案是...&quot;</span><span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>这样 Codex CLI 等工具就能正确显示推理模型的思考过程了。</p><h3 id="Web-配置管理界面"><a href="#Web-配置管理界面" class="headerlink" title="Web 配置管理界面"></a>Web 配置管理界面</h3><p>proxy 内置了一个 Web UI，浏览器访问 <code>http://127.0.0.1:8000</code> 即可打开深色主题的配置管理面板：</p><ul><li>查看当前 provider 列表和状态</li><li>添加&#x2F;删除&#x2F;修改 provider 配置（直接在卡片上编辑）</li><li>管理模型列表（输入模型名按回车添加）</li><li>测试连通性（点击「测试」按钮自动 ping 上游 <code>/v1/models</code>）</li><li>修改 Host &#x2F; Port 等全局设置</li></ul><p>所有操作通过界面完成，不需要手动编辑 JSON 文件。</p><h3 id="配置热重载"><a href="#配置热重载" class="headerlink" title="配置热重载"></a>配置热重载</h3><p>在 Web UI 中点击「保存配置」后，proxy 自动热重载，无需重启进程。也可以通过 API 手动触发：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -X POST http://localhost:8000/api/reload</span><br></pre></td></tr></table></figure><p>整个流程：打开 Web UI → 编辑 Provider → 点击「测试」验证 → 点击「保存」生效。</p><h2 id="使用场景"><a href="#使用场景" class="headerlink" title="使用场景"></a>使用场景</h2><h3 id="场景一：Codex-CLI-接国产模型"><a href="#场景一：Codex-CLI-接国产模型" class="headerlink" title="场景一：Codex CLI 接国产模型"></a>场景一：Codex CLI 接国产模型</h3><p>Codex CLI 原生只支持 OpenAI，通过 proxy 可以直接用 MiMo、DeepSeek、Qwen 等模型：</p><figure class="highlight toml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ~/.codex/config.toml</span></span><br><span class="line"><span class="attr">model</span> = <span class="string">&quot;mimo-v2.5-pro&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="section">[model_providers.proxy]</span></span><br><span class="line"><span class="attr">name</span> = <span class="string">&quot;proxy&quot;</span></span><br><span class="line"><span class="attr">base_url</span> = <span class="string">&quot;http://127.0.0.1:8000/v1&quot;</span></span><br><span class="line"><span class="attr">wire_api</span> = <span class="string">&quot;responses&quot;</span></span><br><span class="line"><span class="attr">requires_openai_auth</span> = <span class="literal">false</span></span><br></pre></td></tr></table></figure><p>切换模型只需改 <code>model</code> 字段，所有请求自动路由。</p><h3 id="场景二：统一多-Provider-管理"><a href="#场景二：统一多-Provider-管理" class="headerlink" title="场景二：统一多 Provider 管理"></a>场景二：统一多 Provider 管理</h3><p>团队内部有多个 AI 应用，每个应用可能用不同模型。通过 proxy 统一入口：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> openai</span><br><span class="line"></span><br><span class="line">client = openai.OpenAI(</span><br><span class="line">    base_url=<span class="string">&quot;http://proxy:8000/v1&quot;</span>,</span><br><span class="line">    api_key=<span class="string">&quot;dummy&quot;</span>  <span class="comment"># proxy 侧管理真实密钥</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 用 MiMo 做对话</span></span><br><span class="line">resp = client.chat.completions.create(</span><br><span class="line">    model=<span class="string">&quot;mimo-v2.5-pro&quot;</span>,</span><br><span class="line">    messages=[&#123;<span class="string">&quot;role&quot;</span>: <span class="string">&quot;user&quot;</span>, <span class="string">&quot;content&quot;</span>: <span class="string">&quot;你好&quot;</span>&#125;]</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 切换到 DeepSeek 做推理</span></span><br><span class="line">resp = client.chat.completions.create(</span><br><span class="line">    model=<span class="string">&quot;deepseek-chat&quot;</span>,</span><br><span class="line">    messages=[&#123;<span class="string">&quot;role&quot;</span>: <span class="string">&quot;user&quot;</span>, <span class="string">&quot;content&quot;</span>: <span class="string">&quot;分析这个问题...&quot;</span>&#125;]</span><br><span class="line">)</span><br></pre></td></tr></table></figure><h3 id="场景三：本地开发调试"><a href="#场景三：本地开发调试" class="headerlink" title="场景三：本地开发调试"></a>场景三：本地开发调试</h3><p>在本地跑一个 proxy，把请求转发到远程 provider，方便调试和日志查看：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">responses-proxy --config config.yaml --log-level debug</span><br></pre></td></tr></table></figure><p>所有请求和响应都会打印详细日志，排查问题很方便。</p><h3 id="场景四：API-格式迁移"><a href="#场景四：API-格式迁移" class="headerlink" title="场景四：API 格式迁移"></a>场景四：API 格式迁移</h3><p>如果你的项目从 Chat Completions API 迁移到 Responses API，可以用 proxy 做过渡层——先让 proxy 接管流量，客户端逐步切换到新接口，后端暂时不动。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>responses-proxy 解决了一个很实际的问题：让只支持 Chat Completions API 的模型 provider 能被 Responses API 客户端（如 Codex CLI）直接调用。它的核心价值在于：</p><ul><li><strong>透明代理</strong>：客户端只看到 Responses API，后端只收到 Chat Completions API，转换逻辑由 proxy 处理</li><li><strong>多 provider 统一管理</strong>：一个配置文件管理所有 provider，路由规则灵活</li><li><strong>生产可用</strong>：流式响应、tool call、多模态、配置热重载——该有的都有</li><li><strong>部署简单</strong>：<code>pip install</code> 一行搞定，Python 项目无需额外依赖</li></ul><p>如果你正在用 Codex CLI 或其他 Responses API 客户端，想接入更多模型 provider，可以试试这个项目：</p><p>GitHub: <a href="https://github.com/zeng-gui/responses-proxy">https://github.com/zeng-gui/responses-proxy</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/zeng-gui/responses-proxy.git</span><br><span class="line"><span class="built_in">cd</span> responses-proxy</span><br><span class="line">pip install -r requirements.txt</span><br><span class="line">python proxy.py</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://zeng-gui.github.io/2025/05/09/responses-proxy-guide/</id>
    <link href="https://zeng-gui.github.io/2025/05/09/responses-proxy-guide/"/>
    <published>2025-05-09T10:00:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="背景：为什么需要代理"><a href="#背景：为什么需要代理" class="headerlink" title="背景：为什么需要代理"></a>背景：为什么需要代理</h2><p>OpenAI 推出了 Responses API，它是 Chat Completions API 的下一代接口，支持更复杂的交互模式——多轮 tool call、reasoning 内容输出、多模态输入等。但问题来了：</p>
<ol>
<li><strong>工具链滞后</strong>：Codex CLI、Cursor 等工具已经对接了 Responses API，但很多国产模型（MiMo、DeepSeek、Qwen）只提供 Chat Completions 接口。</li>
<li><strong>接口不兼容</strong>：Responses API 和 Chat Completions API 的请求&#x2F;响应格式完全不同，直接替换行不通。</li>
<li><strong>多 provider 管理混乱</strong>：不同模型散落在不同平台，每个平台一套 API key、一个 endpoint，切换成本高。</li>
</ol>
<p>responses-proxy 就是为了解决这三个问题：它是一个 FastAPI 代理服务，接收 Responses API 请求，自动转换为 Chat Completions API 转发给后端 provider，再把响应转换回来。对上游工具来说，它就是一个标准的 Responses API 端点。</p>]]>
    </summary>
    <title>responses-proxy：用 Python 搭建 OpenAI 兼容代理服务</title>
    <updated>2026-05-10T02:57:10.002Z</updated>
  </entry>
  <entry>
    <author>
      <name>zg</name>
    </author>
    <category term="随笔" scheme="https://zeng-gui.github.io/categories/%E9%9A%8F%E7%AC%94/"/>
    <category term="随笔" scheme="https://zeng-gui.github.io/tags/%E9%9A%8F%E7%AC%94/"/>
    <content>
      <![CDATA[<p>这是我的第一篇博客文章。</p><span id="more"></span><h2 id="关于这个站点"><a href="#关于这个站点" class="headerlink" title="关于这个站点"></a>关于这个站点</h2><ul><li>使用 Hexo 静态博客框架搭建</li><li>托管在 GitHub Pages，无需服务器</li><li>通过 GitHub Actions 自动部署</li></ul><h2 id="为什么选-Hexo？"><a href="#为什么选-Hexo？" class="headerlink" title="为什么选 Hexo？"></a>为什么选 Hexo？</h2><ol><li>纯静态，速度快</li><li>Markdown 写作，专注内容</li><li>主题丰富，生态成熟</li><li>免费托管，零成本</li></ol><p>接下来我会记录技术学习笔记和生活感悟，敬请期待！</p>]]>
    </content>
    <id>https://zeng-gui.github.io/2025/05/09/hello-blog/</id>
    <link href="https://zeng-gui.github.io/2025/05/09/hello-blog/"/>
    <published>2025-05-09T07:00:00.000Z</published>
    <summary>
      <![CDATA[<p>这是我的第一篇博客文章。</p>]]>
    </summary>
    <title>你好，我的博客</title>
    <updated>2026-05-10T02:57:10.002Z</updated>
  </entry>
</feed>
