<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Chat Completions on On My Way</title>
    <link>https://tuanzi-wow.cn/tags/chat-completions/</link>
    <description>Recent content in Chat Completions on On My Way</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <atom:link href="https://tuanzi-wow.cn/tags/chat-completions/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>三种常见 LLM API 兼容格式</title>
      <link>https://tuanzi-wow.cn/llm/llm-api-compat-formats/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://tuanzi-wow.cn/llm/llm-api-compat-formats/</guid>
      <description>OpenAI Chat Completions、OpenAI Responses API、Anthropic Messages 三种兼容格式的端点、认证、请求响应、流式、工具调用、状态与生态。</description>
      <content:encoded><![CDATA[<h1 id="三种常见-llm-api-兼容格式">三种常见 LLM API 兼容格式</h1>
<p>客户端、SDK、网关对「兼容」的约定，当前收敛成三条线协议：</p>
<ol>
<li><strong>OpenAI Chat Completions</strong> — <code>POST /v1/chat/completions</code></li>
<li><strong>OpenAI Responses API</strong> — <code>POST /v1/responses</code></li>
<li><strong>Anthropic Messages API</strong> — <code>POST /v1/messages</code></li>
</ol>
<p>Chat Completions 是跨厂商事实标准。Responses 是 OpenAI 2025-03 起的新主 API，agent / 内置工具 / 推理连续性落在这里。Messages 是 Claude 原生协议，因 Claude Code 成为第二标准。</p>
<p>OpenAI 官方：Chat Completions <strong>继续支持、不会sunset</strong>；新项目推荐 Responses。被 sunset 的是 Assistants API（2026-08-26），迁到 Responses + Conversations，不是迁回 Chat Completions。</p>
<h2 id="一句话对照">一句话对照</h2>
<table>
	<thead>
			<tr>
					<th>项</th>
					<th>Chat Completions</th>
					<th>Responses API</th>
					<th>Anthropic Messages</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>主端点</td>
					<td><code>POST /v1/chat/completions</code></td>
					<td><code>POST /v1/responses</code></td>
					<td><code>POST /v1/messages</code></td>
			</tr>
			<tr>
					<td>认证</td>
					<td><code>Authorization: Bearer</code></td>
					<td>同左</td>
					<td><code>x-api-key</code> + <code>anthropic-version</code></td>
			</tr>
			<tr>
					<td>对话容器</td>
					<td><code>messages[]</code></td>
					<td><code>input</code>（字符串或 item 数组）</td>
					<td><code>messages[]</code> + 顶层 <code>system</code></td>
			</tr>
			<tr>
					<td>系统提示</td>
					<td><code>messages</code> 里 <code>role: system</code> / <code>developer</code></td>
					<td>顶层 <code>instructions</code></td>
					<td>顶层 <code>system</code></td>
			</tr>
			<tr>
					<td>取出文本</td>
					<td><code>choices[0].message.content</code></td>
					<td><code>output_text</code> 或 <code>output[]</code> 里 <code>output_text</code></td>
					<td><code>content[0].text</code></td>
			</tr>
			<tr>
					<td>返回单元</td>
					<td><code>choices[].message</code>（多关切粘在一条 message）</td>
					<td>类型化 <code>output[]</code> item：<code>message</code> / <code>reasoning</code> / <code>function_call</code></td>
					<td>类型化 <code>content[]</code> block：<code>text</code> / <code>thinking</code> / <code>tool_use</code></td>
			</tr>
			<tr>
					<td>流式</td>
					<td>同端点 <code>stream: true</code>，chunk + <code>delta</code></td>
					<td>同端点 <code>stream: true</code>，语义事件 <code>response.*.delta</code></td>
					<td>同端点 <code>stream: true</code>，命名事件 <code>content_block_delta</code></td>
			</tr>
			<tr>
					<td>输出上限</td>
					<td><code>max_completion_tokens</code>（<code>max_tokens</code> 弃用）</td>
					<td><code>max_output_tokens</code></td>
					<td><code>max_tokens</code>（<strong>必填</strong>）</td>
			</tr>
			<tr>
					<td>多轮状态</td>
					<td>客户端重发全部 history</td>
					<td>可选 <code>previous_response_id</code> / Conversations；也可手传 item</td>
					<td>客户端重发全部 history</td>
			</tr>
			<tr>
					<td>内置工具</td>
					<td>无（只有你自己的 function）</td>
					<td>web_search / file_search / code_interpreter / computer_use / MCP / image_generation</td>
					<td>服务端工具：web_search / web_fetch / code_execution / computer use 等</td>
			</tr>
			<tr>
					<td>生态</td>
					<td>最广：国内云、vLLM、Ollama、Cursor</td>
					<td>OpenAI 自家 + 少数网关；兼容层常残缺</td>
					<td>Claude Code / Anthropic SDK；DeepSeek、MiniMax、Kimi 已跟</td>
			</tr>
	</tbody>
</table>
<p>识别规则：看路径和请求体，不看模型名。</p>
<ul>
<li>有 <code>messages</code> + 响应有 <code>choices</code> → Chat Completions</li>
<li>有 <code>input</code>（或顶层 <code>instructions</code>）+ 响应有 <code>output</code> / <code>output_text</code> → Responses</li>
<li>有必填 <code>max_tokens</code> + 顶层 <code>system</code> + 响应 <code>content</code> 块数组 → Messages</li>
</ul>
<h2 id="1-openai-chat-completions">1. OpenAI Chat Completions</h2>
<p>2023-03 起的对话 API。换 <code>base_url</code> 就能打 DeepSeek、Qwen compatible-mode、Moonshot、GLM、xAI、vLLM、Ollama、大多数网关。跨厂商移植仍写这套。</p>
<h3 id="端点与认证">端点与认证</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">POST:{base}/v1/chat/completions
</span></span><span class="line"><span class="cl">Authorization: Bearer $API_KEY
</span></span><span class="line"><span class="cl">Content-Type: application/json
</span></span></code></pre></td></tr></table>
</div>
</div><p>SDK 的 <code>base_url</code> 通常<strong>带</strong> <code>/v1</code>。官方：<code>https://api.openai.com/v1</code>。</p>
<p>常见附属：<code>GET /v1/models</code>、<code>POST /v1/embeddings</code>。<code>POST /v1/completions</code> 是更旧的 prompt 补全，已 legacy。</p>
<h3 id="请求">请求</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;gpt-4.1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;你是助手。&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;用一句话解释 token。&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;temperature&#34;</span><span class="p">:</span> <span class="mf">0.7</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;max_completion_tokens&#34;</span><span class="p">:</span> <span class="mi">512</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;stream&#34;</span><span class="p">:</span> <span class="kc">false</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><table>
	<thead>
			<tr>
					<th>字段</th>
					<th>说明</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>model</code></td>
					<td>必填</td>
			</tr>
			<tr>
					<td><code>messages</code></td>
					<td>必填。角色：<code>system</code> / <code>developer</code>（o1 及更新推理模型用 <code>developer</code> 替代 <code>system</code>）/ <code>user</code> / <code>assistant</code> / <code>tool</code></td>
			</tr>
			<tr>
					<td><code>content</code></td>
					<td>字符串，或多模态数组 <code>[{type:&quot;text&quot;,text}, {type:&quot;image_url&quot;,image_url:{url}}]</code></td>
			</tr>
			<tr>
					<td><code>temperature</code></td>
					<td>0–2，默认 1</td>
			</tr>
			<tr>
					<td><code>top_p</code></td>
					<td>0–1。与 temperature 二选一调</td>
			</tr>
			<tr>
					<td><code>max_completion_tokens</code></td>
					<td>输出上限；<code>max_tokens</code> 已弃用。推理模型把隐藏 thinking 也算进这个上限</td>
			</tr>
			<tr>
					<td><code>stop</code></td>
					<td>字符串或最多 4 个序列</td>
			</tr>
			<tr>
					<td><code>n</code></td>
					<td>候选条数，1–128。Responses <strong>没有</strong> 对应项</td>
			</tr>
			<tr>
					<td><code>presence_penalty</code> / <code>frequency_penalty</code></td>
					<td>-2–2</td>
			</tr>
			<tr>
					<td><code>response_format</code></td>
					<td><code>{type:&quot;json_object&quot;}</code> 或 <code>{type:&quot;json_schema&quot;, json_schema:{...}}</code></td>
			</tr>
			<tr>
					<td><code>tools</code></td>
					<td><code>[{type:&quot;function&quot;, function:{name, description, parameters}}]</code></td>
			</tr>
			<tr>
					<td><code>tool_choice</code></td>
					<td><code>&quot;none&quot;</code> / <code>&quot;auto&quot;</code> / <code>&quot;required&quot;</code> / 指定函数</td>
			</tr>
			<tr>
					<td><code>parallel_tool_calls</code></td>
					<td>默认 true</td>
			</tr>
			<tr>
					<td><code>reasoning_effort</code></td>
					<td>推理深度。GPT-5.4 起，Chat Completions 在非 <code>none</code> 的 effort 上<strong>不支持</strong> tool calling，要走 Responses</td>
			</tr>
			<tr>
					<td><code>stream</code></td>
					<td>true 时 SSE</td>
			</tr>
			<tr>
					<td><code>stream_options</code></td>
					<td><code>{include_usage: true}</code> 在末包带回 usage</td>
			</tr>
			<tr>
					<td><code>store</code></td>
					<td>新账号默认存储；关存储设 <code>false</code></td>
			</tr>
	</tbody>
</table>
<h3 id="响应">响应</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;chatcmpl-...&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;object&#34;</span><span class="p">:</span> <span class="s2">&#34;chat.completion&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;created&#34;</span><span class="p">:</span> <span class="mi">1714000000</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;gpt-4.1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;choices&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;index&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;message&#34;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;...&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;finish_reason&#34;</span><span class="p">:</span> <span class="s2">&#34;stop&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;usage&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;prompt_tokens&#34;</span><span class="p">:</span> <span class="mi">25</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;completion_tokens&#34;</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;total_tokens&#34;</span><span class="p">:</span> <span class="mi">34</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>finish_reason</code>：<code>stop</code> / <code>length</code> / <code>tool_calls</code> / <code>content_filter</code> / <code>function_call</code>（弃用）。</p>
<p>工具调用时 <code>message.content</code> 常为 <code>null</code>，调用在 <code>message.tool_calls[]</code>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;tool_calls&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;call_abc&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;function&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;function&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;get_weather&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;arguments&#34;</span><span class="p">:</span> <span class="s2">&#34;{\&#34;location\&#34;:\&#34;Boston, MA\&#34;}&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>回灌：同一 <code>messages</code> 里追加 <code>role: &quot;tool&quot;</code>，带 <code>tool_call_id</code>。必须客户端自己把 assistant 的 tool_calls 和 tool 结果都塞回下一轮。</p>
<h3 id="流式">流式</h3>
<p>同端点，<code>stream: true</code>。每行 <code>data: {json}</code>，结束 <code>data: [DONE]</code>。对象类型 <code>chat.completion.chunk</code>，增量在 <code>choices[0].delta.content</code>。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;id&#34;</span><span class="p">:</span><span class="s2">&#34;chatcmpl-123&#34;</span><span class="p">,</span><span class="nt">&#34;object&#34;</span><span class="p">:</span><span class="s2">&#34;chat.completion.chunk&#34;</span><span class="p">,</span><span class="nt">&#34;choices&#34;</span><span class="p">:[{</span><span class="nt">&#34;index&#34;</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="nt">&#34;delta&#34;</span><span class="p">:{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span><span class="s2">&#34;assistant&#34;</span><span class="p">,</span><span class="nt">&#34;content&#34;</span><span class="p">:</span><span class="s2">&#34;&#34;</span><span class="p">},</span><span class="nt">&#34;finish_reason&#34;</span><span class="p">:</span><span class="kc">null</span><span class="p">}]}</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;id&#34;</span><span class="p">:</span><span class="s2">&#34;chatcmpl-123&#34;</span><span class="p">,</span><span class="nt">&#34;object&#34;</span><span class="p">:</span><span class="s2">&#34;chat.completion.chunk&#34;</span><span class="p">,</span><span class="nt">&#34;choices&#34;</span><span class="p">:[{</span><span class="nt">&#34;index&#34;</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="nt">&#34;delta&#34;</span><span class="p">:{</span><span class="nt">&#34;content&#34;</span><span class="p">:</span><span class="s2">&#34;Hello&#34;</span><span class="p">},</span><span class="nt">&#34;finish_reason&#34;</span><span class="p">:</span><span class="kc">null</span><span class="p">}]}</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;id&#34;</span><span class="p">:</span><span class="s2">&#34;chatcmpl-123&#34;</span><span class="p">,</span><span class="nt">&#34;object&#34;</span><span class="p">:</span><span class="s2">&#34;chat.completion.chunk&#34;</span><span class="p">,</span><span class="nt">&#34;choices&#34;</span><span class="p">:[{</span><span class="nt">&#34;index&#34;</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span><span class="nt">&#34;delta&#34;</span><span class="p">:{},</span><span class="nt">&#34;finish_reason&#34;</span><span class="p">:</span><span class="s2">&#34;stop&#34;</span><span class="p">}]}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>工具流式：<code>delta.tool_calls[].function.arguments</code> 是 JSON 字符串碎片，按 <code>index</code> 拼接。</p>
<h3 id="最小调用">最小调用</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">(</span><span class="n">api_key</span><span class="o">=</span><span class="s2">&#34;sk-...&#34;</span><span class="p">,</span> <span class="n">base_url</span><span class="o">=</span><span class="s2">&#34;https://api.openai.com/v1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">r</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">chat</span><span class="o">.</span><span class="n">completions</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">model</span><span class="o">=</span><span class="s2">&#34;gpt-4.1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">messages</span><span class="o">=</span><span class="p">[{</span><span class="s2">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="s2">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;ping&#34;</span><span class="p">}],</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">choices</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">message</span><span class="o">.</span><span class="n">content</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="2-openai-responses-api">2. OpenAI Responses API</h2>
<p>OpenAI 现推的主 primitive。设计目标：把「一次模型动作」从一条粘在一起的 message，拆成类型化 item（message / reasoning / function_call / 内置工具调用）。同一请求内可跑完多步工具循环（agentic loop）。</p>
<p>Chat Completions 能做的文本 / vision / 自定义 function / structured output，Responses 都能做，并且是超集。新能力只上 Responses：web_search、file_search、code_interpreter、computer use、远程 MCP、image_generation 当工具、reasoning summary、background mode。</p>
<p>内部评测（官方）：同样 prompt，推理模型走 Responses 比 Chat Completions 在 SWE-bench 高约 3%；prompt cache 利用率高 40%–80%。</p>
<h3 id="端点与认证-1">端点与认证</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">POST https://api.openai.com/v1/responses
</span></span><span class="line"><span class="cl">Authorization: Bearer $OPENAI_API_KEY
</span></span><span class="line"><span class="cl">Content-Type: application/json
</span></span></code></pre></td></tr></table>
</div>
</div><p>认证与 Chat Completions 相同。附属：<code>GET /v1/responses/{id}</code>、<code>POST /v1/responses/{id}/cancel</code>、Conversations API、<code>POST /v1/responses/compact</code>。</p>
<h3 id="请求-1">请求</h3>
<p>最简：<code>input</code> 可以是纯字符串。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;gpt-5.5&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;instructions&#34;</span><span class="p">:</span> <span class="s2">&#34;你是助手。&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;input&#34;</span><span class="p">:</span> <span class="s2">&#34;用一句话解释 token。&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>多轮 / 多模态时 <code>input</code> 是 item 数组。简单 <code>{role, content}</code> 消息数组也能塞进 <code>input</code>（迁移期兼容）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;gpt-5.5&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;instructions&#34;</span><span class="p">:</span> <span class="s2">&#34;你是助手。&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;input&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;input_text&#34;</span><span class="p">,</span> <span class="nt">&#34;text&#34;</span><span class="p">:</span> <span class="s2">&#34;这张图里有什么？&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span><span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;input_image&#34;</span><span class="p">,</span> <span class="nt">&#34;image_url&#34;</span><span class="p">:</span> <span class="s2">&#34;https://...&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;max_output_tokens&#34;</span><span class="p">:</span> <span class="mi">512</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><table>
	<thead>
			<tr>
					<th>字段</th>
					<th>说明</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>model</code></td>
					<td>必填</td>
			</tr>
			<tr>
					<td><code>input</code></td>
					<td>必填。字符串，或 item 数组（message / function_call_output / 内置工具结果 / item_reference）</td>
			</tr>
			<tr>
					<td><code>instructions</code></td>
					<td>顶层系统提示，不进 <code>input</code>。利于 prompt cache</td>
			</tr>
			<tr>
					<td><code>max_output_tokens</code></td>
					<td>输出上限，对应 CC 的 <code>max_completion_tokens</code></td>
			</tr>
			<tr>
					<td><code>temperature</code> / <code>top_p</code></td>
					<td>与 CC 同量纲 0–2 / 0–1</td>
			</tr>
			<tr>
					<td><code>text.format</code></td>
					<td>结构化输出。对应 CC 的 <code>response_format</code></td>
			</tr>
			<tr>
					<td><code>tools</code></td>
					<td>扁平：<code>{type:&quot;function&quot;, name, description, parameters}</code>，<strong>不再</strong>套一层 <code>function</code>。也可放内置工具 <code>{type:&quot;web_search&quot;}</code> 等</td>
			</tr>
			<tr>
					<td><code>tool_choice</code></td>
					<td><code>&quot;none&quot;</code> / <code>&quot;auto&quot;</code> / <code>&quot;required&quot;</code> / 具名</td>
			</tr>
			<tr>
					<td><code>reasoning</code></td>
					<td>`{effort:&ldquo;low&rdquo;</td>
			</tr>
			<tr>
					<td><code>previous_response_id</code></td>
					<td>把上一轮 <code>resp_...</code> 链上来，服务端持有历史</td>
			</tr>
			<tr>
					<td><code>store</code></td>
					<td>默认 <strong>true</strong>。ZDR / 不要落盘设 <code>false</code>，推理连续性改走加密 reasoning item</td>
			</tr>
			<tr>
					<td><code>background</code></td>
					<td>长任务异步；可配合 <code>stream</code> 断线后续传</td>
			</tr>
			<tr>
					<td><code>stream</code></td>
					<td>true 时语义 SSE 事件</td>
			</tr>
			<tr>
					<td><code>conversation</code></td>
					<td>接到 Conversations API 的会话 id</td>
			</tr>
	</tbody>
</table>
<p>没有 <code>n</code>（只生成一条）。没有 <code>presence_penalty</code> / <code>frequency_penalty</code> 这一套 CC-only 采样项（以当前 schema 为准）。</p>
<h3 id="响应-1">响应</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;resp_68af4030...&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;object&#34;</span><span class="p">:</span> <span class="s2">&#34;response&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;created_at&#34;</span><span class="p">:</span> <span class="mi">1756315696</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;status&#34;</span><span class="p">:</span> <span class="s2">&#34;completed&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;gpt-5.5&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;output&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;rs_...&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;reasoning&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="p">[],</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;summary&#34;</span><span class="p">:</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;msg_...&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;message&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;status&#34;</span><span class="p">:</span> <span class="s2">&#34;completed&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;output_text&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">          <span class="nt">&#34;annotations&#34;</span><span class="p">:</span> <span class="p">[],</span>
</span></span><span class="line"><span class="cl">          <span class="nt">&#34;text&#34;</span><span class="p">:</span> <span class="s2">&#34;...&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;usage&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;input_tokens&#34;</span><span class="p">:</span> <span class="mi">25</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;output_tokens&#34;</span><span class="p">:</span> <span class="mi">40</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;total_tokens&#34;</span><span class="p">:</span> <span class="mi">65</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>SDK 提供 <code>response.output_text</code>，把所有 <code>output_text</code> 拼起来。手写解析不要假定 <code>output[0]</code> 是 message——前面经常先有 <code>reasoning</code>。</p>
<p><code>status</code>：<code>in_progress</code> / <code>completed</code> / <code>failed</code> / <code>cancelled</code> / <code>queued</code>。</p>
<h3 id="工具调用形状与-cc-不同">工具调用形状（与 CC 不同）</h3>
<p>定义（扁平，无 <code>function</code> 包一层）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;function&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;get_weather&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;description&#34;</span><span class="p">:</span> <span class="s2">&#34;Get weather&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;parameters&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;object&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;properties&#34;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&#34;location&#34;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;string&#34;</span><span class="p">}},</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;required&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;location&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>模型吐出的是独立 item，不嵌在 message 里：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;function_call&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;fc_...&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;call_id&#34;</span><span class="p">:</span> <span class="s2">&#34;call_abc&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;get_weather&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;arguments&#34;</span><span class="p">:</span> <span class="s2">&#34;{\&#34;location\&#34;:\&#34;Boston, MA\&#34;}&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>回灌用另一个 item，<code>call_id</code> 必须对齐：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;function_call_output&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;call_id&#34;</span><span class="p">:</span> <span class="s2">&#34;call_abc&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;output&#34;</span><span class="p">:</span> <span class="s2">&#34;72°F, sunny&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>两种多轮方式：</p>
<ol>
<li><strong>服务端状态</strong>：下一请求只带 <code>previous_response_id</code> + 新 <code>input</code>（用户话或 <code>function_call_output</code>）。</li>
<li><strong>无状态</strong>：把上一轮 <code>output</code> 里的 reasoning / function_call 原样放进下一轮 <code>input</code>，再追加 <code>function_call_output</code>。丢掉 reasoning item 会打断推理连续性。<code>store: false</code> 时用加密 reasoning 字段回放。</li>
</ol>
<p><code>previous_response_id</code> <strong>不免除</strong> 对先前上下文的计费：链上的历史仍按 input tokens 计。</p>
<p>内置工具同一 <code>tools</code> 数组：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;tools&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;web_search&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;function&#34;</span><span class="p">,</span> <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;get_weather&#34;</span><span class="p">,</span> <span class="nt">&#34;parameters&#34;</span><span class="p">:</span> <span class="p">{</span><span class="err">...</span><span class="p">}}]}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>模型可在<strong>一次</strong> <code>responses.create</code> 里连打多个内置工具，再给你最终文本。自定义 function 仍要你本地执行后回灌。</p>
<h3 id="结构化输出">结构化输出</h3>
<p>CC 的 <code>response_format</code> 迁到 <code>text.format</code>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;gpt-5.5&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;input&#34;</span><span class="p">:</span> <span class="s2">&#34;抽出发票字段。&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;text&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;format&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;json_schema&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;invoice&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;strict&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;schema&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;object&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;properties&#34;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&#34;total&#34;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;number&#34;</span><span class="p">}},</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;required&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;total&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>schema 本身不变，只是位置变了。JSON mode 对应 <code>text.format.type = &quot;json_object&quot;</code>。</p>
<h3 id="流式-1">流式</h3>
<p>同端点 <code>stream: true</code>。<strong>不要</strong>用 Chat Completions 的 <code>choices[0].delta</code> 解析器。事件带 <code>type</code>：</p>
<table>
	<thead>
			<tr>
					<th>事件</th>
					<th>含义</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>response.created</code></td>
					<td>对象已建，<code>status: in_progress</code></td>
			</tr>
			<tr>
					<td><code>response.output_item.added</code></td>
					<td>新 item（message / reasoning / function_call）</td>
			</tr>
			<tr>
					<td><code>response.content_part.added</code></td>
					<td>新 content part</td>
			</tr>
			<tr>
					<td><code>response.output_text.delta</code></td>
					<td>文本增量，读 <code>delta</code></td>
			</tr>
			<tr>
					<td><code>response.function_call_arguments.delta</code></td>
					<td>函数参数碎片</td>
			</tr>
			<tr>
					<td><code>response.output_item.done</code></td>
					<td>该 item 完成；reasoning 以这条的完整 item 为准再回放</td>
			</tr>
			<tr>
					<td><code>response.completed</code></td>
					<td>整次完成</td>
			</tr>
			<tr>
					<td><code>error</code></td>
					<td>失败</td>
			</tr>
	</tbody>
</table>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">stream</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">responses</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="s2">&#34;gpt-5.5&#34;</span><span class="p">,</span> <span class="nb">input</span><span class="o">=</span><span class="s2">&#34;ping&#34;</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">stream</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="s2">&#34;response.output_text.delta&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">delta</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s2">&#34;&#34;</span><span class="p">,</span> <span class="n">flush</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="最小调用-1">最小调用</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">r</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">responses</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">model</span><span class="o">=</span><span class="s2">&#34;gpt-5.5&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">instructions</span><span class="o">=</span><span class="s2">&#34;你是助手。&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nb">input</span><span class="o">=</span><span class="s2">&#34;ping&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">output_text</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>链式多轮：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">r2</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">responses</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">model</span><span class="o">=</span><span class="s2">&#34;gpt-5.5&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">previous_response_id</span><span class="o">=</span><span class="n">r</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nb">input</span><span class="o">=</span><span class="s2">&#34;把上一句翻译成英文。&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="从-chat-completions-迁过来的三件事">从 Chat Completions 迁过来的三件事</h3>
<ol>
<li>路径 <code>/v1/chat/completions</code> → <code>/v1/responses</code>。</li>
<li>读 <code>choices[0].message.content</code> → 读 <code>output_text</code> / 遍历 <code>output</code>（不要把每个 item 都当 message）。</li>
<li>选状态策略：继续手传 history（<code>input</code> 里重放 item），或 <code>previous_response_id</code> / Conversations。</li>
</ol>
<p>常见迁移错误：仍发 <code>response_format</code>；把 CC 的 <code>tools[].function</code> 套层原样丢给 Responses；回灌 function 结果不带 <code>call_id</code>；流式还在找 <code>choices</code>；丢掉 reasoning item。</p>
<p>GPT-6 Astra 的 tool calling <strong>要求</strong> Responses。Chat Completions 示例要用更早的模型。</p>
<h2 id="3-anthropic-messages-api">3. Anthropic Messages API</h2>
<p>Claude 原生协议。Claude Code、Anthropic SDK 只认这套。2025–2026 起 DeepSeek（<code>https://api.deepseek.com/anthropic</code>）、MiniMax（推荐走 Messages 拿满 thinking/tool）、Kimi、部分 Qwen 网关都加了 <code>/v1/messages</code>。</p>
<p>旧 Text Completions（<code>\n\nHuman:</code> / <code>\n\nAssistant:</code>）已弃用。</p>
<h3 id="端点与认证-2">端点与认证</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">POST https://api.anthropic.com/v1/messages
</span></span><span class="line"><span class="cl">x-api-key: $ANTHROPIC_API_KEY
</span></span><span class="line"><span class="cl">anthropic-version: 2023-06-01
</span></span><span class="line"><span class="cl">Content-Type: application/json
</span></span></code></pre></td></tr></table>
</div>
</div><p>兼容层常见两种：只认 <code>x-api-key</code>，或同时接受 <code>Authorization: Bearer</code>。<code>anthropic-version</code> 多数网关忽略，SDK 会带。</p>
<p>附属：<code>POST /v1/messages/count_tokens</code>、<code>POST /v1/messages/batches</code>。</p>
<h3 id="请求-2">请求</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;claude-sonnet-4-6&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;max_tokens&#34;</span><span class="p">:</span> <span class="mi">1024</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;system&#34;</span><span class="p">:</span> <span class="s2">&#34;你是助手。&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;用一句话解释 token。&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;temperature&#34;</span><span class="p">:</span> <span class="mf">0.7</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><table>
	<thead>
			<tr>
					<th>字段</th>
					<th>说明</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>model</code></td>
					<td>必填</td>
			</tr>
			<tr>
					<td><code>max_tokens</code></td>
					<td><strong>必填</strong>，&gt; 1。thinking 也计入</td>
			</tr>
			<tr>
					<td><code>messages</code></td>
					<td>必填。角色只有 <code>user</code> / <code>assistant</code>，<strong>没有</strong> <code>system</code> / <code>tool</code></td>
			</tr>
			<tr>
					<td><code>system</code></td>
					<td>顶层，字符串或 content block 数组</td>
			</tr>
			<tr>
					<td><code>temperature</code></td>
					<td>0–1，默认 1。Opus 4.7+ / Sonnet 5 / Fable 5 上非默认采样参数会 400，应省略</td>
			</tr>
			<tr>
					<td><code>top_p</code> / <code>top_k</code></td>
					<td>同上，新模型上移除</td>
			</tr>
			<tr>
					<td><code>stop_sequences</code></td>
					<td>数组</td>
			</tr>
			<tr>
					<td><code>tools</code></td>
					<td><code>[{name, description, input_schema}]</code>，schema 在顶层，不套 <code>function</code></td>
			</tr>
			<tr>
					<td><code>tool_choice</code></td>
					<td>`{type:&ldquo;auto&rdquo;</td>
			</tr>
			<tr>
					<td><code>thinking</code></td>
					<td><code>{type:&quot;adaptive&quot;}</code> 或旧式 <code>{type:&quot;enabled&quot;, budget_tokens:N}</code></td>
			</tr>
			<tr>
					<td><code>output_config.format</code></td>
					<td>结构化输出（<code>output_format</code> 已替换）</td>
			</tr>
			<tr>
					<td><code>cache_control</code></td>
					<td>顶层自动缓存，或打在单个 content block 上</td>
			</tr>
			<tr>
					<td><code>stream</code></td>
					<td>true 时 SSE</td>
			</tr>
	</tbody>
</table>
<p><code>content</code> 可以是字符串，等价于 <code>[{type:&quot;text&quot;, text:&quot;...&quot;}]</code>。正式形态是块数组。常见块：<code>text</code> / <code>image</code> / <code>tool_use</code> / <code>tool_result</code> / <code>thinking</code>。</p>
<p>图片：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;image&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;source&#34;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;base64&#34;</span><span class="p">,</span> <span class="nt">&#34;media_type&#34;</span><span class="p">:</span> <span class="s2">&#34;image/jpeg&#34;</span><span class="p">,</span> <span class="nt">&#34;data&#34;</span><span class="p">:</span> <span class="s2">&#34;&lt;base64&gt;&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="响应-2">响应</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;msg_...&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;message&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;claude-sonnet-4-6&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;text&#34;</span><span class="p">,</span> <span class="nt">&#34;text&#34;</span><span class="p">:</span> <span class="s2">&#34;...&#34;</span><span class="p">}],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;stop_reason&#34;</span><span class="p">:</span> <span class="s2">&#34;end_turn&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;stop_sequence&#34;</span><span class="p">:</span> <span class="kc">null</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;usage&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;input_tokens&#34;</span><span class="p">:</span> <span class="mi">25</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;output_tokens&#34;</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;cache_creation_input_tokens&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;cache_read_input_tokens&#34;</span><span class="p">:</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>stop_reason</code>：<code>end_turn</code> / <code>max_tokens</code> / <code>stop_sequence</code> / <code>tool_use</code> / <code>pause_turn</code> / <code>refusal</code> / <code>model_context_window_exceeded</code>。</p>
<p>工具调用是 content 里的块，<code>input</code> 是<strong>对象</strong>不是字符串：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;tool_use&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;toolu_01&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;get_weather&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;input&#34;</span><span class="p">:</span> <span class="p">{</span><span class="nt">&#34;location&#34;</span><span class="p">:</span> <span class="s2">&#34;Boston, MA&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>回灌：下一条 <code>user</code> 消息的 content 里放 <code>tool_result</code>，<code>tool_use_id</code> 对齐。下一轮要把上一轮完整 <code>content</code>（含 thinking / tool_use）原样追加进 <code>assistant</code> 消息。丢掉 thinking 块会校验失败。</p>
<h3 id="流式-2">流式</h3>
<p>同端点。事件名与 <code>data.type</code> 一致。</p>
<p>顺序：</p>
<ol>
<li><code>message_start</code> — 空 <code>content</code> 的 Message，含 input usage</li>
<li>每个块：<code>content_block_start</code> → 若干 <code>content_block_delta</code> → <code>content_block_stop</code></li>
<li><code>message_delta</code> — <code>stop_reason</code> + 最终 output usage</li>
<li><code>message_stop</code></li>
</ol>
<p>文本增量：<code>delta.type == &quot;text_delta&quot;</code>。工具参数增量：<code>input_json_delta</code>（<code>partial_json</code>）。中间可能夹 <code>ping</code>。不要把所有 <code>content_block_delta</code> 都当文本。</p>
<h3 id="prompt-cache">Prompt cache</h3>
<p>两种开法：</p>
<ul>
<li>自动：请求顶层 <code>&quot;cache_control&quot;: {&quot;type&quot;: &quot;ephemeral&quot;}</code>，断点落在最后一个可缓存块，多轮会前移。</li>
<li>显式：在 tools / system / 某个 content block 上挂 <code>cache_control</code>。</li>
</ul>
<p>默认 TTL 5 分钟，刷新命中免费；另有 1 小时档（写入更贵）。缓存前缀顺序固定：tools → system → messages。usage 里看 <code>cache_creation_input_tokens</code> / <code>cache_read_input_tokens</code>。</p>
<p>Responses 的 cache 主要靠稳定的 <code>instructions</code> + 服务端状态；Messages 是显式断点。两套机制不能对着抄字段名。</p>
<h3 id="最小调用-2">最小调用</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">anthropic</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">anthropic</span><span class="o">.</span><span class="n">Anthropic</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">r</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">messages</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">model</span><span class="o">=</span><span class="s2">&#34;claude-sonnet-4-6&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">max_tokens</span><span class="o">=</span><span class="mi">1024</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">system</span><span class="o">=</span><span class="s2">&#34;你是助手。&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">messages</span><span class="o">=</span><span class="p">[{</span><span class="s2">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="s2">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;ping&#34;</span><span class="p">}],</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">content</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="横切对照">横切对照</h2>
<h3 id="认证与路径">认证与路径</h3>
<table>
	<thead>
			<tr>
					<th></th>
					<th>Chat Completions</th>
					<th>Responses</th>
					<th>Messages</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Header</td>
					<td><code>Authorization: Bearer</code></td>
					<td>同左</td>
					<td><code>x-api-key</code></td>
			</tr>
			<tr>
					<td>额外</td>
					<td>无</td>
					<td>无</td>
					<td><code>anthropic-version: 2023-06-01</code></td>
			</tr>
			<tr>
					<td>SDK base</td>
					<td>带 <code>/v1</code></td>
					<td>带 <code>/v1</code></td>
					<td><strong>不</strong>带 <code>/v1</code>（路径自含 <code>/v1/messages</code>）</td>
			</tr>
			<tr>
					<td>同一把 OpenAI key</td>
					<td>是</td>
					<td>是</td>
					<td>否（Anthropic key；网关可统一成 <code>sk-</code> 再改 header）</td>
			</tr>
	</tbody>
</table>
<p>OpenAI 两条协议可以共用 SDK 对象：<code>client.chat.completions.create</code> vs <code>client.responses.create</code>。Messages 必须换 Anthropic SDK 或改 header。</p>
<h3 id="系统提示角色内容模型">系统提示、角色、内容模型</h3>
<table>
	<thead>
			<tr>
					<th></th>
					<th>Chat Completions</th>
					<th>Responses</th>
					<th>Messages</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>系统提示</td>
					<td>message role <code>system</code> / <code>developer</code></td>
					<td>顶层 <code>instructions</code></td>
					<td>顶层 <code>system</code></td>
			</tr>
			<tr>
					<td>用户</td>
					<td><code>user</code></td>
					<td><code>input</code> 里 user message</td>
					<td><code>user</code></td>
			</tr>
			<tr>
					<td>助手</td>
					<td><code>assistant</code></td>
					<td><code>output</code> 里 <code>type: message</code></td>
					<td><code>assistant</code></td>
			</tr>
			<tr>
					<td>工具结果角色</td>
					<td><code>role: tool</code> + <code>tool_call_id</code></td>
					<td>item <code>type: function_call_output</code> + <code>call_id</code></td>
					<td>仍是 <code>user</code>，块类型 <code>tool_result</code></td>
			</tr>
			<tr>
					<td>内容单元</td>
					<td>string 或 <code>{type, ...}</code> part</td>
					<td>类型化 item；文本 part 叫 <code>input_text</code> / <code>output_text</code></td>
					<td>类型化 block：<code>text</code> / <code>tool_use</code> / <code>thinking</code></td>
			</tr>
	</tbody>
</table>
<p>Responses 的 item 模型和 Messages 的 content block 更像：都把 reasoning / tool call 从「一条 assistant message」里拆出来。Chat Completions 把这些粘在 <code>message</code> + <code>tool_calls</code> 上。</p>
<h3 id="采样与长度">采样与长度</h3>
<table>
	<thead>
			<tr>
					<th>参数</th>
					<th>Chat Completions</th>
					<th>Responses</th>
					<th>Messages</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>temperature</td>
					<td>0–2</td>
					<td>0–2</td>
					<td><strong>0–1</strong></td>
			</tr>
			<tr>
					<td>1.5 是否合法</td>
					<td>是</td>
					<td>是</td>
					<td>否，400</td>
			</tr>
			<tr>
					<td>输出上限</td>
					<td><code>max_completion_tokens</code></td>
					<td><code>max_output_tokens</code></td>
					<td><code>max_tokens</code>（必填）</td>
			</tr>
			<tr>
					<td>是否计入 thinking</td>
					<td>是</td>
					<td>是</td>
					<td>是</td>
			</tr>
			<tr>
					<td>多候选 <code>n</code></td>
					<td>有</td>
					<td>无</td>
					<td>无</td>
			</tr>
			<tr>
					<td>惩罚项</td>
					<td>presence / frequency</td>
					<td>无（当前 schema）</td>
					<td>无</td>
			</tr>
			<tr>
					<td>stop</td>
					<td><code>stop</code>，最多 4</td>
					<td>以当前文档为准</td>
					<td><code>stop_sequences</code></td>
			</tr>
	</tbody>
</table>
<p>移植最容易炸的两件事：Messages 漏 <code>max_tokens</code>；把 OpenAI 的 <code>temperature: 1.5</code> 打到 Claude。</p>
<h3 id="结构化输出-1">结构化输出</h3>
<table>
	<thead>
			<tr>
					<th></th>
					<th>Chat Completions</th>
					<th>Responses</th>
					<th>Messages</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>仅合法 JSON</td>
					<td><code>response_format: {type:&quot;json_object&quot;}</code></td>
					<td><code>text.format: {type:&quot;json_object&quot;}</code></td>
					<td>走 schema 形式</td>
			</tr>
			<tr>
					<td>带 schema</td>
					<td><code>response_format.json_schema</code></td>
					<td><code>text.format</code> + <code>json_schema</code></td>
					<td><code>output_config.format: {type:&quot;json_schema&quot;, schema:...}</code></td>
			</tr>
			<tr>
					<td>严格模式</td>
					<td><code>strict: true</code>（默认 false）</td>
					<td>同左，放在 <code>text.format</code> 里</td>
					<td>tool <code>strict: true</code> / output_config</td>
			</tr>
	</tbody>
</table>
<p>CC → Responses 只改字段位置，schema 不用重写。</p>
<h3 id="工具调用词汇">工具调用词汇</h3>
<p>循环相同：声明 → 模型吐调用 → 本地执行 → 结果作为下一轮输入。字段和落点不同。</p>
<table>
	<thead>
			<tr>
					<th></th>
					<th>Chat Completions</th>
					<th>Responses</th>
					<th>Messages</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>定义</td>
					<td><code>tools[].function.{name,parameters}</code></td>
					<td><code>tools[].{type:&quot;function&quot;, name, parameters}</code>（扁平）</td>
					<td><code>tools[].{name,input_schema}</code></td>
			</tr>
			<tr>
					<td>让模型决定</td>
					<td><code>&quot;auto&quot;</code></td>
					<td><code>&quot;auto&quot;</code></td>
					<td><code>{type:&quot;auto&quot;}</code></td>
			</tr>
			<tr>
					<td>强制用工具</td>
					<td><code>&quot;required&quot;</code></td>
					<td><code>&quot;required&quot;</code></td>
					<td><code>{type:&quot;any&quot;}</code></td>
			</tr>
			<tr>
					<td>禁止</td>
					<td><code>&quot;none&quot;</code></td>
					<td><code>&quot;none&quot;</code></td>
					<td><code>{type:&quot;none&quot;}</code></td>
			</tr>
			<tr>
					<td>调用落点</td>
					<td><code>message.tool_calls[]</code></td>
					<td><code>output[]</code> 里 <code>type: function_call</code></td>
					<td><code>content[]</code> 里 <code>tool_use</code></td>
			</tr>
			<tr>
					<td>参数类型</td>
					<td><code>arguments</code> <strong>字符串</strong></td>
					<td><code>arguments</code> <strong>字符串</strong></td>
					<td><code>input</code> <strong>对象</strong></td>
			</tr>
			<tr>
					<td>结果落点</td>
					<td><code>role: tool</code></td>
					<td><code>function_call_output</code> item</td>
					<td><code>user</code> + <code>tool_result</code></td>
			</tr>
			<tr>
					<td>关联 id</td>
					<td><code>tool_call_id</code></td>
					<td><code>call_id</code></td>
					<td><code>tool_use_id</code></td>
			</tr>
			<tr>
					<td>内置工具</td>
					<td>无</td>
					<td>web_search 等，一次请求内可连跑</td>
					<td>web_search / web_fetch 等（Anthropic 服务端工具）</td>
			</tr>
			<tr>
					<td>同请求内多步</td>
					<td>否，每步一次 HTTP</td>
					<td><strong>是</strong>（内置工具）；自定义 function 仍要回灌</td>
					<td>否，每步一次 HTTP</td>
			</tr>
	</tbody>
</table>
<p><code>any</code> ≈ <code>required</code>（必须调工具）。OpenAI 两套的 <code>arguments</code> 都是序列化 JSON 字符串；Anthropic 是已解析对象。网关漏转这个类型会让客户端二次 <code>JSON.parse</code> 或 TypeError。</p>
<h3 id="推理">推理</h3>
<table>
	<thead>
			<tr>
					<th></th>
					<th>Chat Completions</th>
					<th>Responses</th>
					<th>Messages</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>开关</td>
					<td><code>reasoning_effort</code></td>
					<td><code>reasoning.effort</code></td>
					<td><code>thinking</code></td>
			</tr>
			<tr>
					<td>露出思路</td>
					<td>弱</td>
					<td><code>reasoning.summary</code>；output 里独立 <code>reasoning</code> item</td>
					<td><code>thinking</code> block + <code>display</code></td>
			</tr>
			<tr>
					<td>多轮连续性</td>
					<td>你自己重发；GPT-5.4+ 带 tool 时 CC 受限</td>
					<td><code>previous_response_id</code> 或回放 reasoning item</td>
					<td>必须把 thinking 块原样带回</td>
			</tr>
			<tr>
					<td>与 tool 同用</td>
					<td>GPT-5.4+ 仅 <code>effort=none</code></td>
					<td>一等公民</td>
					<td>一等公民</td>
			</tr>
	</tbody>
</table>
<p>上限字段把 thinking + 可见文本算在一起。上限过小会只产出 thinking、正文为空。</p>
<h3 id="流式事件不能混解析">流式事件不能混解析</h3>
<table>
	<thead>
			<tr>
					<th></th>
					<th>Chat Completions</th>
					<th>Responses</th>
					<th>Messages</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>怎么开</td>
					<td><code>stream: true</code></td>
					<td><code>stream: true</code></td>
					<td><code>stream: true</code></td>
			</tr>
			<tr>
					<td>形态</td>
					<td><code>data: {chunk}</code> + <code>[DONE]</code></td>
					<td>带 <code>type</code> 的语义事件</td>
					<td><code>event:</code> + <code>data:</code> 成对</td>
			</tr>
			<tr>
					<td>取文本</td>
					<td><code>choices[0].delta.content</code></td>
					<td><code>event.type == &quot;response.output_text.delta&quot;</code> 的 <code>delta</code></td>
					<td><code>delta.text</code> 且 <code>type==text_delta</code></td>
			</tr>
			<tr>
					<td>usage</td>
					<td>默认不在中间包；<code>stream_options.include_usage</code></td>
					<td><code>response.completed</code> 上的完整对象</td>
					<td><code>message_start</code> 有 input，<code>message_delta</code> 有 output</td>
			</tr>
	</tbody>
</table>
<p>三套解码器不能共用。用 CC 解析器读 Responses 流会找不到 <code>choices</code>。</p>
<h3 id="状态">状态</h3>
<table>
	<thead>
			<tr>
					<th></th>
					<th>Chat Completions</th>
					<th>Responses</th>
					<th>Messages</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>默认</td>
					<td>无状态，重发 <code>messages</code></td>
					<td><code>store: true</code>，可链 <code>previous_response_id</code></td>
					<td>无状态，重发 <code>messages</code></td>
			</tr>
			<tr>
					<td>服务端会话</td>
					<td>无（除非自己存 completion id，能力弱）</td>
					<td>Conversations API + <code>previous_response_id</code></td>
					<td>无</td>
			</tr>
			<tr>
					<td>关掉存储</td>
					<td><code>store: false</code></td>
					<td><code>store: false</code> + 加密 reasoning 回放</td>
					<td>本来就不存</td>
			</tr>
	</tbody>
</table>
<p><code>previous_response_id</code> 省的是<strong>重传字节和 cache 友好性</strong>，不是免掉历史 token 账单。</p>
<h2 id="生态谁说哪种话">生态：谁说哪种话</h2>
<table>
	<thead>
			<tr>
					<th>提供方 / 客户端</th>
					<th>Chat Completions</th>
					<th>Responses</th>
					<th>Messages</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>OpenAI 官方</td>
					<td>支持，兼容标准</td>
					<td><strong>新功能主路径</strong></td>
					<td>无</td>
			</tr>
			<tr>
					<td>Azure OpenAI</td>
					<td>有</td>
					<td>有</td>
					<td>无</td>
			</tr>
			<tr>
					<td>Anthropic 官方</td>
					<td>无</td>
					<td>无</td>
					<td>原生</td>
			</tr>
			<tr>
					<td>DeepSeek</td>
					<td>主路径</td>
					<td>少</td>
					<td><code>.../anthropic</code></td>
			</tr>
			<tr>
					<td>Qwen DashScope</td>
					<td><code>compatible-mode/v1</code></td>
					<td>少</td>
					<td>部分网关转</td>
			</tr>
			<tr>
					<td>Moonshot / Kimi</td>
					<td>有</td>
					<td>少</td>
					<td>有</td>
			</tr>
			<tr>
					<td>MiniMax</td>
					<td>有</td>
					<td>少</td>
					<td><strong>推荐</strong></td>
			</tr>
			<tr>
					<td>GLM / 豆包 / ERNIE</td>
					<td>有 CC 兼容入口</td>
					<td>少</td>
					<td>少</td>
			</tr>
			<tr>
					<td>vLLM / SGLang / Ollama / LM Studio</td>
					<td>是</td>
					<td>部分开始加，覆盖面远小于 CC</td>
					<td>Ollama 等开始加</td>
			</tr>
			<tr>
					<td>Cursor / Cline / 多数 Chat UI</td>
					<td>是</td>
					<td>少</td>
					<td>否</td>
			</tr>
			<tr>
					<td>Codex CLI</td>
					<td>走 OpenAI 协议（新栈偏 Responses）</td>
					<td>视版本</td>
					<td>否</td>
			</tr>
			<tr>
					<td>Claude Code / Claude Desktop</td>
					<td>否</td>
					<td>否</td>
					<td><strong>是</strong></td>
			</tr>
			<tr>
					<td>LiteLLM 等网关</td>
					<td><code>/v1/chat/completions</code></td>
					<td><code>/v1/responses</code></td>
					<td><code>/v1/messages</code></td>
			</tr>
	</tbody>
</table>
<p>「OpenAI 兼容」在市面上几乎总是 Chat Completions，<strong>不等于</strong>实现了 Responses。内置工具、<code>previous_response_id</code>、语义流式事件、扁平 tools 定义，要逐项对文档。</p>
<p>LiteLLM 可以把 Messages 映射到 Responses：<code>messages</code> → <code>input</code>，<code>system</code> → <code>instructions</code>，<code>max_tokens</code> → <code>max_output_tokens</code>，<code>thinking</code> → <code>reasoning</code>。反向同样要处理 item ↔ block。</p>
<h2 id="转换陷阱">转换陷阱</h2>
<ol>
<li><strong>系统提示位置</strong>。CC 的 <code>role: system</code> → Responses 的 <code>instructions</code> 或 Messages 的 <code>system</code>。反向要塞回 <code>messages[0]</code>。</li>
<li><strong>读输出</strong>。<code>choices[0].message.content</code> / <code>output_text</code> / <code>content[0].text</code> 三套。Responses 的 <code>output[0]</code> 经常是 reasoning，不是文本。</li>
<li><strong>tools 套层</strong>。CC 有 <code>function</code> 包一层；Responses 和 Messages 都扁平。</li>
<li><strong>工具参数类型</strong>。两个 OpenAI 协议 <code>arguments</code> 是字符串；Anthropic <code>input</code> 是对象。</li>
<li><strong>工具结果角色</strong>。CC 用 <code>tool</code>；Responses 用 <code>function_call_output</code> item；Messages 仍是 <code>user</code> + <code>tool_result</code>。</li>
<li><strong>id 字段名</strong>。<code>tool_call_id</code> / <code>call_id</code> / <code>tool_use_id</code>。对不上就 400。</li>
<li><strong>max_tokens 必填</strong>。只有 Messages 强制。CC/Responses 可选，但字段名还不一样。</li>
<li><strong>temperature 量纲</strong>。1.5 在两条 OpenAI 协议合法，在 Anthropic 非法。</li>
<li><strong>流式解析器</strong>。三套事件完全不同。</li>
<li><strong>思考块必须回放</strong>。Messages 的 <code>thinking</code>、Responses 的 <code>reasoning</code> item，丢掉会拒或变笨。CC 没有对等的一等 item。</li>
<li><strong><code>response_format</code> vs <code>text.format</code> vs <code>output_config</code></strong>。结构化输出三个家。</li>
<li><strong>把 Responses 当「改个 URL 的 CC」</strong>。简单字符串 <code>input</code> 能跑；tools / 多轮 / 流式会在形状上炸掉。</li>
<li><strong><code>previous_response_id</code> 与兼容层</strong>。多数国内 CC 兼容层没有这个语义；链式状态一接就 404/忽略。</li>
<li><strong>header 与 base 后缀</strong>。OpenAI SDK base 带 <code>/v1</code>；Anthropic SDK base <strong>不要</strong>再拼 <code>/v1</code>。</li>
</ol>
<h2 id="相邻格式不计入三种">相邻格式（不计入三种）</h2>
<table>
	<thead>
			<tr>
					<th>格式</th>
					<th>端点</th>
					<th>用途</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>OpenAI Completions</td>
					<td><code>POST /v1/completions</code></td>
					<td>旧 prompt 补全，已 legacy</td>
			</tr>
			<tr>
					<td>Assistants API</td>
					<td><code>/v1/threads</code> 等</td>
					<td><strong>2026-08-26 sunset</strong>，迁 Responses + Conversations</td>
			</tr>
			<tr>
					<td>Gemini generateContent</td>
					<td><code>:generateContent</code></td>
					<td>Google 原生；另有官方 OpenAI 兼容层 <code>/v1beta/openai/</code>（走的是 CC 形状）</td>
			</tr>
			<tr>
					<td>Amazon Bedrock Converse</td>
					<td><code>Converse</code></td>
					<td>AWS 统一壳</td>
			</tr>
			<tr>
					<td>Ollama 原生</td>
					<td><code>/api/chat</code></td>
					<td>本地；同时提供 CC 兼容</td>
			</tr>
	</tbody>
</table>
<h2 id="怎么选">怎么选</h2>
<table>
	<thead>
			<tr>
					<th>场景</th>
					<th>选</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>跨厂商、国内 API、vLLM、现有 OpenAI SDK 聊天</td>
					<td>Chat Completions</td>
			</tr>
			<tr>
					<td>新做 OpenAI 自家 agent、内置工具、MCP、推理连续性、GPT-6 tool calling</td>
					<td>Responses</td>
			</tr>
			<tr>
					<td>Claude Code / Anthropic SDK / MiniMax 完整 agent</td>
					<td>Messages</td>
			</tr>
			<tr>
					<td>已有稳定 CC 代码、无新需求</td>
					<td>继续 CC，不必迁</td>
			</tr>
			<tr>
					<td>还在 Assistants API</td>
					<td>必须在 2026-08-26 前迁 Responses，不是迁 CC</td>
			</tr>
			<tr>
					<td>要同时接三种客户端</td>
					<td>网关三端点并行：<code>/v1/chat/completions</code>、<code>/v1/responses</code>、<code>/v1/messages</code></td>
			</tr>
	</tbody>
</table>
<p>自建中枢时：用 <strong>类型化 item/block</strong>（Responses item 或 Messages content block）做内部表示。用 CC 的 <code>messages</code> 当中枢会丢掉 reasoning / thinking / 内置工具调用。</p>
<h2 id="三格式最小请求并排">三格式最小请求并排</h2>
<p>Chat Completions：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl https://api.openai.com/v1/chat/completions <span class="se">\
</span></span></span><span class="line"><span class="cl">  -H <span class="s2">&#34;Authorization: Bearer </span><span class="nv">$OPENAI_API_KEY</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -H <span class="s2">&#34;Content-Type: application/json&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;model&#34;: &#34;gpt-4.1&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;messages&#34;: [
</span></span></span><span class="line"><span class="cl"><span class="s1">      {&#34;role&#34;: &#34;system&#34;, &#34;content&#34;: &#34;你是助手。&#34;},
</span></span></span><span class="line"><span class="cl"><span class="s1">      {&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;ping&#34;}
</span></span></span><span class="line"><span class="cl"><span class="s1">    ]
</span></span></span><span class="line"><span class="cl"><span class="s1">  }&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Responses：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl https://api.openai.com/v1/responses <span class="se">\
</span></span></span><span class="line"><span class="cl">  -H <span class="s2">&#34;Authorization: Bearer </span><span class="nv">$OPENAI_API_KEY</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -H <span class="s2">&#34;Content-Type: application/json&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;model&#34;: &#34;gpt-5.5&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;instructions&#34;: &#34;你是助手。&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;input&#34;: &#34;ping&#34;
</span></span></span><span class="line"><span class="cl"><span class="s1">  }&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Messages：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl https://api.anthropic.com/v1/messages <span class="se">\
</span></span></span><span class="line"><span class="cl">  -H <span class="s2">&#34;x-api-key: </span><span class="nv">$ANTHROPIC_API_KEY</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -H <span class="s2">&#34;anthropic-version: 2023-06-01&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -H <span class="s2">&#34;Content-Type: application/json&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;model&#34;: &#34;claude-sonnet-4-6&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;max_tokens&#34;: 1024,
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;system&#34;: &#34;你是助手。&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;messages&#34;: [{&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;ping&#34;}]
</span></span></span><span class="line"><span class="cl"><span class="s1">  }&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="官方文档">官方文档</h2>
<ul>
<li>Chat Completions：<a href="https://developers.openai.com/api/reference/resources/chat">https://developers.openai.com/api/reference/resources/chat</a></li>
<li>Responses：<a href="https://developers.openai.com/api/reference/resources/responses">https://developers.openai.com/api/reference/resources/responses</a></li>
<li>从 CC 迁 Responses：<a href="https://platform.openai.com/docs/guides/migrate-to-responses">https://platform.openai.com/docs/guides/migrate-to-responses</a></li>
<li>Responses 流式事件：<a href="https://developers.openai.com/api/reference/resources/responses/streaming-events">https://developers.openai.com/api/reference/resources/responses/streaming-events</a></li>
<li>Function calling（两套 OpenAI 形状）：<a href="https://developers.openai.com/api/docs/guides/function-calling">https://developers.openai.com/api/docs/guides/function-calling</a></li>
<li>Anthropic Messages：<a href="https://platform.claude.com/docs/en/api/http/messages/create">https://platform.claude.com/docs/en/api/http/messages/create</a></li>
<li>Anthropic 流式：<a href="https://docs.claude.com/en/docs/build-with-claude/streaming">https://docs.claude.com/en/docs/build-with-claude/streaming</a></li>
<li>Anthropic Prompt cache：<a href="https://docs.claude.com/en/docs/build-with-claude/prompt-caching">https://docs.claude.com/en/docs/build-with-claude/prompt-caching</a></li>
<li>参数对照（含 CC / Responses / Messages）：<a href="https://hidekazu-konishi.com/entry/llm_api_parameter_compatibility_reference.html">https://hidekazu-konishi.com/entry/llm_api_parameter_compatibility_reference.html</a></li>
</ul>
<p>字段名、temperature 是否还接受、thinking 档位、哪代模型强制走 Responses 做 tool calling，随模型代际会变。对接前以各家当前 API reference 为准。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
