<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>OpenAI兼容接口 on 魔都水滴</title>
		<link>https://blog.margrop.net/tag/openai%E5%85%BC%E5%AE%B9%E6%8E%A5%E5%8F%A3/</link>
		<description>Recent content in OpenAI兼容接口 on 魔都水滴</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Sun, 31 May 2026 18:00:00 +0800</lastBuildDate>
		
			<atom:link href="https://blog.margrop.net/tag/openai%E5%85%BC%E5%AE%B9%E6%8E%A5%E5%8F%A3/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>一次流式响应被重复消费：NewAPI v1.0.0-rc.10 MiniMax 转发 Bug 排查实录</title>
				<link>https://blog.margrop.net/post/newapi-streaming-duplicate-content-debugging/</link>
				<pubDate>Sun, 31 May 2026 18:00:00 +0800</pubDate>
				<guid>https://blog.margrop.net/post/newapi-streaming-duplicate-content-debugging/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;问题现象：AI Agent 在 DingTalk 通道中回复了重复的文本。消息不是发送了两次，而是一条消息里的内容被复制了一遍。排障最终定位到 NewAPI（QuantumNous 维护的 OneAPI 分支）v1.0.0-rc.10 版本的一个流式响应 Bug：当通过 OpenAI Chat Completions 协议转发 MiniMax 模型时，finish chunk 会&lt;strong&gt;同时包含 &lt;code&gt;delta.content&lt;/code&gt; 和 &lt;code&gt;message.content&lt;/code&gt;&lt;/strong&gt;，且两者内容完全一致。Agent 框架的流式处理器将两者都当作&amp;quot;可见文本&amp;quot;消费，导致最终文本被拼接两次。修复方案也很朴素：将 OpenClaw provider 协议从 &lt;code&gt;openai-completions&lt;/code&gt; 切换到 &lt;code&gt;anthropic-messages&lt;/code&gt;，OneAPI 原生支持该协议，且该路径下流式响应正常。&lt;/p&gt;&#xA;&lt;p&gt;本文不会出现任何真实内网地址、Token、模型 ID 或私有路径。所有配置片段都已脱敏。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
			</item>
			<item>
				<title>Claude Code 一升级就全模型 400：别急着换 Key，可能是网关没跟上新版协议</title>
				<link>https://blog.margrop.net/post/claude-code-invalid-message-role-system/</link>
				<pubDate>Fri, 29 May 2026 15:30:00 +0800</pubDate>
				<guid>https://blog.margrop.net/post/claude-code-invalid-message-role-system/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这次故障的表象非常吓人：Claude Code 更新之后，不管访问哪个模型，都会立刻报 &lt;code&gt;API Error: 400 invalid params, chat content has invalid message role: system (2013)&lt;/code&gt;。如果只看错误，很容易怀疑 API Key 失效、模型下线、余额不足、代理坏了、环境变量乱了，甚至怀疑所有模型同时挂掉。真正的根因不是这些，而是新版 Claude Code 发出的请求结构和某些 Anthropic-compatible 模型网关之间出现了兼容断层：网关把不该出现在 chat content 中的 &lt;code&gt;system&lt;/code&gt; role 当成非法消息拒绝了。&lt;/p&gt;&#xA;&lt;p&gt;最小可用修复也很朴素：先用最小 prompt 复现，再对相邻版本做二分式验证。最终确认 &lt;code&gt;2.1.150&lt;/code&gt; 能正常返回，&lt;code&gt;2.1.154&lt;/code&gt; 和 &lt;code&gt;2.1.156&lt;/code&gt; 会复现 400，于是把全局 Claude Code 固定回 &lt;code&gt;2.1.150&lt;/code&gt;。这不是“玄学回滚”，而是基于证据找到最后一个已知可用版本。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这篇文章记录一次 Claude Code 本地环境排障。它不是一个复杂到需要改源码的问题，但很有代表性：AI Agent 工具链越来越依赖模型网关、兼容协议、环境变量、版本更新和本地 provider 切换；当其中一层发生协议细节变化时，终端里看到的却往往只是一句抽象的 400。&lt;/p&gt;&#xA;&lt;p&gt;为了避免泄露任何隐私信息，本文不会出现真实内网地址、真实用户名、真实 token、真实私有 provider 名称、真实本机路径或私有服务域名。所有配置片段都使用 &lt;code&gt;&amp;lt;PLACEHOLDER&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;MODEL_GATEWAY&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;MODEL_NAME&amp;gt;&lt;/code&gt; 等占位符表示。文章重点是分享排障方法，而不是公开某个具体环境。&lt;/p&gt;</description>
			</item>
			<item>
				<title>AI 助手为什么把一句话复读四遍：一次 OpenClaw 微信通道排障复盘</title>
				<link>https://blog.margrop.net/post/openclaw-wechat-duplicate-reply-debugging/</link>
				<pubDate>Fri, 29 May 2026 11:24:29 +0800</pubDate>
				<guid>https://blog.margrop.net/post/openclaw-wechat-duplicate-reply-debugging/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这次问题看起来像“微信通道把同一条回复发了四遍”，但真正的重复发生在更早的位置：消息还没有进入微信发送层之前，OpenClaw Agent 的最终可见文本就已经被模型执行链路重复拼接了。排障的关键不是一上来改微信插件，而是把链路拆成发送层、会话层、模型路由层三段，用最小 prompt 复现，再比较“兼容网关路径”和“原生 provider 路径”的输出差异。最后的修复也很朴素：让个人 IM 通道显式走原生 provider，移除容易被误选的故障候选模型路径，重启 Gateway 后复测主会话。&lt;/p&gt;&#xA;&lt;p&gt;这篇文章不会出现任何真实内网地址、账号、token、会话 ID、个人微信标识或私有路径。所有配置片段都已经脱敏，并用 &lt;code&gt;&amp;lt;PLACEHOLDER&amp;gt;&lt;/code&gt; 形式表示。重点是分享一套可复用的排障方法，而不是公开某个具体环境的细节。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
			</item>
	</channel>
</rss>
