<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Anthropic on Zampo Blog</title><link>https://blog.cpdd.fyi/tags/anthropic/</link><description>Recent content in Anthropic on Zampo Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 15 Jun 2026 17:00:00 +0800</lastBuildDate><atom:link href="https://blog.cpdd.fyi/tags/anthropic/index.xml" rel="self" type="application/rss+xml"/><item><title>为什么你只改了 base_url，LLM API 还是报 404？</title><link>https://blog.cpdd.fyi/posts/llm-api-base-url-404/</link><pubDate>Mon, 15 Jun 2026 17:00:00 +0800</pubDate><guid>https://blog.cpdd.fyi/posts/llm-api-base-url-404/</guid><description>&lt;p&gt;你在 Go 项目里接一个新的模型供应商。&lt;/p&gt;
&lt;p&gt;文档写着“OpenAI compatible”。你心里一松：那不就是改三个值吗？&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-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;BaseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://api.xxx.com/v1/chat/completions&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;APIKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sk-...&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xxx-model&amp;#34;&lt;/span&gt;&lt;span class="w"&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;结果一跑，404。&lt;/p&gt;
&lt;p&gt;你把 key 换了，把 model 换了，把代理关了，把日志打开，最后才发现真正发出去的 URL 长这样：&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;/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;https://api.xxx.com/v1/chat/completions/chat/completions
&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;SDK 已经会在 base URL 后面拼 &lt;code&gt;/chat/completions&lt;/code&gt;，你又把 endpoint path 塞进了 base URL。&lt;/p&gt;
&lt;p&gt;这类问题看起来很低级。&lt;/p&gt;
&lt;p&gt;但它背后有一个更容易被忽略的误判：很多人把“平台入口”和“协议动作”混成了一个东西。&lt;/p&gt;
&lt;p&gt;base URL 只是告诉客户端：请求要发到哪台服务、哪个 API 根路径。&lt;/p&gt;
&lt;p&gt;真正决定请求体怎么写、响应体怎么读、流式事件怎么解析的，是后面的 endpoint path。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/v1/chat/completions&lt;/code&gt;、&lt;code&gt;/v1/messages&lt;/code&gt;、&lt;code&gt;/v1/responses&lt;/code&gt; 不是三个 URL 后缀。&lt;/p&gt;
&lt;p&gt;它们是三套协议契约。&lt;/p&gt;
&lt;h2 id="404-只是第一层症状"&gt;404 只是第一层症状&lt;/h2&gt;
&lt;p&gt;很多 LLM API 的接入问题，第一眼都像配置问题。&lt;/p&gt;
&lt;p&gt;404，像是 URL 配错。&lt;/p&gt;
&lt;p&gt;400，像是参数传错。&lt;/p&gt;
&lt;p&gt;流式读不到数据，像是网络断了。&lt;/p&gt;
&lt;p&gt;响应字段找不到，像是 SDK 版本不对。&lt;/p&gt;
&lt;p&gt;这些判断不一定错，但经常只停在表层。&lt;/p&gt;
&lt;p&gt;你真正要问的是：我现在调用的到底是哪一种协议？&lt;/p&gt;
&lt;p&gt;同样叫“发一段 prompt，让模型回一句话”，落到 API 上，至少有三种常见形态。&lt;/p&gt;</description></item></channel></rss>