<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arga Prayoga</title>
    <description>The latest articles on DEV Community by Arga Prayoga (@f0und404).</description>
    <link>https://dev.to/f0und404</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3934078%2F5160262c-0632-4db5-a7c6-b8eb6c2abd5b.png</url>
      <title>DEV Community: Arga Prayoga</title>
      <link>https://dev.to/f0und404</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/f0und404"/>
    <language>en</language>
    <item>
      <title>Stop Guessing Your AI Client Settings: Chat Completions vs. Anthropic Messages vs. Responses API</title>
      <dc:creator>Arga Prayoga</dc:creator>
      <pubDate>Wed, 11 Nov 2026 11:00:59 +0000</pubDate>
      <link>https://dev.to/f0und404/stop-guessing-your-ai-client-settings-chat-completions-vs-anthropic-messages-vs-responses-api-3pi8</link>
      <guid>https://dev.to/f0und404/stop-guessing-your-ai-client-settings-chat-completions-vs-anthropic-messages-vs-responses-api-3pi8</guid>
      <description>&lt;p&gt;If you have ever configured an AI coding assistant, local agent, or LLM gateway (like OpenCode, Cline, Cursor, or LiteLLM), you have probably stared at a settings screen that looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjzw8codvrr1xmg2wzlb4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjzw8codvrr1xmg2wzlb4.png" alt="AI Client Provider Configuration — Base URL &amp;amp; API Format" width="799" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most developers pick &lt;code&gt;Chat completions&lt;/code&gt; by muscle memory, cross their fingers, and hope it works. When it throws a &lt;code&gt;404 Not Found&lt;/code&gt; or &lt;code&gt;401 Unauthorized&lt;/code&gt;, debugging feels like guesswork.&lt;/p&gt;

&lt;p&gt;Once you understand how &lt;strong&gt;Base URL&lt;/strong&gt; and &lt;strong&gt;API Format&lt;/strong&gt; work together—and why three incompatible JSON dialects exist—you will never misconfigure an AI client again.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Core Formula: &lt;code&gt;Base URL&lt;/code&gt; + &lt;code&gt;API Format&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Think of your AI client settings as a two-part URL builder combined with a JSON translator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Full Request URL = Base URL + API Format Path
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, if you set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Base URL:&lt;/strong&gt; &lt;code&gt;https://opencode.ai/zen/go/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Format:&lt;/strong&gt; &lt;code&gt;Chat completions (/chat/completions)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your client fires an HTTP &lt;code&gt;POST&lt;/code&gt; request to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://opencode.ai/zen/go/v1/chat/completions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks trivial until you switch formats. Notice how the second option in many clients includes &lt;code&gt;/v1&lt;/code&gt; in its path (&lt;code&gt;/v1/messages&lt;/code&gt;). If your Base URL &lt;em&gt;already&lt;/em&gt; ends with &lt;code&gt;/v1&lt;/code&gt;, naive clients concatenate them into a broken path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ https://opencode.ai/zen/go/v1/v1/messages   (404 Not Found)
✅ https://opencode.ai/zen/go/v1/messages      (or remove /v1 from Base URL)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More importantly, &lt;strong&gt;API Format does not just change the URL path&lt;/strong&gt;. It completely changes the &lt;strong&gt;authentication headers&lt;/strong&gt;, &lt;strong&gt;JSON request body&lt;/strong&gt;, &lt;strong&gt;JSON response shape&lt;/strong&gt;, and &lt;strong&gt;Server-Sent Events (SSE) streaming structure&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Dialect #1: &lt;code&gt;Chat completions (/chat/completions)&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The "USB-C" of LLM APIs
&lt;/h3&gt;

&lt;p&gt;Originally introduced by OpenAI, &lt;code&gt;/chat/completions&lt;/code&gt; became the &lt;em&gt;de facto&lt;/em&gt; universal standard of the AI ecosystem. Almost every model provider and local inference engine exposes an OpenAI-compatible endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Gateways &amp;amp; Inference:&lt;/strong&gt; OpenRouter, Groq, DeepSeek, Together AI, Mistral&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemini (Compatibility Mode):&lt;/strong&gt; &lt;code&gt;https://generativelanguage.googleapis.com/v1beta/openai/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Engines:&lt;/strong&gt; Ollama (&lt;code&gt;http://localhost:11434/v1&lt;/code&gt;), vLLM, LM Studio, llama.cpp&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How It Looks Under the Hood
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auth Header:&lt;/strong&gt; &lt;code&gt;Authorization: Bearer &amp;lt;API_KEY&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Model:&lt;/strong&gt; Stateless. Your client must resend the entire conversation history on every turn inside the &lt;code&gt;messages&lt;/code&gt; array.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System Prompt:&lt;/strong&gt; Placed inside &lt;code&gt;messages&lt;/code&gt; with &lt;code&gt;"role": "system"&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;
&lt;span class="n"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bearer&lt;/span&gt; &lt;span class="n"&gt;sk&lt;/span&gt;&lt;span class="err"&gt;-...&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"gpt-4o"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"You are a concise code reviewer."&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Review this SQL query for injection."&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"temperature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to Pick It
&lt;/h3&gt;

&lt;p&gt;Choose &lt;code&gt;Chat completions&lt;/code&gt; as your &lt;strong&gt;default&lt;/strong&gt; for 90% of proxies, open-weight models (Llama, Qwen, DeepSeek), and local Ollama setups.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Dialect #2: &lt;code&gt;Anthropic messages (/v1/messages)&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why Anthropic Refused to Copy OpenAI
&lt;/h3&gt;

&lt;p&gt;Anthropic designed its &lt;code&gt;/v1/messages&lt;/code&gt; protocol with stricter structural guarantees and native support for Claude-specific features like &lt;strong&gt;Prompt Caching&lt;/strong&gt; and &lt;strong&gt;Extended Thinking&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you send an OpenAI-formatted JSON body to a native Anthropic endpoint, the server rejects it immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Differs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auth Headers:&lt;/strong&gt; Uses &lt;code&gt;x-api-key: &amp;lt;API_KEY&amp;gt;&lt;/code&gt; and requires an explicit version header (&lt;code&gt;anthropic-version: 2023-06-01&lt;/code&gt;) instead of &lt;code&gt;Bearer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System Prompt:&lt;/strong&gt; Moved out of &lt;code&gt;messages&lt;/code&gt; into a dedicated top-level &lt;code&gt;"system"&lt;/code&gt; field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;max_tokens&lt;/code&gt; is Mandatory:&lt;/strong&gt; Unlike OpenAI (where it is optional), Anthropic returns a &lt;code&gt;400 Bad Request&lt;/code&gt; if &lt;code&gt;max_tokens&lt;/code&gt; is omitted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Calling Shape:&lt;/strong&gt; Uses structured &lt;code&gt;tool_use&lt;/code&gt; and &lt;code&gt;tool_result&lt;/code&gt; content blocks rather than OpenAI's &lt;code&gt;tool_calls&lt;/code&gt; array.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sk&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="err"&gt;-...&lt;/span&gt;
&lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2023-06-01&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"claude-3-7-sonnet-latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"max_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"You are a concise code reviewer."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Review this SQL query for injection."&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to Pick It
&lt;/h3&gt;

&lt;p&gt;Pick &lt;code&gt;Anthropic messages&lt;/code&gt; when:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connecting directly to &lt;code&gt;https://api.anthropic.com&lt;/code&gt; (make sure your Base URL doesn't duplicate &lt;code&gt;/v1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Using a multi-provider gateway (like OpenCode Zen or LiteLLM) with Claude models and you want &lt;strong&gt;native prompt caching&lt;/strong&gt; or &lt;strong&gt;thinking blocks&lt;/strong&gt; preserved without lossy translation.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  4. Dialect #3: &lt;code&gt;Responses (/responses)&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenAI's Next-Gen Agentic Protocol
&lt;/h3&gt;

&lt;p&gt;As models shifted from simple chatbots to autonomous reasoning agents (like OpenAI's o-series, GPT-5, and Codex models), &lt;code&gt;/chat/completions&lt;/code&gt; started showing its age. Resending massive JSON arrays on every tool-call loop wastes bandwidth, and stateless turns make server-side reasoning token caching awkward.&lt;/p&gt;

&lt;p&gt;Enter the &lt;strong&gt;Responses API (&lt;code&gt;/responses&lt;/code&gt;)&lt;/strong&gt;—OpenAI's unified interface designed for multi-step, agentic workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Differs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auth Header:&lt;/strong&gt; Still uses &lt;code&gt;Authorization: Bearer &amp;lt;API_KEY&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;input&lt;/code&gt; Instead of &lt;code&gt;messages&lt;/code&gt;:&lt;/strong&gt; Accepts either a raw string for simple prompts or a flexible array of input items.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;instructions&lt;/code&gt; for System Guidance:&lt;/strong&gt; Top-level &lt;code&gt;"instructions"&lt;/code&gt; replaces the &lt;code&gt;"role": "system"&lt;/code&gt; message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-Side State (&lt;code&gt;previous_response_id&lt;/code&gt;):&lt;/strong&gt; Every response returns a unique ID (e.g., &lt;code&gt;resp_abc123&lt;/code&gt;). Sending &lt;code&gt;previous_response_id&lt;/code&gt; on your next call chains conversation state natively on the server—no need to resend full chat history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in Tools &amp;amp; Reasoning Items:&lt;/strong&gt; First-class support for server-executed tools (web search, file search, code interpreter) and structured reasoning traces.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;
&lt;span class="n"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bearer&lt;/span&gt; &lt;span class="n"&gt;sk&lt;/span&gt;&lt;span class="err"&gt;-...&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"gpt-5-codex"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"You are a concise code reviewer."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Review this SQL query for injection."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"previous_response_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"resp_01abc..."&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Hidden Gotcha with &lt;code&gt;previous_response_id&lt;/code&gt;:&lt;/strong&gt; While &lt;code&gt;previous_response_id&lt;/code&gt; carries forward your conversation history, top-level &lt;code&gt;instructions&lt;/code&gt; do &lt;strong&gt;not&lt;/strong&gt; automatically persist across chained turns. Always resend &lt;code&gt;instructions&lt;/code&gt; on every request if your agent relies on strict system rules or JSON schemas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  When to Pick It
&lt;/h3&gt;

&lt;p&gt;Pick &lt;code&gt;Responses&lt;/code&gt; when running modern OpenAI reasoning/Codex models directly or through a gateway that explicitly supports the &lt;code&gt;/responses&lt;/code&gt; specification. Do &lt;strong&gt;not&lt;/strong&gt; pick it for Ollama or standard open-weight proxies unless they explicitly advertise &lt;code&gt;/responses&lt;/code&gt; support.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Quick Reference Cheat Sheet
&lt;/h2&gt;

&lt;p&gt;Bookmark this table the next time you configure an AI client:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;&lt;code&gt;Chat completions&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;Anthropic messages&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;Responses&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Endpoint Path&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/chat/completions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/messages&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/responses&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth Header&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Authorization: Bearer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;x-api-key&lt;/code&gt; + &lt;code&gt;anthropic-version&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Authorization: Bearer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;System Prompt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inside &lt;code&gt;messages&lt;/code&gt; (&lt;code&gt;role: system&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Top-level &lt;code&gt;"system"&lt;/code&gt; field&lt;/td&gt;
&lt;td&gt;Top-level &lt;code&gt;"instructions"&lt;/code&gt; field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt Field&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;messages&lt;/code&gt; (array)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;messages&lt;/code&gt; (array)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;input&lt;/code&gt; (string or item array)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optional (&lt;code&gt;max_output_tokens&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;State Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stateless (resend history)&lt;/td&gt;
&lt;td&gt;Stateless (resend history)&lt;/td&gt;
&lt;td&gt;Stateful option (&lt;code&gt;previous_response_id&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best Used For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Universal default (Ollama, Groq, OpenRouter, Gemini)&lt;/td&gt;
&lt;td&gt;Native Claude (Prompt Caching, Thinking)&lt;/td&gt;
&lt;td&gt;Modern OpenAI / Codex agentic &amp;amp; reasoning models&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3 Common Mistakes That Break Your Setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Double &lt;code&gt;/v1&lt;/code&gt; Trap:&lt;/strong&gt; Pasting &lt;code&gt;https://proxy.example.com/v1&lt;/code&gt; into &lt;strong&gt;Base URL&lt;/strong&gt; while selecting &lt;code&gt;/v1/messages&lt;/code&gt; often triggers a silent &lt;code&gt;/v1/v1/messages&lt;/code&gt; 404 error. Check your client's URL normalization behavior—or strip &lt;code&gt;/v1&lt;/code&gt; from the Base URL if it fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thinking "Error 400" Means a Bad API Key:&lt;/strong&gt; If you get a &lt;code&gt;400 Bad Request&lt;/code&gt; mentioning &lt;code&gt;messages&lt;/code&gt;, &lt;code&gt;input&lt;/code&gt;, or &lt;code&gt;max_tokens is required&lt;/code&gt;, your API key is fine—your &lt;strong&gt;API Format&lt;/strong&gt; dropdown simply doesn't match what the server expects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broken Streaming in IDE:&lt;/strong&gt; Even if a "Test Connection" ping succeeds, picking the wrong format causes IDE chat panes to freeze or print raw JSON because SSE chunk schemas (&lt;code&gt;choices[0].delta&lt;/code&gt; vs. &lt;code&gt;content_block_delta&lt;/code&gt; vs. &lt;code&gt;response.output_text.delta&lt;/code&gt;) are completely incompatible across the three dialects.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Rule of Thumb
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Using &lt;strong&gt;Ollama, DeepSeek, Groq, Gemini, or OpenRouter&lt;/strong&gt;? Use &lt;strong&gt;&lt;code&gt;Chat completions&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Using &lt;strong&gt;Claude directly&lt;/strong&gt; (or via a Claude-native gateway)? Use &lt;strong&gt;&lt;code&gt;Anthropic messages&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Using &lt;strong&gt;modern OpenAI / Codex models&lt;/strong&gt; with stateful reasoning? Use &lt;strong&gt;&lt;code&gt;Responses&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which API format has given you the biggest debugging headache—or which gateway trick do you use in your setup? Drop a comment below!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
