<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.litellm.ai/en/blog</id>
    <title>liteLLM Blog</title>
    <updated>2026-07-13T12:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://docs.litellm.ai/en/blog"/>
    <subtitle>liteLLM Blog</subtitle>
    <icon>https://docs.litellm.ai/en/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Auto Router v2: one router for complexity, semantic, and adaptive routing]]></title>
        <id>https://docs.litellm.ai/en/blog/autorouter-v2</id>
        <link href="https://docs.litellm.ai/en/blog/autorouter-v2"/>
        <updated>2026-07-13T12:00:00.000Z</updated>
        <summary type="html"><![CDATA[Auto Router v2 folds LiteLLM's complexity, semantic, and adaptive routers into a single router with an LLM classifier, keyword tiers, multi-model pools, and adaptive Thompson sampling.]]></summary>
        <content type="html"><![CDATA[<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Availability</div><div class="admonitionContent_BuS1"><p>Auto Router v2 ships in <strong>v1.94.x</strong>. The earliest dev release cuts <strong>Tuesday, 2026-07-14</strong>. Suggestions and feedback: <a href="https://github.com/BerriAI/litellm/discussions/32168" target="_blank" rel="noopener noreferrer">discussion #32168</a>.</p></div></div>
<p>Auto Router v2 collapses complexity, semantic, and adaptive routing into a single <code>auto_router/complexity_router</code>. One config now covers heuristic scoring, LLM classification, lexical or semantic keyword rules, and Thompson-sampled tier pools.</p>
<p>The push came from the community. On <a href="https://github.com/BerriAI/litellm/discussions/32168" target="_blank" rel="noopener noreferrer">discussion #32168</a>, users pointed out that all three routing strategies should converge into a single Auto Router. One router with configurable signals and weights keeps the API simple while letting the routing engine evolve internally, instead of forcing you to pick a mode up front.</p>
<p>The operational half came from <a href="https://github.com/BerriAI/litellm/discussions/32172" target="_blank" rel="noopener noreferrer">discussion #32172</a>: predictable beats clever for debuggability. A fixed, versioned mapping from capability class to model is what makes "why did this response cost 4x today" answerable after the fact.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-v2-adds">What v2 adds<a href="https://docs.litellm.ai/en/blog/autorouter-v2#what-v2-adds" class="hash-link" aria-label="Direct link to What v2 adds" title="Direct link to What v2 adds">​</a></h2>
<table><thead><tr><th>Capability</th><th>Before</th><th>After</th></tr></thead><tbody><tr><td>Classification</td><td>Heuristic scorer only</td><td>Heuristic, LLM classifier, lexical or semantic keyword rules (<a href="https://github.com/BerriAI/litellm/pull/32169" target="_blank" rel="noopener noreferrer">#32169</a>, <a href="https://github.com/BerriAI/litellm/pull/32859" target="_blank" rel="noopener noreferrer">#32859</a>)</td></tr><tr><td>Tier value</td><td>One model per tier</td><td>One model, random-pick pool, or Thompson-sampled pool (<a href="https://github.com/BerriAI/litellm/pull/32967" target="_blank" rel="noopener noreferrer">#32967</a>, <a href="https://github.com/BerriAI/litellm/pull/32947" target="_blank" rel="noopener noreferrer">#32947</a>)</td></tr><tr><td>Technical keywords</td><td>Fixed built-in list</td><td><code>custom_technical_keywords</code> appends without replacing (<a href="https://github.com/BerriAI/litellm/pull/32262" target="_blank" rel="noopener noreferrer">#32262</a>)</td></tr><tr><td>Decision log</td><td>"keyword rule fired"</td><td><code>cause=literal_keyword_match | semantic_keyword_match | complexity_scorer</code> (<a href="https://github.com/BerriAI/litellm/pull/32943" target="_blank" rel="noopener noreferrer">#32943</a>)</td></tr><tr><td>Alias <code>litellm_params</code></td><td>Silently dropped</td><td>Merged into outbound request (<a href="https://github.com/BerriAI/litellm/pull/32974" target="_blank" rel="noopener noreferrer">#32974</a>)</td></tr><tr><td>Session affinity</td><td>Reclassified every turn</td><td>Opt-in <code>session_affinity</code>: pin the first-turn model for the session, skip reclassification (<a href="https://github.com/BerriAI/litellm/pull/33126" target="_blank" rel="noopener noreferrer">#33126</a>)</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="one-config-all-the-knobs">One config, all the knobs<a href="https://docs.litellm.ai/en/blog/autorouter-v2#one-config-all-the-knobs" class="hash-link" aria-label="Direct link to One config, all the knobs" title="Direct link to One config, all the knobs">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> smart</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">router</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> auto_router/complexity_router</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">drop_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">complexity_router_config</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">tiers</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token key atrule">SIMPLE</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"gpt-4o-mini"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"claude-haiku-4-5"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain">   </span><span class="token comment" style="color:rgb(0, 128, 0)"># random-pick pool</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token key atrule">MEDIUM</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">    gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4o                                 </span><span class="token comment" style="color:rgb(0, 128, 0)"># single pin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token key atrule">COMPLEX</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">   claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token key atrule">REASONING</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5.5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)"># optional: LLM classifier instead of heuristic scorer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">classifier_type</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> llm</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">classifier_llm_config</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">haiku</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">20251001</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token key atrule">timeout_ms</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">2000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)"># optional: keyword rules, escalate to highest matched tier</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">keyword_tier_rules</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">keywords</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"hi"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"hello"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"thanks"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            </span><span class="token key atrule">tier</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> SIMPLE</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">keywords</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"kubernetes"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"k8s"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"istio"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            </span><span class="token key atrule">tier</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> REASONING</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">semantic_keyword_matching</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">embedding_model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> voyage</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">3</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">match_threshold</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0.5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)"># optional: append to the built-in technical keyword list</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">custom_technical_keywords</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">kafka</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> redis</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> postgresql</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> udp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> dns</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)"># optional: Thompson-sample within the tier's pool</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">adaptive</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)"># optional: pin a session to its first-turn model (preserves prompt cache)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">session_affinity</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">session_affinity_ttl_seconds</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">3600</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">complexity_router_default_model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notes-on-the-new-pieces">Notes on the new pieces<a href="https://docs.litellm.ai/en/blog/autorouter-v2#notes-on-the-new-pieces" class="hash-link" aria-label="Direct link to Notes on the new pieces" title="Direct link to Notes on the new pieces">​</a></h2>
<p><strong>LLM classifier</strong> goes through the same <code>Router</code> instance, so credentials, budgets, and fallbacks apply. Timeout, empty content, or schema mismatch falls back to the heuristic scorer.</p>
<p><strong>Keyword rules</strong> run before the scorer. Multiple matches escalate to the highest tier (SIMPLE &lt; MEDIUM &lt; COMPLEX &lt; REASONING), so rule order does not silently change behavior. Semantic matching uses MAX aggregation (was MEAN), so one strong keyword match is not diluted by other utterances on the tier.</p>
<p><strong>Adaptive</strong> turns tier pools into learning pools. Cold requests sample only inside the classified tier instead of collapsing on the cheapest model. Feedback attributes back to the model that actually served the previous turn, even when stateless routing picks a different one this turn.</p>
<p><strong>Session affinity</strong> (opt-in) pins the first-turn model for a session and skips reclassification on later turns, so provider-side prompt caches keyed to that model do not get invalidated when a follow-up ("thanks!") would otherwise classify into a different tier (<a href="https://github.com/BerriAI/litellm/pull/33126" target="_blank" rel="noopener noreferrer">#33126</a>). TTL defaults to 3600s. <code>session_id</code> comes from request metadata.</p>
<p><strong>Decision log</strong> emits one greppable line per request:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">ComplexityRouter: routing decision cause=complexity_scorer,      tier=SIMPLE,     score=-0.150, signals=['short (7 tokens)', 'simple (what is)'], routed_model=gpt-4o-mini</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">ComplexityRouter: routing decision cause=literal_keyword_match,  tier=REASONING,                                                                    routed_model=gpt-5.5</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">ComplexityRouter: routing decision cause=semantic_keyword_match, tier=REASONING,                                                                    routed_model=gpt-5.5</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">ComplexityRouter: routing decision cause=session_affinity_pin,                                                                                      routed_model=gpt-5.5</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="fixes-worth-calling-out">Fixes worth calling out<a href="https://docs.litellm.ai/en/blog/autorouter-v2#fixes-worth-calling-out" class="hash-link" aria-label="Direct link to Fixes worth calling out" title="Direct link to Fixes worth calling out">​</a></h2>
<p><code>drop_params</code>, <code>cache_control_injection_points</code>, and any other <code>litellm_params</code> set on the auto router alias itself used to vanish when the router picked a tier. They now merge into the outbound request, without overriding anything the caller passed explicitly (<a href="https://github.com/BerriAI/litellm/pull/32974" target="_blank" rel="noopener noreferrer">#32974</a>). Same PR fixes an Anthropic <code>/v1/messages</code> to Responses API <code>tool_choice</code> shape bug that broke Bedrock-backed complexity routers (reported in <a href="https://github.com/BerriAI/litellm/discussions/32168" target="_blank" rel="noopener noreferrer">discussion #32168</a> by @icsy7867).</p>
<p>UI got a working Test Connection per tier (<a href="https://github.com/BerriAI/litellm/pull/32950" target="_blank" rel="noopener noreferrer">#32950</a>) and required-tier inline validation (<a href="https://github.com/BerriAI/litellm/pull/32978" target="_blank" rel="noopener noreferrer">#32978</a>).</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="try-it">Try it<a href="https://docs.litellm.ai/en/blog/autorouter-v2#try-it" class="hash-link" aria-label="Direct link to Try it" title="Direct link to Try it">​</a></h2>
<p>Existing complexity router configs keep working. To try v2, add <code>keyword_tier_rules</code>, <code>classifier_type: llm</code>, <code>adaptive: true</code>, <code>session_affinity: true</code>, or a list value on a tier to your existing <code>complexity_router_config</code>. Full reference on the <a href="https://docs.litellm.ai/en/docs/proxy/auto_routing">Auto Routing docs page</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next<a href="https://docs.litellm.ai/en/blog/autorouter-v2#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next">​</a></h2>
<p><strong>Router plugins.</strong> From <a href="https://github.com/BerriAI/litellm/discussions/32168" target="_blank" rel="noopener noreferrer">discussion #32168</a>: a pipeline where each plugin receives the routing context, enriches it, and passes it on before Auto Router makes the final call. Plugins do not replace the router; they contribute structured signals (classification, policies, candidate filters, scores) that Auto Router combines.</p>
<p>Concrete end-to-end:</p>
<ol>
<li>User sends a request.</li>
<li>Language plugin detects <code>en</code>.</li>
<li>Domain classifier labels it <code>coding</code> with 0.93 confidence.</li>
<li>Tenant policy limits allowed providers to OpenAI and Anthropic.</li>
<li>Budget plugin removes models exceeding the tenant's cost cap.</li>
<li>Auto Router picks the best remaining model from the enriched context.</li>
</ol>
<p>Config sketch:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">router_settings</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token key atrule">plugins</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> language</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">detector</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> domain</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">classifier</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">provider</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> openai/gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">mini</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> budget</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">policy</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">daily_limit</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> tenant</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">policy</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> custom</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">python</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> ./plugins/my_router.py</span><br></span></code></pre></div></div>
<p>The initial work landed in <a href="https://github.com/BerriAI/litellm/pull/32972" target="_blank" rel="noopener noreferrer">#32972</a>; support for plugins on the proxy, and custom plugin files will be next.</p>
<p><strong>Also on the list:</strong></p>
<ul>
<li><strong>Escalation ceilings on fallback chains.</strong> Per-request cap on escalations plus a cooldown once a key walks the chain N times, so a bad upstream cannot cascade into a bill.</li>
<li><strong>Attributable decisions.</strong> Stamp the routed model and routing-table version on every response, and export structured decision traces (candidates, scores, fallbacks, latency) through the standard logging integrations.</li>
</ul>
<p>Running Auto Router in production and hitting these? Drop a note on <a href="https://github.com/BerriAI/litellm/discussions/32168" target="_blank" rel="noopener noreferrer">discussion #32168</a>.</p>]]></content>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <category label="routing" term="routing"/>
        <category label="complexity-router" term="complexity-router"/>
        <category label="semantic-router" term="semantic-router"/>
        <category label="adaptive" term="adaptive"/>
        <category label="product" term="product"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Incident Report: Prompt Cache Invalidation for Claude Code on Bedrock Invoke]]></title>
        <id>https://docs.litellm.ai/en/blog/bedrock-invoke-prompt-caching-incident</id>
        <link href="https://docs.litellm.ai/en/blog/bedrock-invoke-prompt-caching-incident"/>
        <updated>2026-07-13T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[Date: July 4 to July 10, 2026]]></summary>
        <content type="html"><![CDATA[<p><strong>Date:</strong> July 4 to July 10, 2026<br>
<strong>Affected versions:</strong> <code>v1.91.0</code> and <code>v1.91.1</code><br>
<strong>Severity:</strong> Medium (silent cost regression; no correctness impact)<br>
<strong>Status:</strong> Resolved in <code>v1.91.2</code></p>
<blockquote>
<p><strong>Note:</strong> If you run Claude Code against Amazon Bedrock through LiteLLM on either <code>v1.91.0</code> or <code>v1.91.1</code>, upgrade to <code>v1.91.2</code> or higher.</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="https://docs.litellm.ai/en/blog/bedrock-invoke-prompt-caching-incident#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
<p>Between July 4 and July 10, proxies running <code>v1.91.0</code> or <code>v1.91.1</code> silently broke Anthropic prompt caching for Claude Code sessions routed through Amazon Bedrock's Invoke API. For the customers who reported it, warm-session cache hit rates dropped from roughly 90% to 25-45% and team daily spend rose 2-3x for the same usage. Requests kept returning 200s with correct completions; the only symptoms were the cache miss rate and the bill.</p>
<p>The cause: <a href="https://github.com/BerriAI/litellm/pull/31364" target="_blank" rel="noopener noreferrer">PR #31364</a> moved every <code>role: "system"</code> entry in <code>messages</code> into the top-level <code>system</code> field on the Invoke path, which invalidates every cache breakpoint past the tool definitions and system prompt. The fix shipped July 10 in <code>v1.91.2</code> (<a href="https://github.com/BerriAI/litellm/pull/32578" target="_blank" rel="noopener noreferrer">#32578</a>, <a href="https://github.com/BerriAI/litellm/pull/32831" target="_blank" rel="noopener noreferrer">#32831</a>, <a href="https://github.com/BerriAI/litellm/pull/32882" target="_blank" rel="noopener noreferrer">#32882</a>), with regression tests that fail on pre-fix code.</p>
<p>We own this outcome entirely. The trigger was a poorly documented change in how new Claude models and Claude Code use system messages, but customers run a gateway precisely so they do not have to track provider quirks. Translating requests faithfully, including their caching semantics, is our core job and here we fell short. This post explains exactly what happened, why our testing and review failed to catch it, and what we have changed so this class of regression does not ship again.</p>
<!-- -->
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="background">Background<a href="https://docs.litellm.ai/en/blog/bedrock-invoke-prompt-caching-incident#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2>
<p>Three facts set up the incident:</p>
<ol>
<li><strong>Claude prompt caching is prefix based:</strong>
<ol>
<li>the pricing of tokens in increasing cost is:<!-- -->
<ol>
<li>cache read (0.1x)</li>
<li>normal write (1x)</li>
<li>cache write (1.25x for 5m ttl, 2x for 1h ttl)</li>
</ol>
</li>
<li>when Claude Code makes a new request, the Bedrock provider checks if any previous request was a truncated prefix of the current request. If so, it reads from the cache only up to that point.</li>
</ol>
</li>
<li><strong>Mid-conversation system messages are new:</strong>
<ol>
<li>On May 28, 2026, Claude Opus 4.8 shipped as the first model accepting <code>role: "system"</code> entries inside <code>messages</code> (<a href="https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages" target="_blank" rel="noopener noreferrer">docs</a>). This was documented on the Claude API docs <a href="https://web.archive.org/web/20260528184320/https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages" target="_blank" rel="noopener noreferrer">on the same day</a>.</li>
<li>Claude Code (<code>v2.1.154</code>) began emitting them on May 28, 2026, with no mention in its changelog.</li>
<li>Bedrock documented the same support by <a href="https://web.archive.org/web/20260609182343/https://docs.aws.amazon.com/bedrock/latest/userguide/claude-messages-mid-conversation-system.html" target="_blank" rel="noopener noreferrer">June 9, 2026</a> at the latest (the first archive.org capture; the page may have appeared as early as May 28).</li>
</ol>
</li>
<li><strong>Bedrock has two Anthropic APIs with different rules:</strong>
<ol>
<li>Converse requires all system content in a top-level field; LiteLLM has hoisted it there since December 2024 (<a href="https://github.com/BerriAI/litellm/pull/7037" target="_blank" rel="noopener noreferrer">#7037</a>).</li>
<li>Invoke takes the native Anthropic Messages format, where models older than Opus 4.8 reject mid-conversation system entries with a 400 and newer models accept them.</li>
</ol>
</li>
</ol>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-went-wrong">What went wrong<a href="https://docs.litellm.ai/en/blog/bedrock-invoke-prompt-caching-incident#what-went-wrong" class="hash-link" aria-label="Direct link to What went wrong" title="Direct link to What went wrong">​</a></h2>
<ol>
<li>After May 28, Claude Code sessions on Bedrock Invoke began failing with 400s mid-session when two things were true:<!-- -->
<ol>
<li>the model was older than Opus 4.8</li>
<li>the model is served under an alias<!-- -->
<ol>
<li>Claude Code detects capabilities by looking for version substrings like <code>opus-4-7</code> or <code>sonnet-4-6</code> in the model name.</li>
<li>For example, an alias like <code>bedrock-claude</code> contains none, so Claude Code assumes the newest feature set and always emits mid-conversation system messages.</li>
</ol>
</li>
</ol>
</li>
<li>An enterprise customer worked around the 400s with a local patch that hoisted every system entry from <code>messages</code> into top-level <code>system</code>, mirroring the Converse behavior, and asked us to upstream it. We shipped it as <a href="https://github.com/BerriAI/litellm/pull/31364" target="_blank" rel="noopener noreferrer">#31364</a> in <code>v1.91.0</code> on July 4.</li>
<li>The hoist fixed the 400s but by always hoisting the system entries in <code>messages</code>, that would invalidate the entire <code>messages</code> cache whenever a new mid-conversation system message was written by Claude Code, which we measured to happen every ~3 turns on average.</li>
<li>This greatly decreased the cache hit rate and increased the cache write rate, increasing spend.</li>
</ol>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="detection-and-response">Detection and response<a href="https://docs.litellm.ai/en/blog/bedrock-invoke-prompt-caching-incident#detection-and-response" class="hash-link" aria-label="Direct link to Detection and response" title="Direct link to Detection and response">​</a></h2>
<p>On July 8, an affected customer gave a detailed bug report of this regression. We reproduced it ourselves the same day end-to-end.</p>
<p>Three PRs fixed it, all released July 10 in <code>v1.91.2</code> after extensive end-to-end testing, with regression tests that fail on pre-fix code:</p>
<ol>
<li><a href="https://github.com/BerriAI/litellm/pull/32578" target="_blank" rel="noopener noreferrer">#32578</a> disables mid-conversation system message hoisting on Invoke.</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32831" target="_blank" rel="noopener noreferrer">#32831</a> re-enables hoisting on models below Opus 4.8.</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32882" target="_blank" rel="noopener noreferrer">#32882</a> disables hoisting on Sonnet 5 and Fable 5, too.</li>
</ol>
<table><thead><tr><th>Date (2026)</th><th>Event</th></tr></thead><tbody><tr><td>May 28</td><td>Opus 4.8 ships; Claude Code starts emitting mid-conversation system messages</td></tr><tr><td>Jun 27</td><td>Customer workaround upstreamed as <a href="https://github.com/BerriAI/litellm/pull/31364" target="_blank" rel="noopener noreferrer">#31364</a></td></tr><tr><td>Jul 4</td><td><code>v1.91.0</code> ships with the regression</td></tr><tr><td>Jul 6</td><td>Customer observes 2-3x spend and collapsed cache hit rates</td></tr><tr><td>Jul 8</td><td>Regression reported; root cause identified; fix opened</td></tr><tr><td>Jul 10</td><td><code>v1.91.2</code> ships with all three fixes and regression tests</td></tr><tr><td>Jul 13</td><td>Customer confirms full recovery</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-our-process-did-not-catch-this">Why our process did not catch this<a href="https://docs.litellm.ai/en/blog/bedrock-invoke-prompt-caching-incident#why-our-process-did-not-catch-this" class="hash-link" aria-label="Direct link to Why our process did not catch this" title="Direct link to Why our process did not catch this">​</a></h2>
<ol>
<li><strong>Testing the original patch was not end-to-end.</strong> We validated it with single-turn <code>curl</code> requests showing a 400 become a 200 that we assumed was the shape that Claude Code would use. That was not the case. We did not trace the root cause (we did not yet know mid-conversation system messages existed) or its caching implications, and treated it as a harmless edge case fix.</li>
<li><strong>Review lacked the context to object.</strong> The human reviewer saw a small compatibility patch with passing tests and no explanation of why Claude Code started sending these kinds of mid-conversation system messages, and our AI review bots did not flag the caching implication either. Nobody in the loop had the info to connect the hoist to cache invalidation.</li>
<li><strong>Cost regressions are silent.</strong> Every response was a 200 with a correct completion. The only signal was cache-read token counts, which nothing in our CI or monitoring measured.</li>
<li><strong>The documentation was incomplete.</strong> The feature never appeared in the Claude Code changelog, and as of July 13 the Claude API docs still describe it as Opus 4.8 only (without mentioning Sonnet or Fable 5) and unavailable on Bedrock, which contradicts our empirical measurements.</li>
</ol>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-we-are-changing">What we are changing<a href="https://docs.litellm.ai/en/blog/bedrock-invoke-prompt-caching-incident#what-we-are-changing" class="hash-link" aria-label="Direct link to What we are changing" title="Direct link to What we are changing">​</a></h2>
<ul>
<li>Our e2e suite will gain a scripted multi-turn Claude Code session growing to roughly 250k tokens of context against real Bedrock, asserting cache reads grow monotonically and never collapse (started in <a href="https://github.com/BerriAI/litellm/pull/32963" target="_blank" rel="noopener noreferrer">#32963</a>).</li>
<li>We will set up a weekly automated load test that will flag anomalies in spend, cache reads and writes, turn latency, error rates, etc., so cost and performance regressions are detected and fixed before a release.</li>
<li>Daily automated diffs of Anthropic's SDKs and docs alert us to new features that need translation support before customer traffic finds them.</li>
<li>We <a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food" target="_blank" rel="noopener noreferrer">dogfood</a> LiteLLM internally and will set up monitoring for new request shapes, such as unknown <code>anthropic-beta</code> headers, and the same anomoly detction, which will alert us ahead of a release.</li>
<li>Bug fixes now have a higher merge bar: validated means reproduced against the real client's traffic on their exact end-user application end-to-end and a complete understanding of the root cause; synthetic requests are not enough.</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="known-limitations">Known limitations<a href="https://docs.litellm.ai/en/blog/bedrock-invoke-prompt-caching-incident#known-limitations" class="hash-link" aria-label="Direct link to Known limitations" title="Direct link to Known limitations">​</a></h2>
<ol>
<li>Converse rejects system entries inside <code>messages</code> at any position, so on <code>bedrock_converse</code> we must still hoist, and Claude Code sessions routed through Converse still lose cached prefix on every mid-conversation system message. If you run Claude Code against Bedrock, route it through the Invoke path (<code>bedrock/invoke/&lt;model&gt;</code>). We are raising the API constraint with AWS.</li>
<li>We are testing whether the Vertex AI and Azure paths need equivalent hoisting and will update this post when we have more info.</li>
</ol>
<p>To every team whose bill went up because of this: we are sorry. The value of a gateway is that this class of provider change gets absorbed by us instead of reaching you, and the tests, monitoring, and process improvements above are how we intend to keep it that way.</p>]]></content>
        <author>
            <name>Mateo Wang</name>
            <uri>https://www.linkedin.com/in/mateo-wang</uri>
        </author>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <category label="incident-report" term="incident-report"/>
        <category label="bedrock" term="bedrock"/>
        <category label="caching" term="caching"/>
        <category label="claude-code" term="claude-code"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[July stability update: hardening MCP auth and cutting pass-through memory]]></title>
        <id>https://docs.litellm.ai/en/blog/two-week-stability-update</id>
        <link href="https://docs.litellm.ai/en/blog/two-week-stability-update"/>
        <updated>2026-07-11T12:00:00.000Z</updated>
        <summary type="html"><![CDATA[A two-week product quality update. We addressed two major issues (MCP credential resolution and pass-through memory) and shipped 134 bug fixes in total. Plus our next goal: 95% end-to-end test coverage.]]></summary>
        <content type="html"><![CDATA[<p>Over the last two weeks we addressed two major product quality issues:</p>
<ol>
<li>The MCP Gateway did not have a single class for credential resolution.</li>
<li>Pass-through APIs had high memory consumption.</li>
</ol>
<p>Across the same window we shipped 134 bug fixes in total. This post covers the two big changes first, then the rest of the AI Eng and reliability work, the full breakdown, and what we are doing next.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="mcp-gateway-a-single-credential-resolver">MCP Gateway: a single credential resolver<a href="https://docs.litellm.ai/en/blog/two-week-stability-update#mcp-gateway-a-single-credential-resolver" class="hash-link" aria-label="Direct link to MCP Gateway: a single credential resolver" title="Direct link to MCP Gateway: a single credential resolver">​</a></h2>
<p>The MCP Gateway connects a user's AI app (Claude Desktop, Cursor, an agent) to the upstream MCP servers it wants to use, and it has to attach the right credential for each upstream.</p>
<p>Before, the MCP Gateway would infer the authentication method a user was trying to use based on the credentials they set. We have now built a credential resolver class that lets a user explicitly specify which auth method they are using. We believe this will significantly drive down a class of bugs users were reporting on MCPs.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="before-infer-the-auth-method-from-whatever-credentials-are-set">Before: infer the auth method from whatever credentials are set<a href="https://docs.litellm.ai/en/blog/two-week-stability-update#before-infer-the-auth-method-from-whatever-credentials-are-set" class="hash-link" aria-label="Direct link to Before: infer the auth method from whatever credentials are set" title="Direct link to Before: infer the auth method from whatever credentials are set">​</a></h3>
<!-- -->
<p>Why this was bad: there was no single place that decided which credential to attach, and no error when the decision was ambiguous. Inferring from set fields meant two code paths could read the same server and disagree. The precedence order meant adding a field could silently change which credential won. And the silent fallback meant an unhandled case still sent something upstream instead of refusing. Ambiguity resolved to "attach a credential anyway" instead of "stop."</p>
<p>The types of bugs we saw from this:</p>
<ul>
<li>Tokens sent to the wrong upstream server.</li>
<li>Duplicate or stale <code>Authorization</code> headers slipping through.</li>
<li>MCP requests skipping the normal team, route, and key checks.</li>
<li>Cached OAuth tokens going stale or crossing between users.</li>
<li>Upstream URLs and secrets showing up in logs.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="after-the-user-declares-the-auth-method-and-it-fails-closed">After: the user declares the auth method, and it fails closed<a href="https://docs.litellm.ai/en/blog/two-week-stability-update#after-the-user-declares-the-auth-method-and-it-fails-closed" class="hash-link" aria-label="Direct link to After: the user declares the auth method, and it fails closed" title="Direct link to After: the user declares the auth method, and it fails closed">​</a></h3>
<!-- -->
<p>Each mode has its own fully typed config, so there is no guessing from which fields are set and no precedence order. The match is exhaustive, so adding a mode without handling it fails the type checker, and an unhandled case raises instead of quietly attaching no auth.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai-eng-llm-providers-27-fixes">AI Eng: LLM providers (27 fixes)<a href="https://docs.litellm.ai/en/blog/two-week-stability-update#ai-eng-llm-providers-27-fixes" class="hash-link" aria-label="Direct link to AI Eng: LLM providers (27 fixes)" title="Direct link to AI Eng: LLM providers (27 fixes)">​</a></h2>
<p>AI Eng was focused on driving down reported bugs. Most of them were on new models (Claude 4.8, Opus 4.8, Bedrock Invoke). Here are the types of bugs we fixed:</p>
<table><thead><tr><th>Type of bug</th><th>Count</th></tr></thead><tbody><tr><td>New model capabilities getting dropped</td><td>10</td></tr><tr><td>Wrong cost or billing</td><td>6</td></tr><tr><td>Routing or fallback picking the wrong model</td><td>6</td></tr><tr><td>Broken response or streaming output</td><td>5</td></tr><tr><td>Total</td><td>27</td></tr></tbody></table>
<p>Most of these were on Bedrock and the routing layer.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="performance-pass-through-memory">Performance: pass-through memory<a href="https://docs.litellm.ai/en/blog/two-week-stability-update#performance-pass-through-memory" class="hash-link" aria-label="Direct link to Performance: pass-through memory" title="Direct link to Performance: pass-through memory">​</a></h2>
<p>Pass-through APIs had high memory consumption. Large non-JSON pass-through downloads (batch-result files, binary and octet-stream downloads) were buffered whole in memory before being sent on. We changed this to stream the response chunk by chunk, so memory stays flat regardless of file size (<a href="https://github.com/BerriAI/litellm/pull/32386" target="_blank" rel="noopener noreferrer">#32386</a>). This covers the provider pass-through routes (<code>/vertex_ai/*</code>, <code>/bedrock/*</code>, <code>/openai/*</code>, <code>/anthropic/*</code>, and others) and custom pass-through endpoints.</p>
<!-- -->
<p>JSON responses still buffer by design, so spend logging and guardrails can inspect the body.</p>
<p>Two more fixes in the same spirit, don't pay for work nobody needs:</p>
<ul>
<li>Prometheus skips budget-metric DB lookups entirely when the gauges are no-ops (nothing is scraping them).</li>
<li>The complexity router builds its semantic route index once under concurrent cold-start, instead of rebuilding it per request.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="by-the-numbers">By the numbers<a href="https://docs.litellm.ai/en/blog/two-week-stability-update#by-the-numbers" class="hash-link" aria-label="Direct link to By the numbers" title="Direct link to By the numbers">​</a></h2>
<p>All 134 fixes, by area:</p>
<table><thead><tr><th>Area</th><th>Fixes</th></tr></thead><tbody><tr><td>MCP Gateway</td><td>50</td></tr><tr><td>LLM Providers (AI Eng)</td><td>27</td></tr><tr><td>Proxy Core / Reliability</td><td>23</td></tr><tr><td>UI / Dashboard</td><td>20</td></tr><tr><td>Logging / Observability</td><td>9</td></tr><tr><td>Guardrails</td><td>5</td></tr><tr><td>Total</td><td>134</td></tr></tbody></table>
<p>These 134 are every merged <code>fix:</code> PR in the two weeks. One reported ticket often turns into several fix PRs, so this count is higher than the number of tickets in Linear.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="next-goal-95-end-to-end-test-coverage">Next goal: 95% end-to-end test coverage<a href="https://docs.litellm.ai/en/blog/two-week-stability-update#next-goal-95-end-to-end-test-coverage" class="hash-link" aria-label="Direct link to Next goal: 95% end-to-end test coverage" title="Direct link to Next goal: 95% end-to-end test coverage">​</a></h2>
<p>Most of these 134 bugs were caught late, in staging or from a user report. We want to catch them before they merge. We believe by investing in improving our e2e testing coverage we can significantly reduce the number of reported regressions from users on an upgrade.</p>
<p>We are learning from <a href="https://engineering.fb.com/2021/02/17/developer-tools/fix-fast/" target="_blank" rel="noopener noreferrer">Meta's approach to fixing bugs fast</a> and raising our testing bar.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="appendix">Appendix<a href="https://docs.litellm.ai/en/blog/two-week-stability-update#appendix" class="hash-link" aria-label="Direct link to Appendix" title="Direct link to Appendix">​</a></h2>
<p>PRs from this window.</p>
<p><strong>MCP Gateway</strong></p>
<p>Credential resolver:</p>
<ul>
<li><a href="https://github.com/BerriAI/litellm/pull/32815" target="_blank" rel="noopener noreferrer">#32815</a> credential class merge (the single typed resolver)</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32652" target="_blank" rel="noopener noreferrer">#32652</a> stale token invalidation</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32715" target="_blank" rel="noopener noreferrer">#32715</a> semantic filter fail-closed</li>
</ul>
<p>Pass-through and delegate credential modes:</p>
<ul>
<li><a href="https://github.com/BerriAI/litellm/pull/31989" target="_blank" rel="noopener noreferrer">#31989</a> passthrough / delegate modes</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32414" target="_blank" rel="noopener noreferrer">#32414</a> passthrough UI enum</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32556" target="_blank" rel="noopener noreferrer">#32556</a> passthrough call relay</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32752" target="_blank" rel="noopener noreferrer">#32752</a> configured client for passthrough</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32735" target="_blank" rel="noopener noreferrer">#32735</a> no DCR persist for passthrough</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32507" target="_blank" rel="noopener noreferrer">#32507</a> token exchange secret pairing</li>
</ul>
<p>DCR bridge (LIT-4337):</p>
<ul>
<li><a href="https://github.com/BerriAI/litellm/pull/32745" target="_blank" rel="noopener noreferrer">#32745</a> plumbing</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32747" target="_blank" rel="noopener noreferrer">#32747</a> authorize relay</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32753" target="_blank" rel="noopener noreferrer">#32753</a> facade</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32804" target="_blank" rel="noopener noreferrer">#32804</a> UI</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32527" target="_blank" rel="noopener noreferrer">#32527</a> DCR redirect_uri</li>
</ul>
<p>Sealed envelope and delegate admission (LIT-4338):</p>
<ul>
<li><a href="https://github.com/BerriAI/litellm/pull/32748" target="_blank" rel="noopener noreferrer">#32748</a> envelope module</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32794" target="_blank" rel="noopener noreferrer">#32794</a> envelope edge consumer</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32824" target="_blank" rel="noopener noreferrer">#32824</a> delegate admission</li>
</ul>
<p><strong>AI Eng (LLM providers)</strong></p>
<p>Bedrock:</p>
<ul>
<li><a href="https://github.com/BerriAI/litellm/pull/32882" target="_blank" rel="noopener noreferrer">#32882</a> flag Claude 4.8+ entries with supports_mid_conversation_system</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32831" target="_blank" rel="noopener noreferrer">#32831</a> gate in-place system role messages for Claude Invoke</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32578" target="_blank" rel="noopener noreferrer">#32578</a> keep mid-conversation system messages for Claude Invoke</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32658" target="_blank" rel="noopener noreferrer">#32658</a> retain clear_tool_uses context-management edits and emit the beta header</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32551" target="_blank" rel="noopener noreferrer">#32551</a> honor cache_control ttl on message-level cachePoint blocks</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32538" target="_blank" rel="noopener noreferrer">#32538</a> preserve cache_control ttl on message-level cache points</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32840" target="_blank" rel="noopener noreferrer">#32840</a> add jp.anthropic.claude-opus-4-8 to the model cost map</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32389" target="_blank" rel="noopener noreferrer">#32389</a> resolve regional inference profiles to regional pricing</li>
</ul>
<p>Anthropic:</p>
<ul>
<li><a href="https://github.com/BerriAI/litellm/pull/32874" target="_blank" rel="noopener noreferrer">#32874</a> thread the real provider through capability probes (was pinned to anthropic)</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32867" target="_blank" rel="noopener noreferrer">#32867</a> translate adaptive thinking/effort for pre-4.6 models</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32833" target="_blank" rel="noopener noreferrer">#32833</a> strip @version suffix in model lookup</li>
</ul>
<p>Routing and fallbacks:</p>
<ul>
<li><a href="https://github.com/BerriAI/litellm/pull/32859" target="_blank" rel="noopener noreferrer">#32859</a> complexity router keyword tiers (max aggregation, blank-keyword hardening)</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32943" target="_blank" rel="noopener noreferrer">#32943</a> complexity router logging and auth propagation, index built once</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32873" target="_blank" rel="noopener noreferrer">#32873</a> fallback rules routing split (bare-Claude coverage, cost-map precedence, legacy schema)</li>
</ul>
<p>Responses API:</p>
<ul>
<li><a href="https://github.com/BerriAI/litellm/pull/32835" target="_blank" rel="noopener noreferrer">#32835</a> raise APIError on in-stream error events</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32837" target="_blank" rel="noopener noreferrer">#32837</a> preserve reasoning_tokens through chat to responses</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32034" target="_blank" rel="noopener noreferrer">#32034</a> idempotent response-id encoding (prevents MCP gateway double-encoding)</li>
</ul>
<p>Cost, Vertex, Rerank:</p>
<ul>
<li><a href="https://github.com/BerriAI/litellm/pull/32387" target="_blank" rel="noopener noreferrer">#32387</a> add gpt-realtime-2.1 models with regional uplift</li>
<li>coerce string tiered-pricing costs and share the tier helper</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32550" target="_blank" rel="noopener noreferrer">#32550</a> forward realtime health check params (Vertex)</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32533" target="_blank" rel="noopener noreferrer">#32533</a> log rerank params at debug to stop leaking request content</li>
</ul>
<p><strong>Performance</strong></p>
<ul>
<li><a href="https://github.com/BerriAI/litellm/pull/32386" target="_blank" rel="noopener noreferrer">#32386</a> stream non-SSE pass-through responses instead of buffering in memory</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32404" target="_blank" rel="noopener noreferrer">#32404</a> stop request params from clobbering merged target query params</li>
<li><a href="https://github.com/BerriAI/litellm/pull/32834" target="_blank" rel="noopener noreferrer">#32834</a> Prometheus skips budget-metric DB lookups when gauges are no-ops</li>
</ul>]]></content>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <author>
            <name>Tin Lo</name>
        </author>
        <author>
            <name>Mateo Wang</name>
            <uri>https://www.linkedin.com/in/mateo-wang</uri>
        </author>
        <author>
            <name>Yassin Kortam</name>
            <uri>https://www.linkedin.com/in/yassink/</uri>
        </author>
        <category label="stability" term="stability"/>
        <category label="mcp" term="mcp"/>
        <category label="performance" term="performance"/>
        <category label="product" term="product"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[July Townhall: Product + Roadmap Updates]]></title>
        <id>https://docs.litellm.ai/en/blog/july-townhall-announcement</id>
        <link href="https://docs.litellm.ai/en/blog/july-townhall-announcement"/>
        <updated>2026-07-09T12:00:00.000Z</updated>
        <summary type="html"><![CDATA[Join the LiteLLM July townhall on Thursday, 23 July at 7:30 AM PT to learn about LiteLLM's product updates and roadmap.]]></summary>
        <content type="html"><![CDATA[<p>We are hosting our July townhall on <strong>Thursday, 23 July at 7:30 AM PT</strong>.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAADCAIAAAAlXwkiAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAZUlEQVR4nGOoMleqc1BpjfPPD/dxtbfWNzF18LBp6WwLjU2UUddgyDLTyHXQ74zzm5Sb2Bvr35MWkRgaGBYeFhgZpGmoydDjqlDmqJThaRHl7eRmqGqjo2akq2FpoWvjqmnhogYAKAYaoI9e0McAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="160"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/en/assets/ideal-img/july_townhall_banner.50e0ad5.640.png srcset="/en/assets/ideal-img/july_townhall_banner.50e0ad5.640.png 640w,/en/assets/ideal-img/july_townhall_banner.f6cf5a1.800.png 800w" width=640 height=160></noscript></div>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="agenda">Agenda<a href="https://docs.litellm.ai/en/blog/july-townhall-announcement#agenda" class="hash-link" aria-label="Direct link to Agenda" title="Direct link to Agenda">​</a></h2>
<ul>
<li>Product updates and roadmap progress</li>
<li>Reliability and security updates</li>
<li>Open Q&amp;A with the team</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="stability">Stability<a href="https://docs.litellm.ai/en/blog/july-townhall-announcement#stability" class="hash-link" aria-label="Direct link to Stability" title="Direct link to Stability">​</a></h2>
<p>Our team is focused on stability: improving reliability and reducing regressions across releases. Follow the roadmap here: <a href="https://github.com/BerriAI/litellm/issues/30484" target="_blank" rel="noopener noreferrer">Stability roadmap</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-contribute">How to contribute<a href="https://docs.litellm.ai/en/blog/july-townhall-announcement#how-to-contribute" class="hash-link" aria-label="Direct link to How to contribute" title="Direct link to How to contribute">​</a></h2>
<p>Add the topics and questions you'd like us to cover when you register below. We use your responses to set the agenda.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="register">Register<a href="https://docs.litellm.ai/en/blog/july-townhall-announcement#register" class="hash-link" aria-label="Direct link to Register" title="Direct link to Register">​</a></h2>
<p>Register here: <a href="https://docs.google.com/forms/d/e/1FAIpQLSetGEJJS1cqmGRdmL70Y1vu-FJccpozQ1R97Bpoba9eN0mjHA/viewform" target="_blank" rel="noopener noreferrer">LiteLLM July Townhall Form</a></p>
<p>We will hold the townhall from <strong>7:30 AM to 8:30 AM PT on Zoom</strong>.</p>
<p>For security, attendance is restricted to corporate emails. If you register with a non-corporate email, we will share the townhall slides and accompanying blog post after the event.</p>]]></content>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <category label="announcement" term="announcement"/>
        <category label="townhall" term="townhall"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Day 0 Support: GPT-5.6 (Sol, Terra, Luna)]]></title>
        <id>https://docs.litellm.ai/en/blog/gpt_5_6</id>
        <link href="https://docs.litellm.ai/en/blog/gpt_5_6"/>
        <updated>2026-07-09T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[Day 0 support for the GPT-5.6 family (Sol, Terra, and Luna) on LiteLLM.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="LiteLLM x GPT-5.6" src="https://docs.litellm.ai/en/assets/images/hero-8993f4226fae32570dd811183b27dfdf.png" width="4800" height="2508" class="img_ev3q"></p>
<p>LiteLLM now supports the <a href="https://openai.com/index/previewing-gpt-5-6-sol/" target="_blank" rel="noopener noreferrer">GPT-5.6 family</a>. Route traffic to OpenAI's newest frontier models through the LiteLLM AI Gateway with no code changes.</p>
<!-- -->
<p>GPT-5.6 introduces a new naming system where the number identifies the generation and the tier name identifies a durable capability level. <code>gpt-5.6-sol</code> is the flagship for complex reasoning and agentic workloads, <code>gpt-5.6-terra</code> is a balanced model for everyday work with performance competitive with GPT-5.5 at roughly half the cost, and <code>gpt-5.6-luna</code> is the fastest and most affordable tier. Per OpenAI, the family sets a new state of the art on agentic coding (Terminal-Bench 2.1) with broad gains in long-horizon biology and cybersecurity workflows. GPT-5.6 also adds a new <code>max</code> reasoning effort for the deepest single-agent thinking and an <code>ultra</code> mode that coordinates subagents on the most complex tasks.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Living post</div><div class="admonitionContent_BuS1"><p><strong>This post is updated as GPT-5.6 support expands.</strong> GPT-5.6 is now available on Azure OpenAI in addition to OpenAI direct. Global Azure deployments match OpenAI list pricing, and regional deployments (<code>azure/us/*</code> and <code>azure/eu/*</code>) are tracked with the standard 10% regional uplift.</p></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p><strong>No Docker image upgrade needed.</strong> GPT-5.6 routes through the existing <code>OpenAIGPT5Config</code> in LiteLLM (the version classifier already matches <code>gpt-5.4</code> and newer), so any recent version works out of the box. The GPT-5.6 pricing and metadata are also bundled starting in <code>v1.93.0-dev.2</code> for anyone running with <code>LITELLM_LOCAL_MODEL_COST_MAP=true</code>.</p><p>For cost tracking, hit the <strong>Reload Model Cost Map</strong> button in the Admin UI (or <code>POST /reload/model_cost_map</code>) to pull the latest pricing from GitHub. This feature is available on <code>v1.76.0</code> and above.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="usage">Usage<a href="https://docs.litellm.ai/en/blog/gpt_5_6#usage" class="hash-link" aria-label="Direct link to Usage" title="Direct link to Usage">​</a></h2>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">LiteLLM Proxy</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">LiteLLM Python SDK</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Azure OpenAI</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><strong>1. Setup config.yaml</strong></p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5.6</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sol</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> openai/gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5.6</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sol</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/OPENAI_API_KEY</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5.6</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">terra</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> openai/gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5.6</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">terra</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/OPENAI_API_KEY</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5.6</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">luna</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> openai/gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5.6</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">luna</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/OPENAI_API_KEY</span><br></span></code></pre></div></div><p><strong>2. Start the proxy</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">docker run -d \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -p 4000:4000 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e OPENAI_API_KEY=$OPENAI_API_KEY \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -v $(pwd)/config.yaml:/app/config.yaml \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:v1.93.0-dev.2 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --config /app/config.yaml</span><br></span></code></pre></div></div><p><strong>3. Test it</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl -X POST "http://0.0.0.0:4000/chat/completions" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -H "Content-Type: application/json" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -H "Authorization: Bearer $LITELLM_KEY" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -d '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "model": "gpt-5.6-sol",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "messages": [</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      {"role": "user", "content": "Write a Python function to check if a number is prime."}</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    ]</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  }'</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> litellm </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> completion</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">response </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> completion</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"openai/gpt-5.6-sol"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    messages</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"role"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"user"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"content"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"Write a Python function to check if a number is prime."</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">response</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">choices</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token comment" style="color:rgb(0, 128, 0)"># gpt-5.6-terra for balanced, cost-efficient everyday work</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">response </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> completion</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"openai/gpt-5.6-terra"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    messages</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"role"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"user"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"content"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"Summarize the key ideas in this design doc."</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">response</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">choices</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token comment" style="color:rgb(0, 128, 0)"># gpt-5.6-luna for the fastest, lowest-cost tier</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">response </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> completion</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"openai/gpt-5.6-luna"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    messages</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"role"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"user"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"content"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"Classify this ticket as bug, feature, or question."</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">response</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">choices</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Point <code>model</code> at the Azure deployment name. Global deployments use the <code>azure/gpt-5.6-*</code> names; regional deployments use <code>azure/us/gpt-5.6-*</code> or <code>azure/eu/gpt-5.6-*</code> so cost tracking picks up the regional uplift automatically.</p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5.6</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sol</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> azure/gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5.6</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sol</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_base</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AZURE_API_BASE</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AZURE_API_KEY</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_version</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AZURE_API_VERSION</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5.6</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">terra</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> azure/gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5.6</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">terra</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_base</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AZURE_API_BASE</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AZURE_API_KEY</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_version</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AZURE_API_VERSION</span><br></span></code></pre></div></div><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> litellm </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> completion</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">response </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> completion</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"azure/gpt-5.6-sol"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    messages</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"role"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"user"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"content"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"Write a Python function to check if a number is prime."</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">response</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">choices</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="responses-api">Responses API<a href="https://docs.litellm.ai/en/blog/gpt_5_6#responses-api" class="hash-link" aria-label="Direct link to Responses API" title="Direct link to Responses API">​</a></h2>
<p>For agentic and multi-turn workflows, use <code>/v1/responses</code> to preserve reasoning state and output item metadata across turns.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl -X POST "http://0.0.0.0:4000/v1/responses" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -H "Content-Type: application/json" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -H "Authorization: Bearer $LITELLM_KEY" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -d '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "model": "gpt-5.6-sol",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "input": "Plan and write a Python script that scrapes a webpage and summarizes it."</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  }'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="pricing">Pricing<a href="https://docs.litellm.ai/en/blog/gpt_5_6#pricing" class="hash-link" aria-label="Direct link to Pricing" title="Direct link to Pricing">​</a></h2>
<p>Prices are per 1M tokens (USD), shown as short context (≤272K tokens) / long context (&gt;272K tokens).</p>
<table><thead><tr><th>Model</th><th>Input</th><th>Cached input</th><th>Cache write</th><th>Output</th></tr></thead><tbody><tr><td><code>gpt-5.6-sol</code></td><td>$5.00 / $10.00</td><td>$0.50 / $1.00</td><td>$6.25 / $12.50</td><td>$30.00 / $45.00</td></tr><tr><td><code>gpt-5.6-terra</code></td><td>$2.50 / $5.00</td><td>$0.25 / $0.50</td><td>$3.125 / $6.25</td><td>$15.00 / $22.50</td></tr><tr><td><code>gpt-5.6-luna</code></td><td>$1.00 / $2.00</td><td>$0.10 / $0.20</td><td>$1.25 / $2.50</td><td>$6.00 / $9.00</td></tr></tbody></table>
<p>Global Azure OpenAI deployments (<code>azure/gpt-5.6-*</code>) match these OpenAI list prices. Regional deployments (<code>azure/us/gpt-5.6-*</code> and <code>azure/eu/gpt-5.6-*</code>) carry the standard 10% uplift on the base rate; LiteLLM tracks the difference automatically once you route through the regional model name.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notes">Notes<a href="https://docs.litellm.ai/en/blog/gpt_5_6#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes">​</a></h2>
<ul>
<li>For cost tracking on the GPT-5.6 models, hit the <strong>Reload Model Cost Map</strong> button in the Admin UI (or <code>POST /reload/model_cost_map</code>). Works on any LiteLLM version <code>v1.76.0</code> or newer, with no container restart or image upgrade required.</li>
<li>GPT-5.6 supports reasoning, function calling, parallel tool calls, vision (image input), prompt caching, web search, and structured output; see the <a href="https://docs.litellm.ai/docs/providers/openai">OpenAI provider docs</a> for advanced usage.</li>
<li>The GPT-5.6 family launched in limited preview and OpenAI is expanding availability through the API and Codex; check your OpenAI account for model access.</li>
</ul>]]></content>
        <author>
            <name>Mateo Wang</name>
            <uri>https://www.linkedin.com/in/mateo-wang</uri>
        </author>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <category label="openai" term="openai"/>
        <category label="gpt-5.6" term="gpt-5.6"/>
        <category label="gpt-5.6-sol" term="gpt-5.6-sol"/>
        <category label="gpt-5.6-terra" term="gpt-5.6-terra"/>
        <category label="gpt-5.6-luna" term="gpt-5.6-luna"/>
        <category label="completion" term="completion"/>
        <category label="day 0 support" term="day 0 support"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[5 ways to cut Claude Code costs with LiteLLM]]></title>
        <id>https://docs.litellm.ai/en/blog/save-claude-code-costs-with-litellm</id>
        <link href="https://docs.litellm.ai/en/blog/save-claude-code-costs-with-litellm"/>
        <updated>2026-07-04T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[Practical levers a platform admin can pull on the LiteLLM proxy to reduce Claude Code spend without asking developers to change a thing.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="5 ways to save Claude Code cost with LiteLLM" src="https://docs.litellm.ai/en/assets/images/title_card-74ec0bfe3411225f0a91e484904b17da.png" width="3200" height="1800" class="img_ev3q"></p>
<p>Claude Code is one of the heaviest consumers of input tokens in a modern engineering org. Long tool loops, large file reads, and MCP catalogs with hundreds of tools push every request toward the top of the context window, and the bill scales with it.</p>
<p>If Claude Code already points at a LiteLLM proxy (via <code>ANTHROPIC_BASE_URL</code>), there are five levers the platform admin can pull to bring that cost down. None of them require a client-side change.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-budget-windows--budget-fallbacks">1. Budget windows + budget fallbacks<a href="https://docs.litellm.ai/en/blog/save-claude-code-costs-with-litellm#1-budget-windows--budget-fallbacks" class="hash-link" aria-label="Direct link to 1. Budget windows + budget fallbacks" title="Direct link to 1. Budget windows + budget fallbacks">​</a></h2>
<p>Two knobs on the virtual key.</p>
<p><strong>Budget windows</strong> cap how much the key can spend inside a rolling time period. Set <code>max_budget</code> (dollars) and <code>budget_duration</code> ("24h", "7d", "30d", etc). LiteLLM resets the counter automatically at the end of every window. You can stack windows too, e.g. $10/day AND $100/month, so one bad afternoon can't burn the whole month:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl 'http://0.0.0.0:4000/key/generate' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --header 'Authorization: Bearer &lt;your-master-key&gt;' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --header 'Content-Type: application/json' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --data-raw '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "budget_limits": [</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      {"budget_duration": "24h", "max_budget": 10},</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      {"budget_duration": "30d", "max_budget": 100}</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    ]</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  }'</span><br></span></code></pre></div></div>
<p><strong>Budget fallbacks</strong> decide what happens once a per-model budget is exhausted. Instead of erroring at the developer's terminal, attach <code>model_max_budget</code> per model and a <code>budget_fallbacks</code> chain naming the cheaper models to reroute to. The request silently falls to the first fallback still under its own budget:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl -X POST http://localhost:4000/key/generate \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -H "Authorization: Bearer $ADMIN_KEY" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -H "Content-Type: application/json" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -d '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "model_max_budget": {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "claude-opus-4-8":   {"budget_limit": 20.0, "time_period": "1d"},</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "claude-sonnet-5":   {"budget_limit": 10.0, "time_period": "1d"},</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "claude-haiku-4-5":  {"budget_limit": 5.0,  "time_period": "1d"}</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "budget_fallbacks": {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "claude-opus-4-8":  ["claude-sonnet-5", "claude-haiku-4-5"],</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "claude-sonnet-5":  ["claude-haiku-4-5"]</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  }'</span><br></span></code></pre></div></div>
<p>Once the developer burns $20 of Opus in a day, subsequent Opus requests silently reroute to Sonnet; if Sonnet is also tapped out, Haiku picks up. Fallback models without a <code>model_max_budget</code> entry are treated as unlimited.</p>
<p><strong>→ Learn more:</strong> <a href="https://docs.litellm.ai/docs/proxy/users#set-multiple-budget-windows-on-a-key">Budget Windows</a> · <a href="https://docs.litellm.ai/docs/proxy/budget_fallbacks">Budget Fallbacks</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-automatic-prompt-caching">2. Automatic Prompt Caching<a href="https://docs.litellm.ai/en/blog/save-claude-code-costs-with-litellm#2-automatic-prompt-caching" class="hash-link" aria-label="Direct link to 2. Automatic Prompt Caching" title="Direct link to 2. Automatic Prompt Caching">​</a></h2>
<p>Claude's prompt cache reads a cache hit for roughly 10% of the price of a fresh input token, but only if the request marks the right message with <code>cache_control</code>. LiteLLM injects that marker for you: point <code>cache_control_injection_points</code> at the system message (or the second-to-last user turn), and every Claude Code call through the proxy carries the checkpoint without any client-side edit.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">config.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> anthropic/claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/ANTHROPIC_API_KEY</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">cache_control_injection_points</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">location</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> message</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> system</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token key atrule">router_settings</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token key atrule">optional_pre_call_checks</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"prompt_caching"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><br></span></code></pre></div></div>
<p>for automatically injecting this in all requests, do this</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">config.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4.5</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">20250929</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> vertex_ai/claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5@20250929</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token comment" style="color:rgb(0, 128, 0)"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token key atrule">router_settings</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token key atrule">default_litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">cache_control_injection_points</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">location</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> message</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">role</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> system</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token key atrule">optional_pre_call_checks</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"prompt_caching"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><br></span></code></pre></div></div>
<p>Turning on 'prompt_caching' as a pre call check, means if you run multiple deployments of the same Claude model, LiteLLM will intelligently route to the model deployment which was initially used for the request.</p>
<p><strong>→ Learn more:</strong> <a href="https://docs.litellm.ai/docs/tutorials/prompt_caching">Auto-Inject Prompt Caching Checkpoints</a> · <a href="https://docs.litellm.ai/docs/tutorials/claude_code_prompt_cache_routing">Claude Code - Prompt Cache Routing</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="3-prompt-compression-headroom">3. Prompt Compression (Headroom)<a href="https://docs.litellm.ai/en/blog/save-claude-code-costs-with-litellm#3-prompt-compression-headroom" class="hash-link" aria-label="Direct link to 3. Prompt Compression (Headroom)" title="Direct link to 3. Prompt Compression (Headroom)">​</a></h2>
<p>Prompt cache trims the static prefix; Headroom trims the dynamic middle. Tool outputs, file reads, database dumps, and RAG payloads get rewritten into a compressed form before they reach the model, and if the model actually needs the original bytes, a <code>retrieve_headroom</code> tool call fetches them on demand. Reported savings run 60-95% on the compressible portion of Claude Code traffic.</p>
<p>Headroom runs as a sidecar container next to LiteLLM. Register it as a <code>pre_call</code> guardrail and either flip <code>default_on: true</code> or attach it to per-developer virtual keys.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">config.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">guardrails</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">guardrail_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> headroom</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">compression</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">guardrail</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> headroom</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">mode</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> pre_call</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_base</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">//your</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">headroom</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">service</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">default_on</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><br></span></code></pre></div></div>
<p>The developer still exports <code>ANTHROPIC_BASE_URL</code> and runs <code>claude</code>; the only thing they notice is a smaller number on the spend log.</p>
<p><strong>→ Learn more:</strong> <a href="https://docs.litellm.ai/docs/proxy/headroom">Headroom guardrail setup guide</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="4-defer-mcp-tools">4. Defer MCP tools<a href="https://docs.litellm.ai/en/blog/save-claude-code-costs-with-litellm#4-defer-mcp-tools" class="hash-link" aria-label="Direct link to 4. Defer MCP tools" title="Direct link to 4. Defer MCP tools">​</a></h2>
<p>A Claude Code session that connects to five or six MCP servers can easily surface a few hundred tools, and every one of those tool schemas ships on every <code>tools/list</code> call. That is pure input-token overhead on a workload where the model uses two or three tools per turn.</p>
<p>Turn on <code>mcp_tool_search_enabled</code> on the virtual key, and LiteLLM replaces the full catalog with two virtual tools, <code>mcp_tool_search</code> and <code>mcp_tool_call</code>. The model searches by keyword, gets the ranked matches back, and calls the one it wants. The token cost of tool listing collapses from hundreds of schemas to two.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl -X POST http://localhost:4000/key/generate \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -H "Authorization: Bearer $ADMIN_KEY" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -H "Content-Type: application/json" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -d '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "object_permission": {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "mcp_tool_search_enabled": true,</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "mcp_servers": ["github", "slack", "linear", "jira"]</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  }'</span><br></span></code></pre></div></div>
<p>Ranking is token-overlap over <code>name + description</code>, so there is no embedding dependency to run. The access surface does not widen; search only returns tools the key was already allowed to call.</p>
<p><strong>→ Learn more:</strong> <a href="https://docs.litellm.ai/docs/mcp_tool_search">MCP Tool Search</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="5-auto-routing">5. Auto routing<a href="https://docs.litellm.ai/en/blog/save-claude-code-costs-with-litellm#5-auto-routing" class="hash-link" aria-label="Direct link to 5. Auto routing" title="Direct link to 5. Auto routing">​</a></h2>
<p>Send every request to the smallest model that can handle it, so cheap requests never touch the expensive model. LiteLLM ships three flavors: Semantic (embedding match), Complexity (rule-based, zero external call), and Adaptive (learns from live traffic, beta).</p>
<p>Complexity router is the fastest to set up. Point Claude Code at <code>smart-router</code> and it classifies each request into a tier:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">config.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># Target models</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4o</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">mini</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4o</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">mini</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4o</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4o</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">20250514</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> o1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">preview</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> o1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">preview</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># Complexity router</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> smart</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">router</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> auto_router/complexity_router</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">complexity_router_config</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token key atrule">tiers</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token key atrule">SIMPLE</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4o</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">mini</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token key atrule">MEDIUM</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4o</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token key atrule">COMPLEX</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">          </span><span class="token key atrule">REASONING</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> o1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">preview</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">complexity_router_default_model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">4o</span><br></span></code></pre></div></div>
<p><strong>→ Learn more:</strong> <a href="https://docs.litellm.ai/docs/proxy/auto_routing#complexity-router">Complexity Router</a> · <a href="https://docs.litellm.ai/docs/proxy/auto_routing">Semantic Auto Routing</a> · <a href="https://docs.litellm.ai/docs/adaptive_router">Adaptive Router</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="stacking-the-levers">Stacking the levers<a href="https://docs.litellm.ai/en/blog/save-claude-code-costs-with-litellm#stacking-the-levers" class="hash-link" aria-label="Direct link to Stacking the levers" title="Direct link to Stacking the levers">​</a></h2>
<p>The five features compose. Budget-based fallbacks bound the total spend regardless of what else you do. Prompt cache checkpoints and Headroom compression each shave a different slice of the request payload before it hits the model. MCP tool search cuts the tool schema overhead at the front of every turn. Auto routing sends every request to the smallest model that can handle it. Turn them on together and the same Claude Code workload runs on a fraction of the input tokens it did before, without touching a single developer machine.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="help-us-make-this-better">Help us make this better<a href="https://docs.litellm.ai/en/blog/save-claude-code-costs-with-litellm#help-us-make-this-better" class="hash-link" aria-label="Direct link to Help us make this better" title="Direct link to Help us make this better">​</a></h2>
<p>We're actively investing in cost optimization across the whole stack. If you've got ideas, on auto routing, better cache heuristics, smarter budget policies, anything, join the discussion at <a href="https://github.com/BerriAI/litellm/discussions/32172" target="_blank" rel="noopener noreferrer">litellm#32172</a>.</p>]]></content>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <category label="claude-code" term="claude-code"/>
        <category label="cost" term="cost"/>
        <category label="budgets" term="budgets"/>
        <category label="headroom" term="headroom"/>
        <category label="mcp" term="mcp"/>
        <category label="prompt-caching" term="prompt-caching"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Day 0 Support: Claude Sonnet 5]]></title>
        <id>https://docs.litellm.ai/en/blog/claude_sonnet_5</id>
        <link href="https://docs.litellm.ai/en/blog/claude_sonnet_5"/>
        <updated>2026-06-30T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[Day 0 support for Claude Sonnet 5 on the LiteLLM AI Gateway. Use it across Anthropic, Azure, Vertex AI, and Bedrock.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="LiteLLM x Claude Sonnet 5" src="https://docs.litellm.ai/en/assets/images/litellm_claude_sonnet_5_announcement-72d68fa72362d60463791439896e3c9d.png" width="4800" height="2508" class="img_ev3q"></p>
<p>LiteLLM now supports <a href="https://www.anthropic.com/news/claude-sonnet-5" target="_blank" rel="noopener noreferrer">Claude Sonnet 5</a> on Day 0. Use it across Anthropic, Azure, Vertex AI, and Bedrock through the LiteLLM AI Gateway. Call it with the same OpenAI-compatible request you already use, and track spend, rate limits, and logging in one place.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-new-in-sonnet-5">What's new in Sonnet 5<a href="https://docs.litellm.ai/en/blog/claude_sonnet_5#whats-new-in-sonnet-5" class="hash-link" aria-label="Direct link to What's new in Sonnet 5" title="Direct link to What's new in Sonnet 5">​</a></h2>
<p>Sonnet 5 is the most agentic Sonnet model yet, with performance close to Opus 4.8 at a fraction of the price. A few things stand out for teams running it through a gateway:</p>
<ul>
<li><strong>Opus-class quality, Sonnet pricing.</strong> Anthropic reports Sonnet 5 performs close to Opus 4.8 while costing far less, and is a substantial step up from Sonnet 4.6 on reasoning, tool use, coding, and knowledge work. (<a href="https://www.anthropic.com/news/claude-sonnet-5" target="_blank" rel="noopener noreferrer">details from Anthropic</a>)</li>
<li><strong>Built to run agents.</strong> It plans, drives tools like browsers and terminals, runs autonomously, and checks its own output without being asked, finishing complex tasks where earlier Sonnet models would stop short. Anthropic highlights gains on BrowseComp (agentic search) and OSWorld-Verified (computer use).</li>
<li><strong>Adaptive thinking only.</strong> Sonnet 5 decides how deeply to think on its own. You steer it per request with <code>reasoning_effort</code> or <code>output_config.effort</code>; fixed thinking budgets, <code>temperature</code>, <code>top_p</code>, and assistant message prefill are not supported by the model.</li>
<li><strong>$3 / MTok input and $15 / MTok output</strong>, with prompt caching at $0.30 / MTok (read) and $3.75 / MTok (write). Anthropic is running introductory pricing of $2 / MTok input and $10 / MTok output through August 31, 2026. On Bedrock, the <code>us.</code>, <code>eu.</code>, <code>au.</code>, and <code>jp.</code> inference profiles carry the usual 10% regional premium while <code>global.</code> stays at base price; LiteLLM tracks every variant automatically.</li>
<li><strong>1M-token context</strong>, up to 128K output tokens.</li>
<li><strong>One gateway, every surface.</strong> Vision, PDF input, computer use, tool calling, prompt caching, adaptive thinking, and structured output, all available across Anthropic, Azure, Vertex AI, and Bedrock with unified spend tracking, logging, and fallbacks.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="enabling-sonnet-5">Enabling Sonnet 5<a href="https://docs.litellm.ai/en/blog/claude_sonnet_5#enabling-sonnet-5" class="hash-link" aria-label="Direct link to Enabling Sonnet 5" title="Direct link to Enabling Sonnet 5">​</a></h2>
<p>Sonnet 5 ships in the <strong><code>v1.92.0-dev.1</code></strong> image (and every release after it). How you pick it up depends on where your proxy reads pricing from:</p>
<ul>
<li>
<p><strong>Default (remote cost map): no upgrade needed.</strong> In the LiteLLM UI, open the <strong>Price Data</strong> tab under <strong>Models + Endpoints</strong> and click <strong>Reload Price Data</strong> (or, as a proxy admin, <code>POST /reload/model_cost_map</code>). This refetches the latest pricing from LiteLLM's cost map <strong>and</strong> re-registers provider routing in one step, so <code>claude-sonnet-5</code> becomes available across Anthropic, Azure, Vertex AI, and Bedrock, even if you're on an older proxy version.</p>
</li>
<li>
<p><strong>Running <code>LITELLM_LOCAL_MODEL_COST_MAP=true</code>?</strong> The cost map is baked into the image, so the Reload button won't reach it. Pull <code>v1.92.0-dev.1</code> or later to get the bundled Sonnet 5 metadata:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">docker pull ghcr.io/berriai/litellm:v1.92.0-dev.1</span><br></span></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="usage">Usage<a href="https://docs.litellm.ai/en/blog/claude_sonnet_5#usage" class="hash-link" aria-label="Direct link to Usage" title="Direct link to Usage">​</a></h2>
<p>Pick your provider below. Each tab wires up <code>claude-sonnet-5</code> for that provider; the request you send afterward is identical everywhere.</p>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Anthropic</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Azure</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Vertex AI</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Bedrock</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><strong>1. Setup config.yaml</strong></p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> anthropic/claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/ANTHROPIC_API_KEY</span><br></span></code></pre></div></div><p><strong>2. Start the proxy</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">docker run -d \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -p 4000:4000 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -v $(pwd)/config.yaml:/app/config.yaml \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:v1.92.0-dev.1 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --config /app/config.yaml</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><strong>1. Setup config.yaml</strong></p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> azure_ai/claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AZURE_AI_API_KEY</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_base</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AZURE_AI_API_BASE  </span><span class="token comment" style="color:rgb(0, 128, 0)"># https://&lt;resource&gt;.services.ai.azure.com</span><br></span></code></pre></div></div><p><strong>2. Start the proxy</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">docker run -d \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -p 4000:4000 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e AZURE_AI_API_KEY=$AZURE_AI_API_KEY \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e AZURE_AI_API_BASE=$AZURE_AI_API_BASE \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -v $(pwd)/config.yaml:/app/config.yaml \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:v1.92.0-dev.1 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --config /app/config.yaml</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><strong>1. Setup config.yaml</strong></p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> vertex_ai/claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">vertex_project</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/VERTEX_PROJECT</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">vertex_location</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> global</span><br></span></code></pre></div></div><p><strong>2. Start the proxy</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">docker run -d \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -p 4000:4000 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e VERTEX_PROJECT=$VERTEX_PROJECT \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e GOOGLE_APPLICATION_CREDENTIALS=/app/credentials.json \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -v $(pwd)/config.yaml:/app/config.yaml \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -v $(pwd)/credentials.json:/app/credentials.json \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:v1.92.0-dev.1 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --config /app/config.yaml</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><strong>1. Setup config.yaml</strong></p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> bedrock/anthropic.claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">sonnet</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">aws_access_key_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AWS_ACCESS_KEY_ID</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">aws_secret_access_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AWS_SECRET_ACCESS_KEY</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">aws_region_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> us</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">east</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><br></span></code></pre></div></div><div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>For cross-region routing, swap the model ID for a regional inference profile (<code>us.</code>, <code>eu.</code>, <code>au.</code>, or <code>jp.</code> prefix), e.g. <code>bedrock/converse/us.anthropic.claude-sonnet-5</code>. These carry a 10% regional premium; the <code>global.</code> profile stays at base price. LiteLLM tracks the cost of each variant automatically.</p></div></div><p><strong>2. Start the proxy</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">docker run -d \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -p 4000:4000 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -v $(pwd)/config.yaml:/app/config.yaml \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:v1.92.0-dev.1 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --config /app/config.yaml</span><br></span></code></pre></div></div></div></div></div>
<p><strong>3. Test it!</strong></p>
<p>The request is the same regardless of which provider you configured above:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl --location 'http://0.0.0.0:4000/chat/completions' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Content-Type: application/json' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Authorization: Bearer $LITELLM_KEY' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--data '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "model": "claude-sonnet-5",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "messages": [</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "role": "user",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "content": "what llm are you"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ]</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">}'</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>Mateo Wang</name>
            <uri>https://www.linkedin.com/in/mateo-wang</uri>
        </author>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <category label="anthropic" term="anthropic"/>
        <category label="claude" term="claude"/>
        <category label="sonnet 5" term="sonnet 5"/>
        <category label="day 0 support" term="day 0 support"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[LiteLLM × Headroom: Use 60-95% fewer tokens with Claude Code]]></title>
        <id>https://docs.litellm.ai/en/blog/headroom-integration</id>
        <link href="https://docs.litellm.ai/en/blog/headroom-integration"/>
        <updated>2026-06-30T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[Cut input tokens on Claude Code and other LLM traffic by attaching Headroom as a pre_call guardrail on LiteLLM.]]></summary>
        <content type="html"><![CDATA[<p><a href="https://headroomlabs-ai.github.io/headroom/" target="_blank" rel="noopener noreferrer">Headroom</a> now runs as a native guardrail on the LiteLLM proxy, compressing tool outputs, RAG payloads, database results, and file reads before they reach the model.</p>
<!-- -->
<p>Long-context agents burn most of their input budget on repeated tool output, retrieved chunks, and stale scratch state. Headroom intelligently rewrites that content so the model sees the same information at a fraction of the tokens.</p>
<p>If the model needs the full context, LiteLLM will also pass a 'retrieve_headroom' tool to the model, to retrieve the full context from Headroom.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-is-it-deployed">How is it deployed?<a href="https://docs.litellm.ai/en/blog/headroom-integration#how-is-it-deployed" class="hash-link" aria-label="Direct link to How is it deployed?" title="Direct link to How is it deployed?">​</a></h2>
<p>Headroom runs as a sidecar to LiteLLM. Client traffic still hits the LiteLLM gateway; LiteLLM invokes Headroom during the <code>pre_call</code> step, swaps in the compressed messages, and forwards the payload upstream. Clients and the LLM provider never talk to Headroom directly.</p>
<p>The benefit of this is two-fold</p>
<ul>
<li><strong>Convenience:</strong> Users get 1 api base regardless of if they use prompt compression or not.</li>
<li><strong>Reliability:</strong> If Headroom goes down, your LLM calls are unaffected.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Client to LiteLLM to LLM, with Headroom attached to LiteLLM as a sidecar" src="https://docs.litellm.ai/en/assets/images/headroom_architecture-99994a5782fe58e170e2789f031c104c.png" width="1960" height="882" class="img_ev3q"></p>
<p>Compression works on both <code>/v1/chat/completions</code> and <code>/v1/messages</code> (Anthropic format), which makes the Claude Code rollout a one-liner for the admin: attach <code>headroom-compression</code> to a virtual key, hand it to the developer, and every request they make through <code>ANTHROPIC_BASE_URL</code> gets compressed automatically. No client-side change, no code diff.</p>
<p>Turn it on per key, per request, or globally via <code>default_on: true</code>. Confirm it ran by checking the <code>x-litellm-applied-guardrails</code> response header or the Guardrails panel in the Logs UI.</p>
<p><strong>Get started:</strong> <a href="https://docs.litellm.ai/docs/proxy/headroom">Headroom guardrail setup guide</a> (requires LiteLLM v1.92.x or later; for testing ahead of the stable cut, grab the <a href="https://github.com/BerriAI/litellm/releases/tag/v1.92.0-dev.1" target="_blank" rel="noopener noreferrer">v1.92.0-dev.1</a> dev release)</p>
<p><strong>Discussion:</strong> <a href="https://github.com/BerriAI/litellm/discussions/31816" target="_blank" rel="noopener noreferrer">GitHub discussion #31816</a></p>]]></content>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <category label="partnership" term="partnership"/>
        <category label="guardrails" term="guardrails"/>
        <category label="context" term="context"/>
        <category label="headroom" term="headroom"/>
        <category label="claude-code" term="claude-code"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[June Townhall Updates: 94 Bug Fixes, OCR + Realtime are in Rust, and a Zero-Regression Commitment]]></title>
        <id>https://docs.litellm.ai/en/blog/june-townhall-updates</id>
        <link href="https://docs.litellm.ai/en/blog/june-townhall-updates"/>
        <updated>2026-06-26T12:00:00.000Z</updated>
        <summary type="html"><![CDATA[A recap of the June LiteLLM town hall covering security hardening, our zero-regression commitment, 78 feature commits, and the gradual migration of the gateway to Rust.]]></summary>
        <content type="html"><![CDATA[<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAECAIAAAA4WjmaAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAYUlEQVR4nC3MSQ6AIBAAQV7jwkkZ56iAsigjAv//jBFJ6tZJM0AulnGGYRJd1f9mGAA5kwrDrVN2T3ZXUGeQMZlSzpiMVFgz6VQ8xSOQtn6le3+ypbhvChkg/87Qng20+Quqoht1WlOEsgAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="248"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/en/assets/ideal-img/june_townhall_updates_banner.2d69c8c.640.png srcset="/en/assets/ideal-img/june_townhall_updates_banner.2d69c8c.640.png 640w,/en/assets/ideal-img/june_townhall_updates_banner.a0513d3.1280.png 1280w" width=640 height=248></noscript></div>
<p>Thank you to everyone who joined our June town hall.</p>
<p>Three numbers capture the month: <strong>24 security fixes</strong>, <strong>94 bug fixes</strong>, and <strong>78 feature commits</strong>. The sections below break each one down, alongside our public commitment to zero reported regressions and the gradual migration of the LiteLLM gateway to Rust.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="security-updates">Security updates<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#security-updates" class="hash-link" aria-label="Direct link to Security updates" title="Direct link to Security updates">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="last-4-weeks-by-the-numbers">Last 4 weeks: by the numbers<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#last-4-weeks-by-the-numbers" class="hash-link" aria-label="Direct link to Last 4 weeks: by the numbers" title="Direct link to Last 4 weeks: by the numbers">​</a></h3>
<table><thead><tr><th>Metric</th><th>Count</th></tr></thead><tbody><tr><td>Vulnerabilities patched</td><td><strong>24</strong></td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="bug-bounty--now-live">Bug bounty — now live<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#bug-bounty--now-live" class="hash-link" aria-label="Direct link to Bug bounty — now live" title="Direct link to Bug bounty — now live">​</a></h3>
<p>We pay for security reports.</p>
<ul>
<li><strong>Scope</strong> — the LiteLLM gateway and SDK.</li>
<li><strong>Submit</strong> via <a href="https://github.com/BerriAI/litellm/security" target="_blank" rel="noopener noreferrer">private vulnerability report on GitHub</a>.</li>
<li><strong>Triaged</strong> by maintainers and the Veria Labs security team.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="automated-review-on-every-pr">Automated review on every PR<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#automated-review-on-every-pr" class="hash-link" aria-label="Direct link to Automated review on every PR" title="Direct link to Automated review on every PR">​</a></h3>
<p>Every PR gets a security pass. Look for the <strong>Veria scan</strong> — it's a required check on every PR, built on Veria AI + zizmor + semgrep. False positives are flagged, never blocking.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next-for-security">What's next for security<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#whats-next-for-security" class="hash-link" aria-label="Direct link to What's next for security" title="Direct link to What's next for security">​</a></h3>
<ul>
<li>Invest more in the bug bounty program.</li>
<li>Improve code patterns during the stability sprint.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="stability-updates">Stability updates<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#stability-updates" class="hash-link" aria-label="Direct link to Stability updates" title="Direct link to Stability updates">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-commitment-zero-reported-regressions-by-august-29th">The commitment: zero reported regressions by August 29th<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#the-commitment-zero-reported-regressions-by-august-29th" class="hash-link" aria-label="Direct link to The commitment: zero reported regressions by August 29th" title="Direct link to The commitment: zero reported regressions by August 29th">​</a></h3>
<p>The goal:</p>
<ul>
<li>Close 20 reported bugs in core functionality.</li>
<li>Fix root causes in 3 high-impact components.</li>
<li>Ship a public progress report alongside the August 29 release.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="94-bug-fixes-done">94 bug fixes done<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#94-bug-fixes-done" class="hash-link" aria-label="Direct link to 94 bug fixes done" title="Direct link to 94 bug fixes done">​</a></h3>
<p>Fixes shipped across five areas:</p>
<ul>
<li>Proxy core &amp; resilience — 22 fixes</li>
<li>UI + Auth / SSO — 22 fixes</li>
<li>Cost, Budgets &amp; Observability — 21 fixes</li>
<li>MCP Gateway — 15 fixes</li>
<li>Streaming / Realtime APIs — 14 fixes</li>
</ul>
<p><strong>What kinds of fixes shipped:</strong></p>
<ul>
<li><strong>Billing accuracy.</strong> Closed the gaps where spend slipped through — virtual-key limits are now enforced, and cached and tiered usage on Anthropic and Bedrock is priced correctly.</li>
<li><strong>Identity &amp; access.</strong> Caller identity now resolves once into a single record, so team IDs and spend attribution stay correct and auth no longer fails open on DB errors.</li>
<li><strong>MCP reliability.</strong> Tools now list and call consistently across every auth method, with per-user credentials and proper OAuth token refresh.</li>
<li><strong>Resource leaks.</strong> Guardrails no longer re-initialize on every request, eliminating the runner leaks, latency spikes, and OOMs they caused.</li>
<li><strong>Resilience.</strong> Streaming requests recover cost on interruption, the proxy self-heals on dropped DB connections, and OTEL metrics no longer overload Splunk.</li>
</ul>
<p><strong>Root causes, not just symptoms:</strong></p>
<ul>
<li><strong>MCP authentication</strong> — 5 separate code paths, one per auth method, caused inconsistent tool listing and calling. Fix: a single unified code path resolves credentials across all auth methods.</li>
<li><strong>AI gateway auth</strong> — 5+ DB lookups per request to resolve key/user/team identity. Fix: caller identity resolves once into a single record — lookups cut roughly in half.</li>
<li><strong>UI forms</strong> — saving a form could overwrite unrelated fields. Fix: frontend and backend types are 100% in sync from a shared source, so only edited fields change on save.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="public-timeline">Public timeline<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#public-timeline" class="hash-link" aria-label="Direct link to Public timeline" title="Direct link to Public timeline">​</a></h3>
<p>Bug triage is open and active on <a href="https://github.com/BerriAI/litellm/issues/30484" target="_blank" rel="noopener noreferrer">GitHub issue #30484</a>.</p>
<ul>
<li><strong>NOW</strong> — 20 bugs open in core. Triage active.</li>
<li><strong>JULY</strong> — MCP auth unified to a single code path. AI gateway identity lookups cut in half.</li>
<li><strong>AUGUST</strong> — UI form types synced end-to-end. No more silent field overwrites on save.</li>
<li><strong>AUG 29</strong> — Public progress report ships with the release. Zero-regression target date.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="product-updates">Product updates<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#product-updates" class="hash-link" aria-label="Direct link to Product updates" title="Direct link to Product updates">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="78-feature-commits-in-june">78 feature commits in June<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#78-feature-commits-in-june" class="hash-link" aria-label="Direct link to 78 feature commits in June" title="Direct link to 78 feature commits in June">​</a></h3>
<p><strong>Rust</strong></p>
<ul>
<li>Rust workspace · Mistral OCR bridge</li>
<li>OpenAI Realtime translation layer</li>
</ul>
<p><strong>Sandbox API</strong></p>
<ul>
<li>E2B + OpenSandbox</li>
<li>Unified code execution API</li>
</ul>
<p><strong>New models/providers</strong></p>
<ul>
<li>TinyFish · Fal.ai · Fireworks AI</li>
<li>Cloudflare Workers AI · MAI-Image-2.5</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="performance-moving-litellm-to-rust">Performance: moving LiteLLM to Rust<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#performance-moving-litellm-to-rust" class="hash-link" aria-label="Direct link to Performance: moving LiteLLM to Rust" title="Direct link to Performance: moving LiteLLM to Rust">​</a></h3>
<p>We're migrating the LiteLLM gateway to Rust, and the early numbers make the case:</p>
<table><thead><tr><th>Metric</th><th>Rust gateway</th><th>LiteLLM (Python)</th><th>Improvement</th></tr></thead><tbody><tr><td>Per-request overhead</td><td>0.05ms</td><td>7.5ms</td><td>~150x lower</td></tr><tr><td>Throughput under load</td><td>6,782 req/s</td><td>453 req/s</td><td>15x</td></tr><tr><td>Peak memory under load</td><td>32MB</td><td>359MB</td><td>11x lighter</td></tr></tbody></table>
<p><em>Per-request overhead measured at 10 concurrent clients vs. a local mock upstream; throughput and memory under sustained load at 50 concurrent clients. Reproducible harness checked in.</em></p>
<p><strong>How the migration works:</strong> a staged rollout, moving piece by piece from a pure Python SDK + FastAPI proxy, to Python driving Rust transforms via PyO3, to a FastAPI shell with pure Rust on the hot path, to an all-Rust async server (axum).</p>
<p><strong>A gradual rollout</strong> — one route at a time, proven in production before the next begins. Same config, database, and API: nothing for you to change.</p>
<ul>
<li><strong>Aug 15</strong> — OCR routes: Mistral first, then all OCR.</li>
<li><strong>Sep 1</strong> — <code>/messages</code>, then <code>/chat/completions</code>.</li>
<li><strong>Sep 15</strong> — The router: load balancing, fallbacks, retries, cooldowns.</li>
<li><strong>Dec 1</strong> — The full server: FastAPI thin shell, then pure Rust (axum).</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="announcing-our-version-policy">Announcing our version policy<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#announcing-our-version-policy" class="hash-link" aria-label="Direct link to Announcing our version policy" title="Direct link to Announcing our version policy">​</a></h3>
<p>Going forward, we'll maintain only the four most recent stable minor releases. This takes effect <strong>next Monday, June 29th</strong>. Our focus is ensuring stability on the most up-to-date product offerings — bookmark our <a href="https://docs.litellm.ai/release_notes" target="_blank" rel="noopener noreferrer">Release Notes</a> to stay current.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next">​</a></h2>
<p>Thank you again for all the questions and feedback. We'll keep sharing concrete progress updates as these efforts ship — especially as we approach the August 29 zero-regression milestone.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="hiring">Hiring<a href="https://docs.litellm.ai/en/blog/june-townhall-updates#hiring" class="hash-link" aria-label="Direct link to Hiring" title="Direct link to Hiring">​</a></h2>
<p>We are actively hiring across several roles — apply <a href="https://jobs.ashbyhq.com/litellm" target="_blank" rel="noopener noreferrer">here</a> if you're interested!</p>
<p>Thank you for using LiteLLM - Krrish &amp; Ishaan</p>]]></content>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <category label="townhall" term="townhall"/>
        <category label="security" term="security"/>
        <category label="reliability" term="reliability"/>
        <category label="product" term="product"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Swap OpenAI Code Interpreter for E2B/OpenSandbox]]></title>
        <id>https://docs.litellm.ai/en/blog/swap_openai_code_interpreter</id>
        <link href="https://docs.litellm.ai/en/blog/swap_openai_code_interpreter"/>
        <updated>2026-06-23T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[Keep the OpenAI code_interpreter tool in your requests, run the code in your own sandbox. LiteLLM intercepts the tool call and routes it to E2B or OpenSandbox; no client changes.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Swap OpenAI Code Interpreter with E2B" src="https://docs.litellm.ai/en/assets/images/hero-e599b9dabee2c3b4ff42e7360688be0e.png" width="3320" height="1526" class="img_ev3q"></p>
<p>The OpenAI Responses and Chat Completions APIs let you declare a <code>code_interpreter</code> tool and the model runs Python inside an OpenAI-hosted container. That container is opaque, billed by OpenAI, and the code (often customer data) leaves your perimeter. LiteLLM now let's you intercept that tool call and runs it in a sandbox you control. The client request is unchanged.</p>
<p>Available starting <code>LiteLLM v1.91.0.dev1</code>. Check here for <a href="https://github.com/BerriAI/litellm/releases" target="_blank" rel="noopener noreferrer">releases</a>.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-the-swap-works">How the swap works<a href="https://docs.litellm.ai/en/blog/swap_openai_code_interpreter#how-the-swap-works" class="hash-link" aria-label="Direct link to How the swap works" title="Direct link to How the swap works">​</a></h2>
<p>Register a sandbox tool, enable the interceptor, then call the model the way you already do. When the model emits a <code>code_interpreter</code> tool call, LiteLLM creates a sandbox (E2B or OpenSandbox), executes the generated code, feeds the result back into the loop, and tears the sandbox down on completion. The response shape stays compatible with OpenAI's native <code>code_interpreter_call</code>.</p>
<p>Two backends are supported today: <a href="https://e2b.dev/" target="_blank" rel="noopener noreferrer">E2B</a> for a managed sandbox, and <a href="https://github.com/opensandboxai/opensandbox" target="_blank" rel="noopener noreferrer">OpenSandbox</a> for self-hosted Docker-backed execution when the code or data cannot leave your network.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="sdk">SDK<a href="https://docs.litellm.ai/en/blog/swap_openai_code_interpreter#sdk" class="hash-link" aria-label="Direct link to SDK" title="Direct link to SDK">​</a></h2>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Responses API</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Chat Completions</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> litellm</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">sandbox</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">sandbox_tools </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> register_sandbox_tools</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">integrations</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">code_interpreter_interception</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">handler </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    CodeInterpreterInterceptionLogger</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">environ</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"E2B_API_KEY"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"e2b_..."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">environ</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"OPENAI_API_KEY"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"sk-..."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">register_sandbox_tools</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"sandbox_tool_name"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"my-e2b"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"litellm_params"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"sandbox_provider"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"e2b"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"api_key"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"os.environ/E2B_API_KEY"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">callbacks </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    CodeInterpreterInterceptionLogger</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">sandbox_tool_name</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"my-e2b"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">response </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">aresponses</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"openai/gpt-5"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    tools</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"type"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"code_interpreter"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"container"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"type"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"auto"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token builtin" style="color:rgb(0, 112, 193)">input</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"Product of first 6 primes. Just the number."</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">response</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">output_text</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> litellm</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">sandbox</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">sandbox_tools </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> register_sandbox_tools</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">integrations</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">code_interpreter_interception</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">handler </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    CodeInterpreterInterceptionLogger</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">environ</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"E2B_API_KEY"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"e2b_..."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">environ</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"OPENAI_API_KEY"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"sk-..."</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">register_sandbox_tools</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"sandbox_tool_name"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"my-e2b"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"litellm_params"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"sandbox_provider"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"e2b"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"api_key"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"os.environ/E2B_API_KEY"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">callbacks </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    CodeInterpreterInterceptionLogger</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">sandbox_tool_name</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"my-e2b"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">response </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">acompletion</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"openai/gpt-4o-mini"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    messages</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"role"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"user"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"content"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"Product of first 6 primes. Just the number."</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    tools</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"type"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"code_interpreter"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"container"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"type"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"auto"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    max_agentic_loops</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">response</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">choices</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div></div></div></div>
<p>The native <code>code_interpreter</code> tool is rewritten before it reaches OpenAI; on the chat path it becomes a <code>litellm_code_execution</code> function tool and LiteLLM appends each sandbox result as a <code>role: tool</code> message until the model returns a final answer.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="proxy">Proxy<a href="https://docs.litellm.ai/en/blog/swap_openai_code_interpreter#proxy" class="hash-link" aria-label="Direct link to Proxy" title="Direct link to Proxy">​</a></h2>
<p>Same swap behind the AI gateway, with no client-side change.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">config.yaml</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> openai/gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/OPENAI_API_KEY</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token key atrule">sandbox_tools</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">sandbox_tool_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> my</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">e2b</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">sandbox_provider</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> e2b</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/E2B_API_KEY</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token key atrule">litellm_settings</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token key atrule">callbacks</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"code_interpreter_interception"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token key atrule">code_interpreter_interception_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">sandbox_tool_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> my</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">e2b</span><br></span></code></pre></div></div>
<p>The OpenAI SDK keeps working unchanged. Point it at the proxy, declare <code>code_interpreter</code>, and the gateway handles the rest.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> openai </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> OpenAI</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">client </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> OpenAI</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">api_key</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"sk-1234"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> base_url</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"http://localhost:4000/v1"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">response </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> client</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">responses</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">create</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"gpt-5"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    tools</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"type"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"code_interpreter"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"container"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"type"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"auto"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token builtin" style="color:rgb(0, 112, 193)">input</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"Product of first 6 primes. Just the number."</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">response</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">output_text</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div>
<p>To run fully on-prem, swap the <code>sandbox_tools</code> entry to OpenSandbox:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">sandbox_tools</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">sandbox_tool_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> my</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">opensandbox</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">sandbox_provider</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> opensandbox</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_base</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/OPEN_SANDBOX_API_BASE</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/OPEN_SANDBOX_API_KEY</span><br></span></code></pre></div></div>
<p>OpenSandbox runs sandboxes locally with egress denied by default; flip <code>allow_internet_access=True</code> or pass an explicit <code>network_policy</code> when the code needs the network.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-route-it-through-your-own-sandbox">Why route it through your own sandbox<a href="https://docs.litellm.ai/en/blog/swap_openai_code_interpreter#why-route-it-through-your-own-sandbox" class="hash-link" aria-label="Direct link to Why route it through your own sandbox" title="Direct link to Why route it through your own sandbox">​</a></h2>
<p>You keep the OpenAI client contract while owning the execution layer. The generated code and any uploaded data stay inside the sandbox you operate, billing for execution stops going to OpenAI, and the same setup works for Responses and Chat Completions across any model the gateway routes to. Streaming, forced <code>tool_choice</code>, and concurrent requests are isolated per request and cleaned up on completion.</p>
<p>Full reference is in the <a href="https://docs.litellm.ai/en/docs/sandbox">sandbox docs</a>.</p>]]></content>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <category label="code interpreter" term="code interpreter"/>
        <category label="sandbox" term="sandbox"/>
        <category label="e2b" term="e2b"/>
        <category label="opensandbox" term="opensandbox"/>
        <category label="agents" term="agents"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Migrating LiteLLM to Rust - Building the Fastest and Litest AI Gateway]]></title>
        <id>https://docs.litellm.ai/en/blog/litellm-rust-launch</id>
        <link href="https://docs.litellm.ai/en/blog/litellm-rust-launch"/>
        <updated>2026-06-22T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[LiteLLM is moving its AI gateway to Rust: 15x throughput, 11x less memory, and sub-1ms per-request overhead. No v2, no migration, your config stays the same.]]></summary>
        <content type="html"><![CDATA[<figure style="margin:0 0 2rem 0"><div style="background:#3a3a2e;border-radius:12px;overflow:hidden;aspect-ratio:1200 / 500;width:100%"><svg viewBox="0 0 1200 500" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" style="display:block" role="img" aria-label="A wide bundle of thin lines on the left funnels down and collapses into one small glowing core on the right, a large Python gateway shrinking into a small, fast Rust binary."><defs><radialGradient id="rustGlow" cx="50%" cy="50%" r="50%"><stop offset="0%" stop-color="#f0a35e" stop-opacity="0.9"></stop><stop offset="50%" stop-color="#d97a3d" stop-opacity="0.35"></stop><stop offset="100%" stop-color="#d97a3d" stop-opacity="0"></stop></radialGradient></defs><ellipse cx="150" cy="250" rx="14" ry="215" fill="none" stroke="#faf9f5" stroke-width="0.8" stroke-opacity="0.1"></ellipse><ellipse cx="360" cy="250" rx="14" ry="150" fill="none" stroke="#faf9f5" stroke-width="0.8" stroke-opacity="0.085"></ellipse><ellipse cx="560" cy="250" rx="14" ry="95" fill="none" stroke="#faf9f5" stroke-width="0.8" stroke-opacity="0.07"></ellipse><ellipse cx="740" cy="250" rx="14" ry="52" fill="none" stroke="#faf9f5" stroke-width="0.8" stroke-opacity="0.06"></ellipse><path d="M 0 22 Q 540 181.60000000000002, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.16" stroke-linecap="round"></path><path d="M 0 34.666666666666664 Q 540 185.4, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.1789" stroke-linecap="round"></path><path d="M 0 47.33333333333333 Q 540 189.2, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.1978" stroke-linecap="round"></path><path d="M 0 60 Q 540 193, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.2167" stroke-linecap="round"></path><path d="M 0 72.66666666666666 Q 540 196.8, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.2356" stroke-linecap="round"></path><path d="M 0 85.33333333333334 Q 540 200.6, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.2544" stroke-linecap="round"></path><path d="M 0 98 Q 540 204.4, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.2733" stroke-linecap="round"></path><path d="M 0 110.66666666666667 Q 540 208.20000000000002, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.2922" stroke-linecap="round"></path><path d="M 0 123.33333333333333 Q 540 212, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.3111" stroke-linecap="round"></path><path d="M 0 136 Q 540 215.8, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.33" stroke-linecap="round"></path><path d="M 0 148.66666666666669 Q 540 219.60000000000002, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.3489" stroke-linecap="round"></path><path d="M 0 161.33333333333334 Q 540 223.4, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.3678" stroke-linecap="round"></path><path d="M 0 174 Q 540 227.2, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.3867" stroke-linecap="round"></path><path d="M 0 186.66666666666666 Q 540 231, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4056" stroke-linecap="round"></path><path d="M 0 199.33333333333334 Q 540 234.8, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4244" stroke-linecap="round"></path><path d="M 0 212 Q 540 238.6, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4433" stroke-linecap="round"></path><path d="M 0 224.66666666666666 Q 540 242.4, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4622" stroke-linecap="round"></path><path d="M 0 237.33333333333331 Q 540 246.2, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4811" stroke-linecap="round"></path><path d="M 0 250 Q 540 250, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.5" stroke-linecap="round"></path><path d="M 0 262.6666666666667 Q 540 253.8, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4811" stroke-linecap="round"></path><path d="M 0 275.33333333333337 Q 540 257.6, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4622" stroke-linecap="round"></path><path d="M 0 288 Q 540 261.4, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4433" stroke-linecap="round"></path><path d="M 0 300.6666666666667 Q 540 265.2, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4244" stroke-linecap="round"></path><path d="M 0 313.3333333333333 Q 540 269, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4056" stroke-linecap="round"></path><path d="M 0 326 Q 540 272.8, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.3867" stroke-linecap="round"></path><path d="M 0 338.66666666666663 Q 540 276.59999999999997, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.3678" stroke-linecap="round"></path><path d="M 0 351.3333333333333 Q 540 280.4, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.3489" stroke-linecap="round"></path><path d="M 0 364 Q 540 284.2, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.33" stroke-linecap="round"></path><path d="M 0 376.6666666666667 Q 540 288, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.3111" stroke-linecap="round"></path><path d="M 0 389.33333333333337 Q 540 291.8, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.2922" stroke-linecap="round"></path><path d="M 0 402 Q 540 295.6, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.2733" stroke-linecap="round"></path><path d="M 0 414.6666666666667 Q 540 299.4, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.2544" stroke-linecap="round"></path><path d="M 0 427.3333333333333 Q 540 303.2, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.2356" stroke-linecap="round"></path><path d="M 0 440 Q 540 307, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.2167" stroke-linecap="round"></path><path d="M 0 452.66666666666663 Q 540 310.79999999999995, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.1978" stroke-linecap="round"></path><path d="M 0 465.3333333333333 Q 540 314.6, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.1789" stroke-linecap="round"></path><path d="M 0 478 Q 540 318.4, 1000 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.16" stroke-linecap="round"></path><circle cx="1000" cy="250" r="34" fill="url(#rustGlow)"></circle><circle cx="1000" cy="250" r="5.5" fill="#f4b079" opacity="0.98"></circle></svg></div></figure>
<p><em>Last Updated: June 2026</em></p>
<p>Over the past year, we have heard the same thing from our users and our community: they want the fastest, most lightweight AI gateway they can run. We have heard you. We are addressing it by moving LiteLLM to Rust, and committing to sub-<code>1ms</code> overhead with a sub-<code>100MB</code> memory binary you can deploy. By the end of this migration, you will get a pure Rust server that can serve 100% of your AI traffic, with every hot path operation, including auth and rate limiting, running in Rust.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Want to help us build it?</div><div class="admonitionContent_BuS1"><p>We are opening an early beta and want to work directly with teams who care about a fast, lightweight gateway. If that is you, <a href="https://docs.google.com/forms/d/e/1FAIpQLSecWdOjkzjEson2UiZpDftOoZPs8RQbtlAM40KSvDXZqEgYaA/viewform?usp=dialog" target="_blank" rel="noopener noreferrer">sign up here</a> and we will get you testing the Rust gateway in your own stack, with a direct line to our team.</p></div></div>
<p>The reason it matters: under real load, CPU and memory climb with concurrency, and pods get OOM-killed at the worst time. Today the LiteLLM Python proxy peaks around <code>359MB</code> of memory under load, and that cost multiplies across every pod, region, and retry you run.</p>
<p>We are already seeing the payoff in benchmarks. The Rust gateway serves about <code>15x</code> the throughput (<code>453</code> to <code>6,782</code> requests per second) on about <code>11x</code> less memory (<code>359MB</code> to <code>32MB</code>), and cuts per-request overhead from about <code>7.5ms</code> on the Python path to about <code>0.05ms</code>, well under the <code>1ms</code> we commit to.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-you-get">What you get<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#what-you-get" class="hash-link" aria-label="Direct link to What you get" title="Direct link to What you get">​</a></h2>
<p>You deploy a single Rust binary. It uses about <code>65MB</code> of memory, gateway overhead stays under <code>1ms</code>, and nothing in your setup changes: same <code>config.yaml</code>, same database, same client API, same providers. You keep LiteLLM's coverage of 100+ LLM providers behind one OpenAI-compatible API, with <code>/chat/completions</code>, <code>/messages</code>, <code>/responses</code>, and every other LLM endpoint LiteLLM supports today, now as the fastest and most lightweight LLM gateway you can self-host.</p>
<p>This is not a v2 and not a rewrite. There is no new major version to migrate to and nothing for you to change. The runtime under the hot path gets faster and lighter while your config stays exactly where it is.</p>
<p>We ship this the careful way. Each route moves to Rust only after it passes our full parity and end-to-end test suite, and it runs in production before the next route starts. Stability is the priority, and we target zero regressions on every release.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-fast-is-the-litellm-gateway-a-throughput-overhead-and-memory-benchmark">How fast is the LiteLLM gateway? A throughput, overhead, and memory benchmark<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#how-fast-is-the-litellm-gateway-a-throughput-overhead-and-memory-benchmark" class="hash-link" aria-label="Direct link to How fast is the LiteLLM gateway? A throughput, overhead, and memory benchmark" title="Direct link to How fast is the LiteLLM gateway? A throughput, overhead, and memory benchmark">​</a></h2>
<p><strong>Per-request overhead.</strong> We built a small harness: a mock upstream, a thin Rust forwarding gateway (axum), the same forwarding path running through LiteLLM today (<code>litellm.acompletion</code> over uvicorn), and a load client that times each request in microseconds. At <code>10</code> concurrent clients against the same mock, the Rust gateway adds about <code>0.05ms</code> of overhead per request; the LiteLLM Python path adds about <code>7.5ms</code>. That is roughly <code>150x</code> lower, and well under the <code>1ms</code> we commit to.</p>
<p><strong>Sustained load.</strong> Against the current LiteLLM Python proxy on the same <code>/v1/responses</code> workload at <code>50</code> concurrent clients, the Rust path served about <code>15x</code> the throughput on about <code>11x</code> less memory.</p>
<p><img decoding="async" loading="lazy" alt="Rust vs Python gateway benchmark: overhead, throughput, and memory" src="https://docs.litellm.ai/en/assets/images/rust_vs_python_proxy_benchmark-438fbd58fcd0bc120123da793339c06a.png" width="2222" height="821" class="img_ev3q"></p>
<table><thead><tr><th></th><th>Per-request overhead</th><th>Throughput under load</th><th>Peak memory under load</th></tr></thead><tbody><tr><td><strong>Rust gateway</strong></td><td><code>~0.05ms</code></td><td><code>6,782</code> req/s</td><td><code>31.7MB</code></td></tr><tr><td><strong>LiteLLM (Python)</strong></td><td><code>~7.5ms</code></td><td><code>453</code> req/s</td><td><code>358.9MB</code></td></tr></tbody></table>
<p>The overhead harness (mock, gateway, load client) is checked in next to this post under <a href="https://github.com/BerriAI/litellm-docs/tree/main/blog/litellm_rust_launch/benchmark" target="_blank" rel="noopener noreferrer"><code>benchmark/</code></a>, and the summarized numbers are in <a href="https://docs.litellm.ai/en/assets/files/rust_proxy_benchmark_results-bb0d4a70407b0618217e30d15e4e186b.csv" target="_blank"><code>rust_proxy_benchmark_results.csv</code></a>, so you can reproduce the sub-<code>1ms</code> result. This measures the gateway forwarding path (request transform, forwarding, response handling), not a full production workload.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-stays-the-same">What stays the same<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#what-stays-the-same" class="hash-link" aria-label="Direct link to What stays the same" title="Direct link to What stays the same">​</a></h2>
<p>Nothing you depend on changes. The migration is invisible from the outside:</p>
<ul>
<li>Your Python SDK keeps the exact same interface; the same calls now run on Rust bindings underneath.</li>
<li>Your <code>config.yaml</code> is unchanged.</li>
<li>Your database and schema are unchanged.</li>
<li>Your client API and request/response shapes are unchanged.</li>
<li>Your providers, routing, and keys are unchanged.</li>
</ul>
<p>You get lower memory and lower overhead, and you do nothing to get it.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-the-migration-works">How the migration works<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#how-the-migration-works" class="hash-link" aria-label="Direct link to How the migration works" title="Direct link to How the migration works">​</a></h2>
<p>If you just want the outcome, you have it above. The rest of this post is for engineers who want to see how we move the gateway to Rust without breaking anything.</p>
<p>The core idea is a clean split. We build one Rust core that only transforms data: it turns your request into a provider request, turns the provider response back, transforms stream chunks, counts tokens, and normalizes errors. It never opens a socket, reads a secret, or writes to your database. The host process does all of that. That separation is what lets us put Rust into production without rewriting the server, because Python keeps doing the I/O while Rust takes over the translation.</p>
<figure style="margin:2.5rem 0;font-family:inherit"><div style="border-radius:12px;border:1px solid #e5e7eb;background:#fff;padding:2rem 2.5rem;overflow-x:auto"><div style="min-width:760px"><div style="display:grid;grid-template-columns:1fr 22px 1fr 22px 1fr 22px 1fr;align-items:center"><div style="border:1.5px solid #2563eb;background:#eff6ff;border-radius:8px;padding:16px 14px;text-align:center;min-height:116px"><div style="font-size:12px;color:#2563eb;font-weight:800;margin-bottom:8px">Stage 0 · Today</div><div style="font-size:13px;color:#111827;font-weight:600;line-height:1.35">Pure Python SDK + FastAPI proxy</div><div style="font-size:11px;color:#6b7280;margin-top:10px;font-weight:600">100% Python</div></div><svg width="22" height="16" viewBox="0 0 22 16" aria-hidden="true"><path d="M1 8h14" stroke="#9ca3af" stroke-width="2"></path><path d="M13 2l8 6-8 6z" fill="#9ca3af"></path></svg><div style="border:1.5px solid #16a34a;background:#f0fdf4;border-radius:8px;padding:16px 14px;text-align:center;min-height:116px"><div style="font-size:12px;color:#16a34a;font-weight:800;margin-bottom:8px">Stage 1 · Core in Rust</div><div style="font-size:13px;color:#111827;font-weight:600;line-height:1.35">Python drives Rust transforms via PyO3</div><div style="font-size:11px;color:#6b7280;margin-top:10px;font-weight:600">V0 to V3</div></div><svg width="22" height="16" viewBox="0 0 22 16" aria-hidden="true"><path d="M1 8h14" stroke="#9ca3af" stroke-width="2"></path><path d="M13 2l8 6-8 6z" fill="#9ca3af"></path></svg><div style="border:1.5px solid #d97706;background:#fffbeb;border-radius:8px;padding:16px 14px;text-align:center;min-height:116px"><div style="font-size:12px;color:#d97706;font-weight:800;margin-bottom:8px">Stage 2 · Thin shell</div><div style="font-size:13px;color:#111827;font-weight:600;line-height:1.35">FastAPI shell, hot path all Rust</div><div style="font-size:11px;color:#6b7280;margin-top:10px;font-weight:600">V4 to V5a</div></div><svg width="22" height="16" viewBox="0 0 22 16" aria-hidden="true"><path d="M1 8h14" stroke="#9ca3af" stroke-width="2"></path><path d="M13 2l8 6-8 6z" fill="#9ca3af"></path></svg><div style="border:1.5px solid #7c3aed;background:#faf5ff;border-radius:8px;padding:16px 14px;text-align:center;min-height:116px"><div style="font-size:12px;color:#7c3aed;font-weight:800;margin-bottom:8px">Stage 3 · Pure Rust</div><div style="font-size:13px;color:#111827;font-weight:600;line-height:1.35">axum server, Python in sidecar</div><div style="font-size:11px;color:#6b7280;margin-top:10px;font-weight:600">V5b</div></div></div><div style="height:1px;background:#e5e7eb;margin:20px 0 12px"></div><div style="display:grid;grid-template-columns:1fr 22px 1fr 22px 1fr 22px 1fr;align-items:center"><div style="grid-column:1 / -1;font-size:11px;color:#6b7280;font-weight:600;margin-bottom:8px">Rust share of hot path</div><div style="text-align:center;font-size:12px;color:#2563eb;font-weight:700">0%</div><div></div><div style="text-align:center;font-size:12px;color:#16a34a;font-weight:700">transforms + router</div><div></div><div style="text-align:center;font-size:12px;color:#d97706;font-weight:700">~entire forwarding path</div><div></div><div style="text-align:center;font-size:12px;color:#7c3aed;font-weight:700">100%</div></div></div></div><figcaption style="text-align:center;font-size:12px;color:#9ca3af;margin-top:12px">Four stages, each shipped to production before the next begins.</figcaption></figure>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="one-route-at-a-time-proven-in-production">One route at a time, proven in production<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#one-route-at-a-time-proven-in-production" class="hash-link" aria-label="Direct link to One route at a time, proven in production" title="Direct link to One route at a time, proven in production">​</a></h3>
<p>We never flip a whole endpoint at once. For each route we prove one provider first, roll it out to every provider on that route, and only then start the next route. The smallest, lowest-risk route goes first.</p>
<figure style="margin:2.5rem 0;font-family:inherit"><div style="border-radius:12px;border:1px solid #e5e7eb;background:#fff;padding:2rem 2.5rem;overflow-x:auto"><p style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:0.12em;color:#9ca3af;text-align:center;margin-bottom:1.5rem">The repeating cadence inside Stage 1</p><div style="min-width:680px;display:grid;grid-template-columns:150px 1fr 26px 1fr 26px 1fr;align-items:center;row-gap:12px"><div></div><div style="font-size:11px;color:#6b7280;font-weight:700;text-align:center">1. Prove one provider</div><div></div><div style="font-size:11px;color:#6b7280;font-weight:700;text-align:center">2. Roll out all providers</div><div></div><div style="font-size:11px;color:#6b7280;font-weight:700;text-align:center">3. Fold route into the Rust core</div><div style="font-size:13px;font-weight:800;color:#16a34a">OCR</div><div style="border:1.5px solid #16a34a;background:#f0fdf4;border-radius:8px;padding:10px 12px;text-align:center"><div style="font-size:12px;color:#111827;font-weight:700">Mistral OCR</div><div style="font-size:10px;color:#9ca3af;margin-top:3px">lowest-risk route, start here</div></div><div style="display:flex;flex-direction:column;align-items:center;justify-content:center"><svg width="24" height="14" viewBox="0 0 24 14" aria-hidden="true"><path d="M0 7h16" stroke="#16a34a" stroke-width="1.5"></path><path d="M15 1l8 6-8 6z" fill="#16a34a"></path></svg></div><div style="border:1.5px solid #16a34a;background:#f0fdf4;border-radius:8px;padding:10px 12px;text-align:center"><div style="font-size:12px;color:#111827;font-weight:700">all OCR</div></div><div style="display:flex;flex-direction:column;align-items:center;justify-content:center"><svg width="24" height="14" viewBox="0 0 24 14" aria-hidden="true"><path d="M0 7h16" stroke="#16a34a" stroke-width="1.5"></path><path d="M15 1l8 6-8 6z" fill="#16a34a"></path></svg></div><div style="border:1.5px solid #16a34a;background:#f0fdf4;border-radius:8px;padding:10px 12px;text-align:center"><div style="font-size:12px;color:#111827;font-weight:700">OCR in Rust</div></div><div style="font-size:13px;font-weight:800;color:#2563eb">/v1/messages</div><div style="border:1.5px solid #2563eb;background:#eff6ff;border-radius:8px;padding:10px 12px;text-align:center"><div style="font-size:12px;color:#111827;font-weight:700">one provider</div><div style="font-size:10px;color:#9ca3af;margin-top:3px">adds the streaming axis</div></div><div style="display:flex;flex-direction:column;align-items:center;justify-content:center"><svg width="24" height="14" viewBox="0 0 24 14" aria-hidden="true"><path d="M0 7h16" stroke="#2563eb" stroke-width="1.5"></path><path d="M15 1l8 6-8 6z" fill="#2563eb"></path></svg></div><div style="border:1.5px solid #2563eb;background:#eff6ff;border-radius:8px;padding:10px 12px;text-align:center"><div style="font-size:12px;color:#111827;font-weight:700">all /v1/messages</div></div><div style="display:flex;flex-direction:column;align-items:center;justify-content:center"><svg width="24" height="14" viewBox="0 0 24 14" aria-hidden="true"><path d="M0 7h16" stroke="#2563eb" stroke-width="1.5"></path><path d="M15 1l8 6-8 6z" fill="#2563eb"></path></svg></div><div style="border:1.5px solid #2563eb;background:#eff6ff;border-radius:8px;padding:10px 12px;text-align:center"><div style="font-size:12px;color:#111827;font-weight:700">/v1/messages in Rust</div></div><div style="font-size:13px;font-weight:800;color:#7c3aed">/chat/completions</div><div style="border:1.5px solid #7c3aed;background:#faf5ff;border-radius:8px;padding:10px 12px;text-align:center"><div style="font-size:12px;color:#111827;font-weight:700">one provider</div><div style="font-size:10px;color:#9ca3af;margin-top:3px">largest param surface</div></div><div style="display:flex;flex-direction:column;align-items:center;justify-content:center"><svg width="24" height="14" viewBox="0 0 24 14" aria-hidden="true"><path d="M0 7h16" stroke="#7c3aed" stroke-width="1.5"></path><path d="M15 1l8 6-8 6z" fill="#7c3aed"></path></svg></div><div style="border:1.5px solid #7c3aed;background:#faf5ff;border-radius:8px;padding:10px 12px;text-align:center"><div style="font-size:12px;color:#111827;font-weight:700">all /chat/completions</div></div><div style="display:flex;flex-direction:column;align-items:center;justify-content:center"><svg width="24" height="14" viewBox="0 0 24 14" aria-hidden="true"><path d="M0 7h16" stroke="#7c3aed" stroke-width="1.5"></path><path d="M15 1l8 6-8 6z" fill="#7c3aed"></path></svg></div><div style="border:1.5px solid #7c3aed;background:#faf5ff;border-radius:8px;padding:10px 12px;text-align:center"><div style="font-size:12px;color:#111827;font-weight:700">/chat/completions in Rust</div></div></div></div><figcaption style="text-align:center;font-size:12px;color:#9ca3af;margin-top:12px">Same three beats per route: one provider, then all providers, then the route lives in the Rust core. OCR goes first.</figcaption></figure>
<p>In Stage 1 the server does not change shape. Python still serves traffic and does the I/O, but hands translation to the Rust core through a flag-gated binding, per provider. A parity check enforces identical output before any provider turns on, and if the flag is off the existing Python path runs unchanged.</p>
<figure style="margin:2.5rem 0;font-family:inherit"><div style="border-radius:12px;border:1px solid #e5e7eb;background:#fff;padding:2rem 2.5rem;overflow-x:auto"><p style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:0.12em;color:#9ca3af;text-align:center;margin-bottom:1.5rem">Stage 1 · Rust core, driven by the Python SDK</p><div style="min-width:720px;max-width:760px;margin:0 auto;display:flex;flex-direction:column;align-items:center"><div style="border:1.5px solid #9ca3af;border-radius:8px;padding:12px 18px;background:#f3f4f6;color:#111827;text-align:center;width:140px;box-sizing:border-box">client</div><svg width="2" height="26" style="display:block" aria-hidden="true"><line x1="1" y1="0" x2="1" y2="20" stroke="#9ca3af" stroke-width="1.5"></line><polygon points="1,26 -2,19 4,19" fill="#9ca3af"></polygon></svg><div style="border:1.5px solid #2563eb;border-radius:8px;padding:12px 18px;background:#eff6ff;color:#1e3a8a;text-align:center;width:100%;box-sizing:border-box"><div style="font-weight:700;font-size:13px">FastAPI proxy (Python)</div><div style="font-size:11px;color:#3b5b7a;margin-top:4px">auth · rate limit · callbacks · DB · spend</div><div style="font-size:10px;color:#9ca3af;margin-top:4px">unchanged in Stage 1</div></div><svg width="2" height="26" style="display:block" aria-hidden="true"><line x1="1" y1="0" x2="1" y2="20" stroke="#9ca3af" stroke-width="1.5"></line><polygon points="1,26 -2,19 4,19" fill="#9ca3af"></polygon></svg><div style="display:grid;grid-template-columns:1.1fr 60px 1fr;align-items:center;width:100%"><div style="border:1.5px solid #2563eb;border-radius:8px;padding:12px 18px;background:#eff6ff;color:#1e3a8a;text-align:center;width:100%;box-sizing:border-box"><div style="font-weight:700;font-size:13px">litellm Python SDK</div><div style="font-size:11px;color:#3b5b7a;margin-top:4px">does the I/O: HTTP · auth · retries · streaming loop</div></div><div style="display:flex;flex-direction:column;align-items:center;justify-content:center"><span style="font-size:10px;color:#16a34a;font-weight:600;margin-bottom:3px">flag on</span><svg width="56" height="14" viewBox="0 0 56 14" aria-hidden="true"><path d="M0 7h48" stroke="#16a34a" stroke-width="1.5"></path><path d="M47 1l8 6-8 6z" fill="#16a34a"></path></svg></div><div style="border:1.5px solid #d97706;border-radius:8px;padding:12px 18px;background:#fffbeb;color:#92400e;text-align:center;width:100%;box-sizing:border-box"><div style="font-weight:700;font-size:13px">PyO3 bridge</div><div style="font-size:10px;color:#b45309;margin-top:4px">flag-gated</div></div></div><div style="display:grid;grid-template-columns:1.1fr 60px 1fr;align-items:stretch;width:100%;margin-top:10px"><div style="border:1.5px dashed #cbd5e1;border-radius:8px;padding:12px 18px;text-align:center;background:#fafafa"><div style="font-weight:600;font-size:12px;color:#6b7280">Python transforms (today's code)</div><div style="font-size:10px;color:#9ca3af;margin-top:4px">flag off or unsupported provider</div></div><div style="display:flex;align-items:center;justify-content:center;font-size:18px;color:#16a34a">↓</div><div style="border:1.5px solid #16a34a;border-radius:8px;padding:12px 18px;background:#f0fdf4;color:#166534;text-align:center;width:100%;box-sizing:border-box"><div style="font-weight:700;font-size:13px">litellm-core (Rust, pure)</div><div style="font-size:11px;color:#15803d;margin-top:4px">transform_request / transform_response</div><div style="font-size:11px;color:#15803d">stream chunk transform · token cost</div><div style="font-size:10px;color:#9ca3af;margin-top:4px">“describe, don't execute” · no I/O</div></div></div><svg width="2" height="30" style="display:block" aria-hidden="true"><line x1="1" y1="0" x2="1" y2="24" stroke="#6b7280" stroke-width="1.5"></line><polygon points="1,30 -2,23 4,23" fill="#6b7280"></polygon></svg><div style="border:1.5px solid #9ca3af;border-radius:8px;padding:12px 18px;background:#f3f4f6;color:#111827;text-align:center;width:220px;box-sizing:border-box"><div style="font-weight:600;font-size:13px">upstream LLM</div><div style="font-size:10px;color:#9ca3af;margin-top:2px">provider API · HTTP (Python flips)</div></div></div></div><figcaption style="text-align:center;font-size:12px;color:#9ca3af;margin-top:12px">The Rust core returns a prepared request; the Python SDK still performs every byte of I/O.</figcaption></figure>
<p>The routes move in order of risk:</p>
<ul>
<li><strong>OCR first.</strong> Start with Mistral OCR, the smallest surface: no streaming, tiny schema, few params. Once it matches the Python output byte for byte in production, roll out to all OCR providers, then move the route into the Rust core. Integration risk is retired here before any larger endpoint moves.</li>
<li><strong><code>/v1/messages</code> next.</strong> This adds streaming: SSE parsing, chunk emission, usage accounting, token cost. One provider first, then all, then the route into Rust.</li>
<li><strong><code>/chat/completions</code> after that.</strong> The largest surface, taken on only once streaming is proven: tools, function calling, multimodal, and the full optional-param matrix.</li>
<li><strong>Major providers.</strong> Azure, then Bedrock, then Vertex, by traffic volume. Auth-coupled providers get signed headers from the host (boto3 / google-auth first, native Rust later). Long-tail providers keep running on Python.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="onto-a-rust-server">Onto a Rust server<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#onto-a-rust-server" class="hash-link" aria-label="Direct link to Onto a Rust server" title="Direct link to Onto a Rust server">​</a></h3>
<p>Once the routes run on Rust, the router moves too: routing, fallbacks, retries, and cooldowns, with state in Redis. Then the server itself moves in two steps.</p>
<figure style="margin:2.5rem 0;font-family:inherit"><div style="border-radius:12px;border:1px solid #e5e7eb;background:#fff;padding:2rem 2.5rem;overflow-x:auto"><p style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:0.12em;color:#9ca3af;text-align:center;margin-bottom:1.5rem">Stage 2 → Stage 3 · onto a server</p><div style="display:grid;grid-template-columns:1fr 1fr;gap:28px;align-items:start;min-width:640px"><div><div style="font-size:12px;color:#d97706;font-weight:800;margin-bottom:14px">Stage 2 · FastAPI as a thin shell (V5a)</div><div style="display:flex;flex-direction:column;align-items:center;gap:8px"><div style="border:1.5px solid #9ca3af;border-radius:8px;padding:12px 18px;background:#f3f4f6;color:#111827;text-align:center;width:100%;box-sizing:border-box"><div style="font-size:13px;font-weight:700">client</div></div><svg width="2" height="26" style="display:block" aria-hidden="true"><line x1="1" y1="0" x2="1" y2="20" stroke="#9ca3af" stroke-width="1.5"></line><polygon points="1,26 -2,19 4,19" fill="#9ca3af"></polygon></svg><div style="border:1.5px solid #d97706;border-radius:8px;padding:12px 18px;background:#fffbeb;color:#92400e;text-align:center;width:100%;box-sizing:border-box"><div style="font-size:13px;font-weight:700">FastAPI shell (Python)</div><div style="font-size:11px;color:#6b7280;margin-top:4px">auth · rate limit · callbacks only</div><div style="font-size:11px;color:#374151;margin-top:2px">terminates HTTP</div><div style="font-size:11px;color:#374151;margin-top:2px">no forwarding logic</div></div><svg width="2" height="26" style="display:block" aria-hidden="true"><line x1="1" y1="0" x2="1" y2="20" stroke="#9ca3af" stroke-width="1.5"></line><polygon points="1,26 -2,19 4,19" fill="#9ca3af"></polygon></svg><div style="border:1.5px solid #16a34a;border-radius:8px;padding:12px 18px;background:#f0fdf4;color:#166534;text-align:center;width:100%;box-sizing:border-box"><div style="font-size:13px;font-weight:700">Rust engine (one PyO3 call)</div><div style="font-size:11px;color:#6b7280;margin-top:4px">router + core + HTTP + stream + cost</div><div style="font-size:11px;color:#374151;margin-top:2px">entire forwarding hot path</div></div><svg width="2" height="26" style="display:block" aria-hidden="true"><line x1="1" y1="0" x2="1" y2="20" stroke="#9ca3af" stroke-width="1.5"></line><polygon points="1,26 -2,19 4,19" fill="#9ca3af"></polygon></svg><div style="border:1.5px solid #9ca3af;border-radius:8px;padding:12px 18px;background:#f3f4f6;color:#111827;text-align:center;width:100%;box-sizing:border-box"><div style="font-size:13px;font-weight:700">upstream LLM</div><div style="font-size:11px;color:#6b7280;margin-top:4px">provider API</div></div></div></div><div><div style="font-size:12px;color:#7c3aed;font-weight:800;margin-bottom:14px">Stage 3 · Pure Rust server (V5b)</div><div style="display:flex;flex-direction:column;align-items:center;gap:8px"><div style="border:1.5px solid #9ca3af;border-radius:8px;padding:12px 18px;background:#f3f4f6;color:#111827;text-align:center;width:100%;box-sizing:border-box"><div style="font-size:13px;font-weight:700">client</div></div><svg width="2" height="26" style="display:block" aria-hidden="true"><line x1="1" y1="0" x2="1" y2="20" stroke="#9ca3af" stroke-width="1.5"></line><polygon points="1,26 -2,19 4,19" fill="#9ca3af"></polygon></svg><div style="display:grid;grid-template-columns:1fr 110px;gap:10px;align-items:center;width:100%"><div style="border:1.5px solid #7c3aed;border-radius:8px;padding:12px 18px;background:#faf5ff;color:#5b21b6;text-align:center;width:100%;box-sizing:border-box"><div style="font-size:13px;font-weight:700">Rust server (axum / hyper)</div><div style="font-size:11px;color:#6b7280;margin-top:4px">auth · rate limit · router</div><div style="font-size:11px;color:#374151;margin-top:2px">core · streaming · cost · spend</div><div style="font-size:11px;color:#374151;margin-top:2px">no PyO3 on hot path</div></div><div style="border:1.5px dashed #c4b5fd;border-radius:8px;padding:10px 8px;font-size:10px;color:#7c3aed;text-align:center;background:#faf5ff"><div style="font-weight:700">PyO3 sidecar</div><div style="color:#9ca3af;margin-top:2px">customer Python plugins · guardrails</div></div></div><div style="display:grid;grid-template-columns:1fr 1fr;gap:10px;width:calc(100% - 120px);align-self:flex-start"><div style="border:1.5px solid #9ca3af;border-radius:8px;padding:12px 18px;background:#f3f4f6;color:#111827;text-align:center;width:100%;box-sizing:border-box"><div style="font-size:13px;font-weight:700">Redis</div><div style="font-size:11px;color:#6b7280;margin-top:4px">routing state</div></div><div style="border:1.5px solid #9ca3af;border-radius:8px;padding:12px 18px;background:#f3f4f6;color:#111827;text-align:center;width:100%;box-sizing:border-box"><div style="font-size:13px;font-weight:700">Postgres</div><div style="font-size:11px;color:#6b7280;margin-top:4px">spend + config</div></div></div><svg width="2" height="26" style="display:block" aria-hidden="true"><line x1="1" y1="0" x2="1" y2="20" stroke="#9ca3af" stroke-width="1.5"></line><polygon points="1,26 -2,19 4,19" fill="#9ca3af"></polygon></svg><div style="border:1.5px solid #9ca3af;border-radius:8px;padding:12px 18px;background:#f3f4f6;color:#111827;text-align:center;width:100%;box-sizing:border-box"><div style="font-size:13px;font-weight:700">upstream LLM</div><div style="font-size:11px;color:#6b7280;margin-top:4px">provider API</div></div></div></div></div></div><figcaption style="text-align:center;font-size:12px;color:#9ca3af;margin-top:12px">V5a removes Python from forwarding while keeping the shell; V5b removes PyO3 from the hot path.</figcaption></figure>
<ul>
<li><strong>FastAPI as a thin shell.</strong> FastAPI still terminates HTTP and runs auth, rate-limit, and callbacks, but the entire forwarding path is a single call into Rust.</li>
<li><strong>Pure Rust server.</strong> A native server (axum / hyper) runs the forwarding path with no Python on the hot path. Your custom Python plugins (auth, guardrails, callbacks, SSO) keep working in an optional sidecar, so nothing breaks. We roll it out with shadow traffic and a percentage cutover.</li>
</ul>
<p>The end state is a pure Rust data plane. Customer Python plugins keep running in the sidecar, so it is non-breaking. Removing Python entirely would require porting plugins to a Rust or WASM interface, which is a breaking change we are deferring.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-this-order">Why this order<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#why-this-order" class="hash-link" aria-label="Direct link to Why this order" title="Direct link to Why this order">​</a></h3>
<ul>
<li>The OCR route retires integration risk on the smallest surface.</li>
<li><code>/v1/messages</code> retires streaming risk before the largest parameter set.</li>
<li><code>/chat/completions</code> is taken on only after streaming is proven.</li>
<li>By the time the server moves, the core, providers, and router are already running in production through the SDK, so the server work is mostly plumbing.</li>
</ul>
<p>Every step ships to real users before the next begins, with the parity check as the gate.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="timeline">Timeline<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#timeline" class="hash-link" aria-label="Direct link to Timeline" title="Direct link to Timeline">​</a></h2>
<p>We move one function at a time, smallest first, and only after each step passes our test suite.</p>
<table><thead><tr><th>Target</th><th>What moves to Rust</th></tr></thead><tbody><tr><td>Aug 15, 2026</td><td><code>litellm.ocr()</code> for Mistral, then all of <code>litellm.ocr()</code>, then the <code>/ocr</code> route</td></tr><tr><td>Sep 1, 2026</td><td>Same pattern for <code>/messages</code>, then <code>/chat/completions</code></td></tr><tr><td>Sep 15, 2026</td><td>The router: load balancing, fallbacks, retries, cooldowns</td></tr><tr><td>Dec 1, 2026</td><td>The full server: FastAPI thin shell, then pure Rust (axum)</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="frequently-asked-questions">Frequently asked questions<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently asked questions" title="Direct link to Frequently asked questions">​</a></h2>
<!-- -->
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="is-litellm-the-fastest-llm-gateway">Is LiteLLM the fastest LLM gateway?<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#is-litellm-the-fastest-llm-gateway" class="hash-link" aria-label="Direct link to Is LiteLLM the fastest LLM gateway?" title="Direct link to Is LiteLLM the fastest LLM gateway?">​</a></h3>
<p>That is the goal of this work. With the Rust hot path, LiteLLM targets sub-<code>1ms</code> gateway overhead and a sub-<code>100MB</code> binary, matching compiled-language gateways while keeping coverage of 100+ providers behind one OpenAI-compatible API. In our benchmark the Rust gateway adds about <code>0.05ms</code> of overhead per request, versus about <code>7.5ms</code> for the LiteLLM Python path today, and serves <code>6,782</code> requests per second under load at <code>31.7MB</code> peak memory. Gateway overhead is usually a small fraction of total model latency, so it matters most for high-throughput, low-latency workloads like classification and embeddings at scale.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="is-litellm-slow">Is LiteLLM slow?<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#is-litellm-slow" class="hash-link" aria-label="Direct link to Is LiteLLM slow?" title="Direct link to Is LiteLLM slow?">​</a></h3>
<p>Gateway latency and throughput depend on how you deploy the proxy: worker count, concurrency settings, and whether logging callbacks run on the hot path. Tuned, the Python proxy serves production traffic across hundreds of providers today. Moving the hot path to Rust pushes the floor lower still: in our reproducible benchmark the Rust gateway adds about <code>0.05ms</code> of overhead per request, versus about <code>7.5ms</code> for the LiteLLM Python path, and serves <code>6,782</code> requests per second at <code>31.7MB</code> peak memory.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="is-litellm-limited-by-the-python-gil">Is LiteLLM limited by the Python GIL?<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#is-litellm-limited-by-the-python-gil" class="hash-link" aria-label="Direct link to Is LiteLLM limited by the Python GIL?" title="Direct link to Is LiteLLM limited by the Python GIL?">​</a></h3>
<p>The GIL only matters for CPU-bound work on the request path, and the gateway is mostly I/O. LiteLLM scales today by running multiple workers. The Rust migration removes the question for the hot path: request transforms, streaming, and routing run in the Rust core and router, outside the GIL, with no first-party Python on the forwarding path in the end state.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-much-memory-does-the-litellm-gateway-use">How much memory does the LiteLLM gateway use?<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#how-much-memory-does-the-litellm-gateway-use" class="hash-link" aria-label="Direct link to How much memory does the LiteLLM gateway use?" title="Direct link to How much memory does the LiteLLM gateway use?">​</a></h3>
<p>The Python proxy peaked at <code>358.9MB</code> under our load test. The Rust end state targets roughly <code>65MB</code>. Lower, bounded memory is the main reason for this work: it reduces the high-CPU and OOM failures that show up under concurrent load.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="are-these-benchmarks-reproducible">Are these benchmarks reproducible?<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#are-these-benchmarks-reproducible" class="hash-link" aria-label="Direct link to Are these benchmarks reproducible?" title="Direct link to Are these benchmarks reproducible?">​</a></h3>
<p>Yes. The overhead harness (a mock upstream, a thin Rust gateway, and a load client that times each request in microseconds) is checked in under <a href="https://github.com/BerriAI/litellm-docs/tree/main/blog/litellm_rust_launch/benchmark" target="_blank" rel="noopener noreferrer"><code>benchmark/</code></a>, alongside the summarized CSV. Same upstream and payload for both runtimes; the only variable is Python versus Rust.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="will-the-rust-gateway-be-a-breaking-change">Will the Rust gateway be a breaking change?<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#will-the-rust-gateway-be-a-breaking-change" class="hash-link" aria-label="Direct link to Will the Rust gateway be a breaking change?" title="Direct link to Will the Rust gateway be a breaking change?">​</a></h3>
<p>No. Config, database schema, and the client API contract stay the same. The runtime under the hot path changes gradually, route by route, behind passing parity and end-to-end tests.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="we-are-hiring-rust-engineers">We are hiring Rust engineers<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#we-are-hiring-rust-engineers" class="hash-link" aria-label="Direct link to We are hiring Rust engineers" title="Direct link to We are hiring Rust engineers">​</a></h2>
<p>We are building this with a small team and looking for Rust engineers who want to work on the hot path of an AI gateway that serves 100+ providers. If that sounds like you, <a href="https://jobs.ashbyhq.com/litellm/3f326076-7415-46a1-921e-8a1b1d6ee2b6" target="_blank" rel="noopener noreferrer">come build it with us</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://docs.litellm.ai/en/blog/litellm-rust-launch#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References">​</a></h2>
<ul>
<li><a href="https://www.datadoghq.com/blog/engineering/how-we-migrated-our-static-analyzer-from-java-to-rust/" target="_blank" rel="noopener noreferrer">How Datadog migrated their static analyzer from Java to Rust</a></li>
<li><a href="https://blog.gitguardian.com/how-we-migrated-the-heart-of-our-platform-to-rust/" target="_blank" rel="noopener noreferrer">How GitGuardian migrated the heart of their platform to Rust</a></li>
<li><a href="https://docs.litellm.ai/docs/simple_proxy" target="_blank" rel="noopener noreferrer">LiteLLM AI Gateway, full feature overview</a></li>
<li><a href="https://docs.litellm.ai/docs/routing" target="_blank" rel="noopener noreferrer">Load balancing and routing across 100+ LLM providers</a></li>
</ul>]]></content>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <category label="rust" term="rust"/>
        <category label="ai-gateway" term="ai-gateway"/>
        <category label="performance" term="performance"/>
        <category label="benchmarks" term="benchmarks"/>
        <category label="reliability" term="reliability"/>
        <category label="engineering" term="engineering"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[LiteLLM version support: focusing on the four most recent stable lines]]></title>
        <id>https://docs.litellm.ai/en/blog/version-support</id>
        <link href="https://docs.litellm.ai/en/blog/version-support"/>
        <updated>2026-06-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Starting Monday, June 29, 2026, LiteLLM actively supports the four most recent stable minor lines. Older lines reach end of life, and the window rolls forward as new stable lines ship.]]></summary>
        <content type="html"><![CDATA[<p><em>Starting Monday, June 29, 2026, LiteLLM will only actively support the four most recent stable minor lines. Here's what's changing and what it means for you.</em></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-were-doing-this">Why we're doing this<a href="https://docs.litellm.ai/en/blog/version-support#why-were-doing-this" class="hash-link" aria-label="Direct link to Why we're doing this" title="Direct link to Why we're doing this">​</a></h2>
<p>Maintaining older lines means carrying every fix back to keep them all in parity. That overhead grows with the number of lines we keep alive, not the number of fixes we make. Our focus is ensuring the most up-to-date product offerings are stable and working for you. Because of this, LiteLLM is focusing on the four most recent stable minor lines going forward.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-the-rolling-window-works">How the rolling window works<a href="https://docs.litellm.ai/en/blog/version-support#how-the-rolling-window-works" class="hash-link" aria-label="Direct link to How the rolling window works" title="Direct link to How the rolling window works">​</a></h2>
<p>This shift in focus takes effect Monday, June 29, 2026.</p>
<p>A minor line is a release series written as 1.89.x, covering every patch in it: 1.89.0, 1.89.1, 1.89.2, and any later ones. We support the four most recent lines and every patch inside each of them.</p>
<p>Today the four supported lines are <strong>1.89.x, 1.88.x, 1.87.x, and 1.86.x</strong>. Everything <strong>1.85.x and earlier</strong> has reached end of life and will no longer actively receive updates. The window rolls forward: when 1.90.x ships, 1.86.x rolls out and the supported set becomes 1.90.x, 1.89.x, 1.88.x, and 1.87.x. With a new line about every week, that works out to roughly a month of coverage per line.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-this-means-for-you">What this means for you<a href="https://docs.litellm.ai/en/blog/version-support#what-this-means-for-you" class="hash-link" aria-label="Direct link to What this means for you" title="Direct link to What this means for you">​</a></h2>
<p>To stay supported, pin to a line and take its patches, then move up before it ages out. Patching within a line is a drop-in; moving up a line is where you'd check the release notes for changes. Enterprise customers who need longer coverage can reach out, and for rare high-severity issues we'll use our judgment and may patch outside the window.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-stay-current">How to stay current<a href="https://docs.litellm.ai/en/blog/version-support#how-to-stay-current" class="hash-link" aria-label="Direct link to How to stay current" title="Direct link to How to stay current">​</a></h2>
<p>The best way to stay up to date on these changes is to bookmark our <a href="https://docs.litellm.ai/release_notes" target="_blank" rel="noopener noreferrer">release notes</a>. We update it as new versions ship, so you can see the latest stable line and the three behind it that are still supported.</p>]]></content>
        <author>
            <name>Yuneng Jiang</name>
            <uri>https://www.linkedin.com/in/yuneng-david-jiang-455676139/</uri>
        </author>
        <category label="release" term="release"/>
        <category label="support" term="support"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Semantic Caching on Valkey and AWS ElastiCache]]></title>
        <id>https://docs.litellm.ai/en/blog/valkey_semantic_caching</id>
        <link href="https://docs.litellm.ai/en/blog/valkey_semantic_caching"/>
        <updated>2026-06-17T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[LiteLLM now supports semantic prompt caching on Valkey clusters running the valkey-search module, including AWS ElastiCache for Valkey, with no RediSearch, Redis Stack, or Qdrant required.]]></summary>
        <content type="html"><![CDATA[<p>LiteLLM now supports semantic prompt caching on Valkey. If you run a Valkey cluster with the <a href="https://github.com/valkey-io/valkey-search" target="_blank" rel="noopener noreferrer">valkey-search</a> module, including AWS ElastiCache for Valkey, you can point LiteLLM at it with <code>type: valkey-semantic</code> and get embedding-based cache hits without standing up Redis Stack or a separate vector database.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-this-matters">Why this matters<a href="https://docs.litellm.ai/en/blog/valkey_semantic_caching#why-this-matters" class="hash-link" aria-label="Direct link to Why this matters" title="Direct link to Why this matters">​</a></h2>
<p>Semantic caching stores responses by the meaning of a prompt rather than an exact string match, so a reworded request can still hit the cache and skip a paid model call. Until now LiteLLM's semantic cache was built on RedisVL, which depends on RediSearch's <code>FT.*</code> vector API. RediSearch is not available on Redis OSS or on ElastiCache for Redis OSS, which left teams standing up Redis Stack or Qdrant just to get semantic caching. With Redis moving to a source-available license, more teams are standing up Valkey instead, and ElastiCache for Valkey is a common managed target.</p>
<p>Valkey ships vector search through the valkey-search module, and ElastiCache for Valkey exposes it. LiteLLM's new backend talks to valkey-search directly over the Redis protocol, so semantic caching on ElastiCache for Valkey works without RediSearch, Redis Stack, or Qdrant in the path.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-it-works">How it works<a href="https://docs.litellm.ai/en/blog/valkey_semantic_caching#how-it-works" class="hash-link" aria-label="Direct link to How it works" title="Direct link to How it works">​</a></h2>
<p>The <code>valkey-semantic</code> backend builds its own vector index from the field types valkey-search supports, a tag field that isolates each cache key's scope and an HNSW vector field for the prompt embedding, then runs a KNN query at lookup time and returns the cached response when the cosine similarity clears your threshold. Prompt extraction, embedding generation, and response handling are shared with the existing Redis semantic cache, so behavior matches the Redis path including per-request scope isolation. Connections resolve from <code>VALKEY_HOST</code>, <code>VALKEY_PORT</code>, and <code>VALKEY_PASSWORD</code>, falling back to the <code>REDIS_*</code> equivalents, and passwordless clusters are supported for IAM or no-auth setups.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="get-started">Get started<a href="https://docs.litellm.ai/en/blog/valkey_semantic_caching#get-started" class="hash-link" aria-label="Direct link to Get started" title="Direct link to Get started">​</a></h2>
<p>Add the cache to your <code>config.yaml</code>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">litellm_settings</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token key atrule">cache</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token boolean important">True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token key atrule">cache_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">type</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> valkey</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">semantic</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">host</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/VALKEY_HOST</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">port</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/VALKEY_PORT</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">valkey_semantic_cache_embedding_model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> openai</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">embedding</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">similarity_threshold</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0.8</span><br></span></code></pre></div></div>
<p>For ElastiCache with encryption in transit, pass a <code>rediss://</code> URL through <code>cache_params.redis_url</code> instead of host and port. To try valkey-search locally, the bundled image has the module ready:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">docker run -d -p 6379:6379 valkey/valkey-bundle:8.1</span><br></span></code></pre></div></div>
<p>See the <a href="https://docs.litellm.ai/docs/proxy/caching" target="_blank" rel="noopener noreferrer">caching docs</a> for the full setup, including the SDK usage and the parameter reference.</p>]]></content>
        <author>
            <name>Yassin Kortam</name>
            <uri>https://www.linkedin.com/in/yassink/</uri>
        </author>
        <category label="caching" term="caching"/>
        <category label="valkey" term="valkey"/>
        <category label="elasticache" term="elasticache"/>
        <category label="semantic cache" term="semantic cache"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[June Townhall: Product + Roadmap Updates]]></title>
        <id>https://docs.litellm.ai/en/blog/june-townhall-announcement</id>
        <link href="https://docs.litellm.ai/en/blog/june-townhall-announcement"/>
        <updated>2026-06-16T07:30:00.000Z</updated>
        <summary type="html"><![CDATA[Join the LiteLLM June townhall on Thursday, 25 June at 7:30 AM PST to learn about LiteLLM's product updates and roadmap.]]></summary>
        <content type="html"><![CDATA[<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Rescheduled</div><div class="admonitionContent_BuS1"><p>The June townhall has been moved from Thursday, 18 June to <strong>Thursday, 25 June at 7:30 AM PST</strong>. Thanks for your patience!</p></div></div>
<p>We are hosting our June townhall on <strong>Thursday, 25 June at 7:30 AM PST</strong>.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAADCAIAAAAlXwkiAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAZUlEQVR4nGNQ1zIUVzKwCMjRMPEyt/EO9Yv0dwm0N7Qz1rAy0bFnUFM38nIPSUrISYhLDwuO9fEO9/aJCotMUzNwVtZyZFDTtfG2NzXRUhIREmZi5WFh42Xj5Gdm42Nk5WVk5QMA9GESa0+FNe4AAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="166"></svg><noscript><img style=width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0 src=/en/assets/ideal-img/june_townhall_banner.d4959f3.640.png srcset="/en/assets/ideal-img/june_townhall_banner.d4959f3.640.png 640w,/en/assets/ideal-img/june_townhall_banner.dc93478.693.png 693w" width=640 height=166></noscript></div>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="agenda">Agenda<a href="https://docs.litellm.ai/en/blog/june-townhall-announcement#agenda" class="hash-link" aria-label="Direct link to Agenda" title="Direct link to Agenda">​</a></h2>
<ul>
<li>Product updates and roadmap progress</li>
<li>Reliability and security updates</li>
<li>Open Q&amp;A with the team</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="stability">Stability<a href="https://docs.litellm.ai/en/blog/june-townhall-announcement#stability" class="hash-link" aria-label="Direct link to Stability" title="Direct link to Stability">​</a></h2>
<p>Our team is focused on stability: improving reliability and reducing regressions across releases. Follow the roadmap here: <a href="https://github.com/BerriAI/litellm/issues/30484" target="_blank" rel="noopener noreferrer">Stability roadmap</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-contribute">How to contribute<a href="https://docs.litellm.ai/en/blog/june-townhall-announcement#how-to-contribute" class="hash-link" aria-label="Direct link to How to contribute" title="Direct link to How to contribute">​</a></h2>
<p>Add the topics and questions you'd like us to cover when you register below. We use your responses to set the agenda.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="register">Register<a href="https://docs.litellm.ai/en/blog/june-townhall-announcement#register" class="hash-link" aria-label="Direct link to Register" title="Direct link to Register">​</a></h2>
<p>Register here: <a href="https://forms.gle/sjWTYN2BBrikZg3KA" target="_blank" rel="noopener noreferrer">LiteLLM June Townhall Form</a></p>
<p>We will hold the townhall from <strong>7:30 AM to 8:30 AM PST on Zoom</strong>.</p>
<p>For security, attendance is restricted to corporate emails. If you register with a non-corporate email, we will share the townhall slides and accompanying blog post after the event.</p>]]></content>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <category label="announcement" term="announcement"/>
        <category label="townhall" term="townhall"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[June Stability Update: We're Making Stability a First-Class Citizen at LiteLLM]]></title>
        <id>https://docs.litellm.ai/en/blog/stability</id>
        <link href="https://docs.litellm.ai/en/blog/stability"/>
        <updated>2026-06-15T10:00:00.000Z</updated>
        <content type="html"><![CDATA[<p>Over the past few months, we've heard our users report more bugs and regressions. We take that feedback seriously, and today we're sharing exactly what we're doing about it.</p>
<p>We're kicking off a stability sprint for LiteLLM with one bar in mind: 0 reported regressions by our next release on August 29th. The sprint has 2 goals:</p>
<ul>
<li>Close 20 reported bugs in core functionality - <a href="https://github.com/BerriAI/litellm/issues/30484" target="_blank" rel="noopener noreferrer">here</a></li>
<li>Address the root cause of underlying bugs in 3 core components - MCP, Gateway, and UI</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-class-of-bugs-are-we-driving-down">What class of bugs are we driving down?<a href="https://docs.litellm.ai/en/blog/stability#what-class-of-bugs-are-we-driving-down" class="hash-link" aria-label="Direct link to What class of bugs are we driving down?" title="Direct link to What class of bugs are we driving down?">​</a></h2>
<p>Over this sprint we're driving down 3 classes of bugs:</p>
<ul>
<li><strong>MCP Authentication:</strong> View/List Tools did not consistently work across all our supported MCP auth methods.</li>
<li><strong>Gateway Authentication:</strong> Team IDs are not reliably on every request trace. As a result, some requests and budgets are not accurately tracked to a team.</li>
<li><strong>UI Forms:</strong> Today when users hit save on a form, it can accidentally wipe out other fields on the form, across keys, teams, and users.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="mcp-authentication-consistent-behavior-across-all-mcp-authentication-methods">MCP Authentication: Consistent behavior across all MCP Authentication Methods<a href="https://docs.litellm.ai/en/blog/stability#mcp-authentication-consistent-behavior-across-all-mcp-authentication-methods" class="hash-link" aria-label="Direct link to MCP Authentication: Consistent behavior across all MCP Authentication Methods" title="Direct link to MCP Authentication: Consistent behavior across all MCP Authentication Methods">​</a></h2>
<p>Solution: We've identified that the root cause of bugs across MCPs is that we maintain 5 different code paths, one per authentication method. To fix this and restore connection reliability, we're refactoring this into one code path that resolves MCP credentials across all supported authentication methods. The result: tools list and call reliably, no matter which auth method you use.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai-gateway-authentication-spend-is-always-attributed-to-the-right-team">AI Gateway Authentication: Spend is always attributed to the right team<a href="https://docs.litellm.ai/en/blog/stability#ai-gateway-authentication-spend-is-always-attributed-to-the-right-team" class="hash-link" aria-label="Direct link to AI Gateway Authentication: Spend is always attributed to the right team" title="Direct link to AI Gateway Authentication: Spend is always attributed to the right team">​</a></h2>
<p>Solution: We identified that the authentication layer makes 5+ DB lookups to resolve the exact key, user, team, and team member making a request. To fix this, we're resolving caller identity once, into a single record that every check and log reads from. This cuts identity lookups roughly in half, and means spend is always attributed to the team that made the request.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ui-edits-change-only-what-you-touched">UI: Edits change only what you touched<a href="https://docs.litellm.ai/en/blog/stability#ui-edits-change-only-what-you-touched" class="hash-link" aria-label="Direct link to UI: Edits change only what you touched" title="Direct link to UI: Edits change only what you touched">​</a></h2>
<p>Solution: One of the root causes of UI bugs on form save is that our data shapes across the frontend and backend are not consistent. To fix this, we're refactoring so frontend and backend types are 100% in sync and read from the same source of truth. The result: a save changes only the field you edited, nothing else.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-youll-know-it-worked">How you'll know it worked<a href="https://docs.litellm.ai/en/blog/stability#how-youll-know-it-worked" class="hash-link" aria-label="Direct link to How you'll know it worked" title="Direct link to How you'll know it worked">​</a></h2>
<p>We'll report back at the August 29th release on exactly where each of these stands. You shouldn't have to take our word for it.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-now">Why now<a href="https://docs.litellm.ai/en/blog/stability#why-now" class="hash-link" aria-label="Direct link to Why now" title="Direct link to Why now">​</a></h2>
<p>We've grown fast. And fast growth in a complex system means bugs accumulate if you're not deliberate about paying them down. This sprint is us being deliberate.</p>
<p>We're also being public about it because you deserve to know what's being fixed and when. Stability is infrastructure. We're treating it that way.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="want-us-to-fix-something">Want us to fix something?<a href="https://docs.litellm.ai/en/blog/stability#want-us-to-fix-something" class="hash-link" aria-label="Direct link to Want us to fix something?" title="Direct link to Want us to fix something?">​</a></h2>
<p>Every item above came from real user reports. If there's a bug affecting you that isn't on this list, comment on the <a href="https://github.com/BerriAI/litellm/issues/30484" target="_blank" rel="noopener noreferrer">GitHub issue</a>. We're actively triaging!</p>]]></content>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <author>
            <name>Varoon Raghav</name>
            <uri>https://www.linkedin.com/in/varoon-raghav/</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Day 0 Support: Claude Fable 5]]></title>
        <id>https://docs.litellm.ai/en/blog/claude_fable_5</id>
        <link href="https://docs.litellm.ai/en/blog/claude_fable_5"/>
        <updated>2026-06-10T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[Day 0 support for Claude Fable 5 on the LiteLLM AI Gateway. Use it across Anthropic, Azure, Vertex AI, and Bedrock.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="LiteLLM x Claude Fable 5" src="https://docs.litellm.ai/en/assets/images/litellm_claude_fable_5_announcement-1d14dd47155b83144deb51f3efed8d91.png" width="756" height="384" class="img_ev3q"></p>
<p>LiteLLM now supports <a href="https://www.anthropic.com/news/claude-fable-5-mythos-5" target="_blank" rel="noopener noreferrer">Claude Fable 5</a> on Day 0. Use it across Anthropic, Azure, Vertex AI, and Bedrock through the LiteLLM AI Gateway. Call it with the same OpenAI-compatible request you already use, and track spend, rate limits, and logging in one place.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-new-in-fable-5">What's new in Fable 5<a href="https://docs.litellm.ai/en/blog/claude_fable_5#whats-new-in-fable-5" class="hash-link" aria-label="Direct link to What's new in Fable 5" title="Direct link to What's new in Fable 5">​</a></h2>
<p>Fable 5 is Anthropic's first publicly available Mythos-class model, priced at 2x Opus 4.8. A few things stand out for teams running it through a gateway:</p>
<ul>
<li><strong>The frontier, now public.</strong> Anthropic reports Fable 5 is state-of-the-art on nearly all tested benchmarks, and the highest scorer among frontier models on Cognition's frontier coding benchmark, even at medium reasoning effort. (<a href="https://www.anthropic.com/news/claude-fable-5-mythos-5" target="_blank" rel="noopener noreferrer">details from Anthropic</a>)</li>
<li><strong>Built for long-running work.</strong> A 1M-token context window and up to 128K output tokens, with focus that holds across millions of tokens in long-horizon agentic tasks.</li>
<li><strong>Adaptive thinking only.</strong> Fable 5 decides how deeply to think on its own. You steer it per request with <code>reasoning_effort</code> or <code>output_config.effort</code>; fixed thinking budgets, <code>temperature</code>, <code>top_p</code>, and assistant message prefill are not supported by the model.</li>
<li><strong>$10 / MTok input and $50 / MTok output</strong>, with prompt caching at $1.00 / MTok (read) and $12.50 / MTok (write). On Bedrock, the <code>us.</code> and <code>eu.</code> inference profiles carry the usual 10% regional premium while <code>global.</code> stays at base price; LiteLLM tracks every variant automatically.</li>
<li><strong>A fallback you might notice.</strong> On flagged cybersecurity and biology requests (under 5% of sessions, per Anthropic), the response is served by Opus 4.8 instead.</li>
<li><strong>One gateway, every surface.</strong> Vision, PDF input, computer use, tool calling, prompt caching, adaptive thinking, and structured output, all available across Anthropic, Azure, Vertex AI, and Bedrock with unified spend tracking, logging, and fallbacks.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="before-you-flip-it-on-provider-opt-ins">Before you flip it on: provider opt-ins<a href="https://docs.litellm.ai/en/blog/claude_fable_5#before-you-flip-it-on-provider-opt-ins" class="hash-link" aria-label="Direct link to Before you flip it on: provider opt-ins" title="Direct link to Before you flip it on: provider opt-ins">​</a></h2>
<p>Fable 5 requires a data sharing opt-in on some clouds; prompts are shared with Anthropic and retained for up to 30 days.</p>
<ul>
<li><strong>Bedrock</strong>: set your account's data retention mode to <code>provider_data_share</code>, and invoke through an inference profile (<code>us.</code>, <code>eu.</code>, or <code>global.</code> prefix); direct model ID invocation is not supported.</li>
<li><strong>Vertex AI</strong>: enable Anthropic data sharing for your project and accept the Fable 5 terms in Model Garden.</li>
<li><strong>Azure AI Foundry</strong>: create a <code>claude-fable-5</code> deployment; the model's TPM quota meter starts at 0 on some subscriptions, so you may need a quota request first.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="enabling-fable-5">Enabling Fable 5<a href="https://docs.litellm.ai/en/blog/claude_fable_5#enabling-fable-5" class="hash-link" aria-label="Direct link to Enabling Fable 5" title="Direct link to Enabling Fable 5">​</a></h2>
<p>Fable 5 ships in the <strong><code>v1.89.0-rc.2</code></strong> image (and every release after it). How you pick it up depends on where your proxy reads pricing from:</p>
<ul>
<li>
<p><strong>Default (remote cost map): no upgrade needed.</strong> In the LiteLLM UI, open the <strong>Price Data</strong> tab under <strong>Models + Endpoints</strong> and click <strong>Reload Price Data</strong> (or, as a proxy admin, <code>POST /reload/model_cost_map</code>). This refetches the latest pricing from LiteLLM's cost map <strong>and</strong> re-registers provider routing in one step, so <code>claude-fable-5</code> becomes available across Anthropic, Azure, Vertex AI, and Bedrock, even if you're on an older proxy version.</p>
</li>
<li>
<p><strong>Running <code>LITELLM_LOCAL_MODEL_COST_MAP=true</code>?</strong> The cost map is baked into the image, so the Reload button won't reach it. Pull <code>v1.89.0-rc.2</code> or later to get the bundled Fable 5 metadata:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">docker pull ghcr.io/berriai/litellm:v1.89.0-rc.2</span><br></span></code></pre></div></div>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="usage---anthropic">Usage - Anthropic<a href="https://docs.litellm.ai/en/blog/claude_fable_5#usage---anthropic" class="hash-link" aria-label="Direct link to Usage - Anthropic" title="Direct link to Usage - Anthropic">​</a></h2>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">LiteLLM Proxy</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><strong>1. Setup config.yaml</strong></p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">fable</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> anthropic/claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">fable</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/ANTHROPIC_API_KEY</span><br></span></code></pre></div></div><p><strong>2. Start the proxy</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">docker run -d \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -p 4000:4000 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -v $(pwd)/config.yaml:/app/config.yaml \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:v1.89.0-rc.2 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --config /app/config.yaml</span><br></span></code></pre></div></div><p><strong>3. Test it!</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl --location 'http://0.0.0.0:4000/chat/completions' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Content-Type: application/json' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Authorization: Bearer $LITELLM_KEY' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--data '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "model": "claude-fable-5",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "messages": [</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "role": "user",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "content": "what llm are you"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ]</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">}'</span><br></span></code></pre></div></div></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="usage---azure">Usage - Azure<a href="https://docs.litellm.ai/en/blog/claude_fable_5#usage---azure" class="hash-link" aria-label="Direct link to Usage - Azure" title="Direct link to Usage - Azure">​</a></h2>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">LiteLLM Proxy</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><strong>1. Setup config.yaml</strong></p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">fable</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> azure_ai/claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">fable</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AZURE_AI_API_KEY</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">api_base</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AZURE_AI_API_BASE  </span><span class="token comment" style="color:rgb(0, 128, 0)"># https://&lt;resource&gt;.services.ai.azure.com</span><br></span></code></pre></div></div><p><strong>2. Start the proxy</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">docker run -d \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -p 4000:4000 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e AZURE_AI_API_KEY=$AZURE_AI_API_KEY \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e AZURE_AI_API_BASE=$AZURE_AI_API_BASE \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -v $(pwd)/config.yaml:/app/config.yaml \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:v1.89.0-rc.2 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --config /app/config.yaml</span><br></span></code></pre></div></div><p><strong>3. Test it!</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl --location 'http://0.0.0.0:4000/chat/completions' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Content-Type: application/json' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Authorization: Bearer $LITELLM_KEY' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--data '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "model": "claude-fable-5",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "messages": [</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "role": "user",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "content": "what llm are you"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ]</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">}'</span><br></span></code></pre></div></div></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="usage---vertex-ai">Usage - Vertex AI<a href="https://docs.litellm.ai/en/blog/claude_fable_5#usage---vertex-ai" class="hash-link" aria-label="Direct link to Usage - Vertex AI" title="Direct link to Usage - Vertex AI">​</a></h2>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">LiteLLM Proxy</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><strong>1. Setup config.yaml</strong></p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">fable</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> vertex_ai/claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">fable</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">vertex_project</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/VERTEX_PROJECT</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">vertex_location</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> global</span><br></span></code></pre></div></div><p><strong>2. Start the proxy</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">docker run -d \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -p 4000:4000 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e VERTEX_PROJECT=$VERTEX_PROJECT \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e GOOGLE_APPLICATION_CREDENTIALS=/app/credentials.json \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -v $(pwd)/config.yaml:/app/config.yaml \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -v $(pwd)/credentials.json:/app/credentials.json \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:v1.89.0-rc.2 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --config /app/config.yaml</span><br></span></code></pre></div></div><p><strong>3. Test it!</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl --location 'http://0.0.0.0:4000/chat/completions' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Content-Type: application/json' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Authorization: Bearer $LITELLM_KEY' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--data '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "model": "claude-fable-5",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "messages": [</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "role": "user",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "content": "what llm are you"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ]</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">}'</span><br></span></code></pre></div></div></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="usage---bedrock">Usage - Bedrock<a href="https://docs.litellm.ai/en/blog/claude_fable_5#usage---bedrock" class="hash-link" aria-label="Direct link to Usage - Bedrock" title="Direct link to Usage - Bedrock">​</a></h2>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Bedrock only serves Fable 5 through inference profiles, so the model ID must carry a <code>us.</code>, <code>eu.</code>, or <code>global.</code> prefix. Invoking the bare <code>anthropic.claude-fable-5</code> model ID returns a validation error.</p></div></div>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">LiteLLM Proxy</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><strong>1. Setup config.yaml</strong></p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token key atrule">model_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">model_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">fable</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token key atrule">litellm_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> bedrock/converse/us.anthropic.claude</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">fable</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">aws_access_key_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AWS_ACCESS_KEY_ID</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">aws_secret_access_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/AWS_SECRET_ACCESS_KEY</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token key atrule">aws_region_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> us</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">east</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><br></span></code></pre></div></div><p><strong>2. Start the proxy</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">docker run -d \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -p 4000:4000 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -v $(pwd)/config.yaml:/app/config.yaml \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:v1.89.0-rc.2 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --config /app/config.yaml</span><br></span></code></pre></div></div><p><strong>3. Test it!</strong></p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl --location 'http://0.0.0.0:4000/chat/completions' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Content-Type: application/json' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Authorization: Bearer $LITELLM_KEY' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--data '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "model": "claude-fable-5",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "messages": [</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "role": "user",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "content": "what llm are you"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ]</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">}'</span><br></span></code></pre></div></div></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="advanced-features">Advanced Features<a href="https://docs.litellm.ai/en/blog/claude_fable_5#advanced-features" class="hash-link" aria-label="Direct link to Advanced Features" title="Direct link to Advanced Features">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="adaptive-thinking">Adaptive Thinking<a href="https://docs.litellm.ai/en/blog/claude_fable_5#adaptive-thinking" class="hash-link" aria-label="Direct link to Adaptive Thinking" title="Direct link to Adaptive Thinking">​</a></h3>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>When using <code>reasoning_effort</code> with Claude Fable 5, all values are mapped to <code>thinking: {type: "adaptive"}</code>. Fable 5 only supports adaptive thinking; explicit budgets via <code>thinking: {type: "enabled", budget_tokens: ...}</code> are rejected by the Anthropic API with a 400 error. To control thinking depth, pair adaptive thinking with <code>output_config.effort</code> (see <a href="https://docs.litellm.ai/en/blog/claude_fable_5#effort-levels">Effort Levels</a> below) rather than a fixed budget.</p></div></div>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">/chat/completions</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">/v1/messages</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p>LiteLLM supports adaptive thinking through the <code>reasoning_effort</code> parameter:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl --location 'http://0.0.0.0:4000/chat/completions' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Content-Type: application/json' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Authorization: Bearer $LITELLM_KEY' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--data '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "model": "claude-fable-5",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "messages": [</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "role": "user",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "content": "Solve this complex problem: What is the optimal strategy for..."</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ],</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "reasoning_effort": "high"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">}'</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Use the <code>thinking</code> parameter with <code>type: "adaptive"</code> to enable adaptive thinking mode:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl --location 'http://0.0.0.0:4000/v1/messages' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'x-api-key: sk-12345' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'content-type: application/json' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--data '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "model": "claude-fable-5",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "max_tokens": 16000,</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "thinking": {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        "type": "adaptive"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "messages": [</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            "role": "user",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            "content": "Explain why the sum of two even numbers is always even."</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    ]</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">}'</span><br></span></code></pre></div></div></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="effort-levels">Effort Levels<a href="https://docs.litellm.ai/en/blog/claude_fable_5#effort-levels" class="hash-link" aria-label="Direct link to Effort Levels" title="Direct link to Effort Levels">​</a></h3>
<p>Claude Fable 5 supports the full effort ladder: <code>low</code>, <code>medium</code>, <code>high</code> (default), <code>xhigh</code>, and <code>max</code>. These give you finer-grained control over how much reasoning the model applies to a task. Pass the effort level via the <code>output_config</code> parameter.</p>
<p>On Bedrock, <code>output_config.effort</code> caps at <code>xhigh</code>; the other providers accept the full ladder up to <code>max</code>.</p>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">/chat/completions</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">/v1/messages</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl --location 'http://0.0.0.0:4000/chat/completions' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Content-Type: application/json' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'Authorization: Bearer $LITELLM_KEY' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--data '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "model": "claude-fable-5",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "messages": [</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "role": "user",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">      "content": "Explain quantum computing"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ],</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  "output_config": {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "effort": "max"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">}'</span><br></span></code></pre></div></div><p><strong>Using OpenAI SDK:</strong></p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> openai</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">client </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> openai</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">OpenAI</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    api_key</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"your-litellm-key"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    base_url</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"http://0.0.0.0:4000"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">response </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> client</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">chat</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">completions</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">create</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"claude-fable-5"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    messages</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"role"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"user"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"content"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"Explain quantum computing"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    extra_body</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"output_config"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"effort"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"max"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div><p><strong>Using LiteLLM SDK:</strong></p><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> litellm </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> completion</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">response </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> completion</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"anthropic/claude-fable-5"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    messages</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"role"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"user"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"content"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"Explain quantum computing"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    output_config</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"effort"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"max"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div><p>You can combine <code>reasoning_effort</code> with <code>output_config</code> for even more fine-grained control over the model's behavior.</p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">curl --location 'http://0.0.0.0:4000/v1/messages' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'x-api-key: sk-12345' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--header 'content-type: application/json' \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">--data '{</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "model": "claude-fable-5",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "max_tokens": 4096,</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "messages": [</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            "role": "user",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            "content": "Explain quantum computing"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    ],</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "output_config": {</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        "effort": "max"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">}'</span><br></span></code></pre></div></div></div></div></div>
<p><strong>Effort level guide:</strong></p>
<table><thead><tr><th>Effort</th><th>When to use</th></tr></thead><tbody><tr><td><code>low</code></td><td>Short, fast responses for simple lookups, formatting, and classification</td></tr><tr><td><code>medium</code></td><td>Balanced tradeoff for everyday Q&amp;A and light reasoning</td></tr><tr><td><code>high</code> (default)</td><td>Complex reasoning, code generation, analysis</td></tr><tr><td><code>xhigh</code></td><td>Hard problems like multi-step math, deep research, and agentic planning</td></tr><tr><td><code>max</code></td><td>The hardest tasks where you want maximum reasoning depth regardless of latency (not available on Bedrock)</td></tr></tbody></table>]]></content>
        <author>
            <name>Mateo Wang</name>
            <uri>https://www.linkedin.com/in/mateo-wang</uri>
        </author>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <category label="anthropic" term="anthropic"/>
        <category label="claude" term="claude"/>
        <category label="fable 5" term="fable 5"/>
        <category label="day 0 support" term="day 0 support"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[A Unified Agent Control Plane]]></title>
        <id>https://docs.litellm.ai/en/blog/agents-are-the-new-llms</id>
        <link href="https://docs.litellm.ai/en/blog/agents-are-the-new-llms"/>
        <updated>2026-06-10T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[The AI Gateway is moving up the stack: from routing model calls to routing agent work.]]></summary>
        <content type="html"><![CDATA[<figure style="margin:0 0 2rem 0"><div style="background:#3a3a2e;border-radius:12px;overflow:hidden;aspect-ratio:1200 / 500;width:100%"><svg viewBox="0 0 1200 500" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" style="display:block" role="img" aria-label="Abstract curve bundle fanning in from the left, passing through two focal points, and fanning out on the right — representing many agent runtimes routed through a unified control plane to many consumers."><path d="M 0 25 Q 300 250, 600 250 Q 900 250, 1200 475" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.18" stroke-linecap="round"></path><path d="M 0 36.25 Q 300 250, 600 250 Q 900 250, 1200 463.75" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.1975" stroke-linecap="round"></path><path d="M 0 47.5 Q 300 250, 600 250 Q 900 250, 1200 452.5" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.21499999999999997" stroke-linecap="round"></path><path d="M 0 58.75 Q 300 250, 600 250 Q 900 250, 1200 441.25" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.23249999999999998" stroke-linecap="round"></path><path d="M 0 70 Q 300 250, 600 250 Q 900 250, 1200 430" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.24999999999999997" stroke-linecap="round"></path><path d="M 0 81.25 Q 300 250, 600 250 Q 900 250, 1200 418.75" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.26749999999999996" stroke-linecap="round"></path><path d="M 0 92.5 Q 300 250, 600 250 Q 900 250, 1200 407.5" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.28500000000000003" stroke-linecap="round"></path><path d="M 0 103.75 Q 300 250, 600 250 Q 900 250, 1200 396.25" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.3025" stroke-linecap="round"></path><path d="M 0 115 Q 300 250, 600 250 Q 900 250, 1200 385" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.31999999999999995" stroke-linecap="round"></path><path d="M 0 126.25 Q 300 250, 600 250 Q 900 250, 1200 373.75" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.33749999999999997" stroke-linecap="round"></path><path d="M 0 137.5 Q 300 250, 600 250 Q 900 250, 1200 362.5" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.355" stroke-linecap="round"></path><path d="M 0 148.75 Q 300 250, 600 250 Q 900 250, 1200 351.25" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.3725" stroke-linecap="round"></path><path d="M 0 160 Q 300 250, 600 250 Q 900 250, 1200 340" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.39" stroke-linecap="round"></path><path d="M 0 171.25 Q 300 250, 600 250 Q 900 250, 1200 328.75" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4075" stroke-linecap="round"></path><path d="M 0 182.5 Q 300 250, 600 250 Q 900 250, 1200 317.5" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.42499999999999993" stroke-linecap="round"></path><path d="M 0 193.75 Q 300 250, 600 250 Q 900 250, 1200 306.25" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.44249999999999995" stroke-linecap="round"></path><path d="M 0 205 Q 300 250, 600 250 Q 900 250, 1200 295" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.45999999999999996" stroke-linecap="round"></path><path d="M 0 216.25 Q 300 250, 600 250 Q 900 250, 1200 283.75" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4775" stroke-linecap="round"></path><path d="M 0 227.5 Q 300 250, 600 250 Q 900 250, 1200 272.5" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.495" stroke-linecap="round"></path><path d="M 0 238.75 Q 300 250, 600 250 Q 900 250, 1200 261.25" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.5125" stroke-linecap="round"></path><path d="M 0 250 Q 300 250, 600 250 Q 900 250, 1200 250" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.53" stroke-linecap="round"></path><path d="M 0 261.25 Q 300 250, 600 250 Q 900 250, 1200 238.75" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.5125" stroke-linecap="round"></path><path d="M 0 272.5 Q 300 250, 600 250 Q 900 250, 1200 227.5" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.495" stroke-linecap="round"></path><path d="M 0 283.75 Q 300 250, 600 250 Q 900 250, 1200 216.25" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4775" stroke-linecap="round"></path><path d="M 0 295 Q 300 250, 600 250 Q 900 250, 1200 205" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.45999999999999996" stroke-linecap="round"></path><path d="M 0 306.25 Q 300 250, 600 250 Q 900 250, 1200 193.75" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.44249999999999995" stroke-linecap="round"></path><path d="M 0 317.5 Q 300 250, 600 250 Q 900 250, 1200 182.5" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.42499999999999993" stroke-linecap="round"></path><path d="M 0 328.75 Q 300 250, 600 250 Q 900 250, 1200 171.25" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.4075" stroke-linecap="round"></path><path d="M 0 340 Q 300 250, 600 250 Q 900 250, 1200 160" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.39" stroke-linecap="round"></path><path d="M 0 351.25 Q 300 250, 600 250 Q 900 250, 1200 148.75" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.3725" stroke-linecap="round"></path><path d="M 0 362.5 Q 300 250, 600 250 Q 900 250, 1200 137.5" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.355" stroke-linecap="round"></path><path d="M 0 373.75 Q 300 250, 600 250 Q 900 250, 1200 126.25" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.33749999999999997" stroke-linecap="round"></path><path d="M 0 385 Q 300 250, 600 250 Q 900 250, 1200 115" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.31999999999999995" stroke-linecap="round"></path><path d="M 0 396.25 Q 300 250, 600 250 Q 900 250, 1200 103.75" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.3025" stroke-linecap="round"></path><path d="M 0 407.5 Q 300 250, 600 250 Q 900 250, 1200 92.5" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.28500000000000003" stroke-linecap="round"></path><path d="M 0 418.75 Q 300 250, 600 250 Q 900 250, 1200 81.25" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.26749999999999996" stroke-linecap="round"></path><path d="M 0 430 Q 300 250, 600 250 Q 900 250, 1200 70" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.24999999999999997" stroke-linecap="round"></path><path d="M 0 441.25 Q 300 250, 600 250 Q 900 250, 1200 58.75" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.23249999999999998" stroke-linecap="round"></path><path d="M 0 452.5 Q 300 250, 600 250 Q 900 250, 1200 47.5" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.21499999999999997" stroke-linecap="round"></path><path d="M 0 463.75 Q 300 250, 600 250 Q 900 250, 1200 36.25" fill="none" stroke="#faf9f5" stroke-width="0.9" stroke-opacity="0.1975" stroke-linecap="round"></path><circle cx="300" cy="250" r="4" fill="#faf9f5" opacity="0.95"></circle><circle cx="900" cy="250" r="4" fill="#faf9f5" opacity="0.95"></circle></svg></div></figure>
<p><em>Last updated: June 2026</em></p>
<p>Agent infrastructure is already separating into three layers: models, harnesses, and runtimes. We believe a fourth layer will emerge: the unified agent control plane. This will allow calling agents living in different agent runtimes, all from 1 place.</p>
<p>The reason is that companies will not run every agent on one runtime. Coding agents may run on Bedrock AgentCore or Claude Managed Agents. Data agents may run inside Elastic, Databricks, or Snowflake. Internal workflow agents may run on custom infrastructure. The control plane emerges because companies want one place where all of these agents can be used, regardless of where they were built or run.</p>
<p>But a registry alone is not enough. Anyone can build a list of agents.</p>
<p>The harder problem is invocation. Agent runtimes expose similar primitives — agents, sessions, events, tools — but they do not expose them through the same APIs. So if you want one place to actually use these agents, not just list them, the control plane has to manage agent runtimes, schedules, memory, and sessions.</p>
<p>This is the same pattern LiteLLM saw with models. Companies did not just need a catalog of models. They needed one interface to call them. The only change, is that the primitive is now the agent session, not the model call.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-stack-of-the-future">The Stack of the Future<a href="https://docs.litellm.ai/en/blog/agents-are-the-new-llms#the-stack-of-the-future" class="hash-link" aria-label="Direct link to The Stack of the Future" title="Direct link to The Stack of the Future">​</a></h2>
<figure style="margin:2.5rem 0;font-family:inherit"><div style="display:grid;grid-template-columns:180px 1fr 24px 1fr;gap:12px 12px;align-items:center"><div></div><div><div style="font-size:14px;font-weight:700;text-align:center;padding-bottom:4px">Model stack — today</div><div style="font-size:11px;opacity:0.6;text-align:center;padding-bottom:12px">calling models</div></div><div></div><div><div style="font-size:14px;font-weight:700;text-align:center;padding-bottom:4px">Agent stack — future</div><div style="font-size:11px;opacity:0.6;text-align:center;padding-bottom:12px">calling harnesses</div></div><div style="font-size:13px;font-weight:600;padding-right:12px">Unified API<div style="font-size:11px;opacity:0.6;margin-top:2px">one interface, many backends</div></div><div style="border:1px solid var(--ifm-color-emphasis-300);background:transparent;border-radius:8px;padding:14px 18px;min-height:56px;display:flex;flex-direction:column;justify-content:center"><div style="font-size:14px;font-weight:700;color:inherit">LiteLLM</div><div style="font-size:12px;opacity:0.7;margin-top:3px">one API across 100+ models</div></div><div style="font-size:16px;opacity:0.5;text-align:center">→</div><div style="border:1.5px dashed #3b82f6;background:rgba(59,130,246,0.08);border-radius:8px;padding:14px 18px;min-height:56px;display:flex;flex-direction:column;justify-content:center"><div style="font-size:14px;font-weight:700;color:#3b82f6">?</div><div style="font-size:12px;opacity:0.7;margin-top:3px">one API across agent runtimes</div></div><div style="font-size:13px;font-weight:600;padding-right:12px">Managed cloud service<div style="font-size:11px;opacity:0.6;margin-top:2px">fully hosted, pay-per-use</div></div><div style="border:1px solid var(--ifm-color-emphasis-300);background:transparent;border-radius:8px;padding:14px 18px;min-height:56px;display:flex;flex-direction:column;justify-content:center"><div style="font-size:14px;font-weight:700;color:inherit">Bedrock</div><div style="font-size:12px;opacity:0.7;margin-top:3px">cloud model inference</div></div><div style="font-size:16px;opacity:0.5;text-align:center">→</div><div style="border:1px solid var(--ifm-color-emphasis-300);background:transparent;border-radius:8px;padding:14px 18px;min-height:56px;display:flex;flex-direction:column;justify-content:center"><div style="font-size:14px;font-weight:700;color:inherit">Claude Managed Agents</div><div style="font-size:12px;opacity:0.7;margin-top:3px">cloud model + harness API</div></div><div style="font-size:13px;font-weight:600;padding-right:12px">Deployment platform<div style="font-size:11px;opacity:0.6;margin-top:2px">run open-source yourself</div></div><div style="border:1px solid var(--ifm-color-emphasis-300);background:transparent;border-radius:8px;padding:14px 18px;min-height:56px;display:flex;flex-direction:column;justify-content:center"><div style="font-size:14px;font-weight:700;color:inherit">SageMaker</div><div style="font-size:12px;opacity:0.7;margin-top:3px">deploy OSS models</div></div><div style="font-size:16px;opacity:0.5;text-align:center">→</div><div style="border:1px solid var(--ifm-color-emphasis-300);background:transparent;border-radius:8px;padding:14px 18px;min-height:56px;display:flex;flex-direction:column;justify-content:center"><div style="font-size:14px;font-weight:700;color:inherit">AgentCore · Vertex Agents</div><div style="font-size:12px;opacity:0.7;margin-top:3px">deploy OSS harnesses</div></div><div style="font-size:13px;font-weight:600;padding-right:12px">High-perf serving<div style="font-size:11px;opacity:0.6;margin-top:2px">throughput &amp; latency engine</div></div><div style="border:1px solid var(--ifm-color-emphasis-300);background:transparent;border-radius:8px;padding:14px 18px;min-height:56px;display:flex;flex-direction:column;justify-content:center"><div style="font-size:14px;font-weight:700;color:inherit">vLLM</div><div style="font-size:12px;opacity:0.7;margin-top:3px">fast model serving</div></div><div style="font-size:16px;opacity:0.5;text-align:center">→</div><div style="border:1.5px dashed #3b82f6;background:rgba(59,130,246,0.08);border-radius:8px;padding:14px 18px;min-height:56px;display:flex;flex-direction:column;justify-content:center"><div style="font-size:14px;font-weight:700;color:#3b82f6">?</div><div style="font-size:12px;opacity:0.7;margin-top:3px">fast harness serving</div></div></div><div style="display:flex;gap:24px;justify-content:center;margin-top:24px;font-size:12px;opacity:0.7;flex-wrap:wrap"><div style="display:flex;align-items:center;gap:8px"><div style="width:24px;height:14px;border-radius:4px;border:1.5px dashed #3b82f6;background:rgba(59,130,246,0.08)"></div><span>open gap — no clear winner yet</span></div><div style="display:flex;align-items:center;gap:8px"><div style="width:24px;height:14px;border-radius:4px;border:1px solid var(--ifm-color-emphasis-300);background:transparent"></div><span>established / announced player</span></div></div><figcaption style="text-align:center;font-size:12px;opacity:0.6;margin-top:14px">Each model-stack layer has a mirror in the agent stack. Dashed boxes mark open opportunities.</figcaption></figure>
<p>The important shift is that the gateway is no longer just routing model calls. It is routing agent work.</p>
<p>With LLMs, the stack became:</p>
<ul>
<li><strong>Models:</strong> GPT, Claude, Gemini, Llama</li>
<li><strong>Inference providers:</strong> OpenAI, Anthropic, Bedrock, Vertex, Azure, vLLM</li>
<li><strong>Gateway:</strong> routing, fallbacks, logging, spend tracking, auth, billing</li>
<li><strong>Applications:</strong> copilots, workflows, internal tools, products</li>
</ul>
<p>With agents, we think the stack becomes:</p>
<ul>
<li><strong>Models:</strong> Claude, GPT, Gemini, open-source models</li>
<li><strong>Harnesses:</strong> Claude Code, Codex, OpenCode, Hermes, DeepAgents</li>
<li><strong>Agent runtimes:</strong> Claude Managed Agents, Bedrock AgentCore, Gemini Enterprise Agent Platform, self-hosted runtimes</li>
<li><strong>Agent control plane:</strong> multi-runtime platform where teams manage agent runtimes, schedules, memory, and sessions.</li>
<li><strong>Applications:</strong> coding agents, support agents, data agents, security agents</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-companies-will-need-this">Why companies will need this<a href="https://docs.litellm.ai/en/blog/agents-are-the-new-llms#why-companies-will-need-this" class="hash-link" aria-label="Direct link to Why companies will need this" title="Direct link to Why companies will need this">​</a></h2>
<p>At LiteLLM, we are already seeing our team work across multiple agent runtimes. Some people are building on Claude Managed Agents, others are on N8N or Cursor.</p>
<p>This fragmentation makes it hard for agents built on these platforms to be shareable, and everyone to benefit from the work done so far.</p>
<p>By having the agents live in 1 place, everyone can leverage these agents - even if the PR Babysitter Agent was written in Claude Managed Agents, which not everyone has direct access to.</p>
<p>That is the control plane problem.</p>
<p>This is also why we think the AI Gateway moves up the stack. The gateway starts by managing model calls. But as agents become the dominant use-case for AI, the gateway has to manage agent sessions too.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-we-are-building">What we are building<a href="https://docs.litellm.ai/en/blog/agents-are-the-new-llms#what-we-are-building" class="hash-link" aria-label="Direct link to What we are building" title="Direct link to What we are building">​</a></h2>
<p><a href="https://github.com/LiteLLM-Labs/litellm-agent-platform" target="_blank" rel="noopener noreferrer">LiteLLM Agent Platform</a> is our experiment in this direction.</p>
<p>LiteLLM Agent Platform is a Rust-based AI Gateway and Agent Control Plane. The goal is to let teams register, invoke, observe, and govern agents across multiple runtimes.</p>
<p>We are starting with coding agents because the need is obvious. They are long-running, stateful, tool-heavy, and expensive enough to require real infrastructure.</p>
<p>We are already seeing early users resonate with this pattern. Some companies want LAP to act as a central control plane for agents built by different teams on different runtimes. For example, one team might build an agent on Elastic’s runtime to analyze Kibana logs, but the company may want to expose that agent internally through a common gateway.</p>
<p>This is the architecture we believe is coming: models become interchangeable, harnesses become specialized, runtimes become managed, and the gateway becomes the control plane for agent work.</p>
<p>If this matches what you are seeing, we would love feedback on LiteLLM Agent Platform:</p>
<p><a href="https://github.com/LiteLLM-Labs/litellm-agent-platform" target="_blank" rel="noopener noreferrer">https://github.com/LiteLLM-Labs/litellm-agent-platform</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="frequently-asked-questions">Frequently Asked Questions<a href="https://docs.litellm.ai/en/blog/agents-are-the-new-llms#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently Asked Questions" title="Direct link to Frequently Asked Questions">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="is-litellm-building-a-second-product">Is LiteLLM building a second product?<a href="https://docs.litellm.ai/en/blog/agents-are-the-new-llms#is-litellm-building-a-second-product" class="hash-link" aria-label="Direct link to Is LiteLLM building a second product?" title="Direct link to Is LiteLLM building a second product?">​</a></h3>
<p>No. LAP is an experimental project. The goal is to learn quickly and bring the right pieces into LiteLLM over time.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="is-lap-production-ready">Is LAP production-ready?<a href="https://docs.litellm.ai/en/blog/agents-are-the-new-llms#is-lap-production-ready" class="hash-link" aria-label="Direct link to Is LAP production-ready?" title="Direct link to Is LAP production-ready?">​</a></h3>
<p>No. LAP is pre-v0. APIs may change as we work with early users and contributors.</p>
<p>If you want to contribute, file an issue or join our Discord:</p>
<p><a href="https://discord.gg/Nkxw3rm3EE" target="_blank" rel="noopener noreferrer">https://discord.gg/Nkxw3rm3EE</a></p>]]></content>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <category label="ideas" term="ideas"/>
        <category label="harnesses" term="harnesses"/>
        <category label="ai-gateway" term="ai-gateway"/>
        <category label="agents" term="agents"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Announcing LiteLLM x Microsoft ASSERT]]></title>
        <id>https://docs.litellm.ai/en/blog/litellm-microsoft-assert</id>
        <link href="https://docs.litellm.ai/en/blog/litellm-microsoft-assert"/>
        <updated>2026-06-03T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[LiteLLM now integrates with Microsoft ASSERT for policy-driven agent evaluation — catch safety and quality defects before they reach production.]]></summary>
        <content type="html"><![CDATA[<p>Today we're excited to officially launch <strong>LiteLLM x Microsoft ASSERT</strong> — bringing policy-driven agent evaluation to every model running through the LiteLLM AI Gateway.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-assert">What is ASSERT?<a href="https://docs.litellm.ai/en/blog/litellm-microsoft-assert#what-is-assert" class="hash-link" aria-label="Direct link to What is ASSERT?" title="Direct link to What is ASSERT?">​</a></h2>
<p>ASSERT is Microsoft's open-source framework for policy-driven agent evaluation, built on a proven Microsoft Research approach. ASSERT takes your organizational policies and requirements as input, systematically generates targeted evaluation scenarios, and surfaces safety and quality defects before they reach production.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-this-matters">Why this matters<a href="https://docs.litellm.ai/en/blog/litellm-microsoft-assert#why-this-matters" class="hash-link" aria-label="Direct link to Why this matters" title="Direct link to Why this matters">​</a></h2>
<p>As teams ship agents into production, the gap between "it works in a demo" and "it behaves under our policies" is where real risk lives. ASSERT closes that gap by turning your written policies into concrete, testable evaluation scenarios — and now those evaluations run against any of the 100+ LLM providers LiteLLM supports, through a single unified interface.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-it-works-with-litellm">How it works with LiteLLM<a href="https://docs.litellm.ai/en/blog/litellm-microsoft-assert#how-it-works-with-litellm" class="hash-link" aria-label="Direct link to How it works with LiteLLM" title="Direct link to How it works with LiteLLM">​</a></h2>
<ul>
<li><strong>Bring your policies</strong> — ASSERT ingests your organizational policies and requirements.</li>
<li><strong>Generate scenarios</strong> — ASSERT systematically produces targeted evaluation scenarios.</li>
<li><strong>Run through LiteLLM</strong> — evaluate any model behind the LiteLLM Gateway with consistent auth, logging, and cost tracking.</li>
<li><strong>Surface defects early</strong> — catch safety and quality issues before they reach production.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="get-started">Get started<a href="https://docs.litellm.ai/en/blog/litellm-microsoft-assert#get-started" class="hash-link" aria-label="Direct link to Get started" title="Direct link to Get started">​</a></h2>
<p>ASSERT is open source. Point it at your LiteLLM Gateway endpoint and start evaluating your agents against your own policies today.</p>
<ul>
<li><a href="https://docs.litellm.ai/en/docs/proxy/quick_start">Set up the LiteLLM Gateway</a> — get a gateway endpoint running in minutes.</li>
<li><a href="https://github.com/microsoft/assert" target="_blank" rel="noopener noreferrer">Microsoft ASSERT on GitHub</a> — install ASSERT and run it against your gateway.</li>
</ul>]]></content>
        <author>
            <name>Mubashir Osmani</name>
            <uri>https://www.linkedin.com/in/mubashirosmani</uri>
        </author>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[LiteLLM Labs: Announcing Lite-Harness SDK — Unified API for Claude Code, Codex, and Pi AI]]></title>
        <id>https://docs.litellm.ai/en/blog/lite-harness-sdk</id>
        <link href="https://docs.litellm.ai/en/blog/lite-harness-sdk"/>
        <updated>2026-06-02T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[One SDK. Swap between Claude Code, Codex, and Pi AI by changing a string. Pairs with the LiteLLM AI Gateway for keys, budgets, logs, and fallbacks.]]></summary>
        <content type="html"><![CDATA[<p>Harnesses are the next frontier of vendor lock-in. LiteLLM was built to swap across model providers easily. However, as the models get saturated, the next area for competition becomes the harnesses and managed agents. To make it easy to go across vendors at the harness layer, we're launching the Lite-Harness SDK. This is a simple TypeScript+Python SDK which allows developers to change harnesses, like they change models.</p>
<p>It exposes harnesses in a unified Claude Agents SDK spec. This means that if you wrote your app with the Claude Agents SDK, and want to try another harness (Pi AI, Hermes, Codex, OpenCode), you can do so without rewriting your code.</p>
<p>Today, it supports 3 harnesses - Claude Code, Codex, and Pi AI. Please file an issue <a href="https://github.com/LiteLLM-Labs/lite-harness/issues" target="_blank" rel="noopener noreferrer">here</a>, if you want us to add another harness.</p>
<p>Here's how it works:</p>
<p><strong>TypeScript Example</strong></p>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> query </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"@lite-harness/sdk"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> prompt </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"Fix the failing test"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)">// Claude Code harness</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> message </span><span class="token keyword" style="color:rgb(0, 0, 255)">of</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">query</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  prompt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  options</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> harness</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"claude-code"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> model</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"claude-opus-4-8"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token builtin" style="color:rgb(0, 112, 193)">console</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">log</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)">// Codex harness</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> message </span><span class="token keyword" style="color:rgb(0, 0, 255)">of</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">query</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  prompt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  options</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> harness</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"codex"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> model</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"gpt-5.5"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token builtin" style="color:rgb(0, 112, 193)">console</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token function" style="color:rgb(0, 0, 255)">log</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><br></span></code></pre></div></div>
<p><strong>Python Example</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> lite_harness </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> query</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> AgentOptions</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">prompt </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"Fix the failing test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># Claude Code harness</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> message </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> query</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    prompt</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">prompt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    options</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">AgentOptions</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">harness</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"claude-code"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"claude-opus-4-8"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># Codex harness</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> message </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> query</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    prompt</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">prompt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    options</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">AgentOptions</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">harness</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"codex"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"gpt-5.5"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="litellm-ai-gateway">LiteLLM AI Gateway<a href="https://docs.litellm.ai/en/blog/lite-harness-sdk#litellm-ai-gateway" class="hash-link" aria-label="Direct link to LiteLLM AI Gateway" title="Direct link to LiteLLM AI Gateway">​</a></h2>
<p>Lite-Harness supports proxy'ing harnesses via LiteLLM AI Gateway. This enables easy model swapping, cost controls and logging.</p>
<p>Point Lite-Harness at your gateway by setting two environment variables:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token plain">export LITELLM_API_BASE=https://litellm.your-company.com/v1</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">export LITELLM_API_KEY=sk-litellm-...</span><br></span></code></pre></div></div>
<p>Then call as usual — every underlying model request routes through the gateway:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> lite_harness </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> query</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> AgentOptions</span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">prompt </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"Fix the failing test"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># Claude Code harness</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> message </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> query</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    prompt</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">prompt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    options</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">AgentOptions</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">harness</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"claude-code"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"claude-opus-4-8"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># Codex harness</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> message </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> query</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    prompt</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">prompt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    options</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">AgentOptions</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">harness</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"codex"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"gpt-5.5"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="frequently-asked-questions">Frequently Asked Questions<a href="https://docs.litellm.ai/en/blog/lite-harness-sdk#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently Asked Questions" title="Direct link to Frequently Asked Questions">​</a></h3>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="do-i-have-to-use-the-litellm-ai-gateway">Do I have to use the LiteLLM AI Gateway?<a href="https://docs.litellm.ai/en/blog/lite-harness-sdk#do-i-have-to-use-the-litellm-ai-gateway" class="hash-link" aria-label="Direct link to Do I have to use the LiteLLM AI Gateway?" title="Direct link to Do I have to use the LiteLLM AI Gateway?">​</a></h3>
<p>No. <code>lite-harness</code> works standalone — point it at provider APIs with native keys. AI Gateway integration is opt-in for teams that want central key management, budgets, fallbacks, and a single audit log across every model call.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="does-swapping-harnesses-change-agent-behavior">Does swapping harnesses change agent behavior?<a href="https://docs.litellm.ai/en/blog/lite-harness-sdk#does-swapping-harnesses-change-agent-behavior" class="hash-link" aria-label="Direct link to Does swapping harnesses change agent behavior?" title="Direct link to Does swapping harnesses change agent behavior?">​</a></h3>
<p>Yes — that's the point. Each harness keeps its native loop, tool-calling semantics, and prompt format. <code>lite-harness</code> unifies how you <em>invoke</em> them, not how they run internally. Run the same prompt across all three to see which combo lands the task best.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="is-this-ready-for-production">Is this ready for production?<a href="https://docs.litellm.ai/en/blog/lite-harness-sdk#is-this-ready-for-production" class="hash-link" aria-label="Direct link to Is this ready for production?" title="Direct link to Is this ready for production?">​</a></h3>
<p><code>lite-harness</code> is an early, experimental project. This is in public beta. Please join our <a href="https://discord.gg/Nkxw3rm3EE" target="_blank" rel="noopener noreferrer">discord</a>, to help design it to your preference.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="is-this-available-in-litellm-oss">Is this available in LiteLLM OSS?<a href="https://docs.litellm.ai/en/blog/lite-harness-sdk#is-this-available-in-litellm-oss" class="hash-link" aria-label="Direct link to Is this available in LiteLLM OSS?" title="Direct link to Is this available in LiteLLM OSS?">​</a></h3>
<p>Yes. <code>lite-harness</code> is MIT-licensed at <a href="https://github.com/LiteLLM-Labs/lite-harness" target="_blank" rel="noopener noreferrer">github.com/LiteLLM-Labs/lite-harness</a>. <a href="https://litellm.ai/enterprise" target="_blank" rel="noopener noreferrer">LiteLLM Enterprise</a> adds SSO/SCIM, air-gapped deployment, 24/7 SLA, and advanced guardrails on top of the AI Gateway it pairs with.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="recommended-reading">Recommended Reading<a href="https://docs.litellm.ai/en/blog/lite-harness-sdk#recommended-reading" class="hash-link" aria-label="Direct link to Recommended Reading" title="Direct link to Recommended Reading">​</a></h2>
<ul>
<li><a href="https://docs.litellm.ai/docs/simple_proxy" target="_blank" rel="noopener noreferrer">LiteLLM AI Gateway — full feature overview</a></li>
<li><a href="https://docs.litellm.ai/blog/agent-platform-alpha" target="_blank" rel="noopener noreferrer">LiteLLM Managed Agents Platform — Alpha</a></li>
<li><a href="https://docs.litellm.ai/docs/routing" target="_blank" rel="noopener noreferrer">Load balancing and routing across 100+ LLM providers</a></li>
</ul>]]></content>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <category label="litellm-labs" term="litellm-labs"/>
        <category label="product" term="product"/>
        <category label="agents" term="agents"/>
        <category label="sdk" term="sdk"/>
        <category label="ai-gateway" term="ai-gateway"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fixed in 1.84.0+ - Version Update: Authentication Bypass via Host Header Injection (GHSA-4xpc-pv4p-pm3w)]]></title>
        <id>https://docs.litellm.ai/en/blog/host-header-auth-bypass</id>
        <link href="https://docs.litellm.ai/en/blog/host-header-auth-bypass"/>
        <updated>2026-06-01T12:00:00.000Z</updated>
        <summary type="html"><![CDATA[Disclosure of a Host-header authentication bypass in the LiteLLM proxy. Addressed in v1.84.0. Very limited deployments are potentially affected, and no LiteLLM Cloud customers were affected.]]></summary>
        <content type="html"><![CDATA[<p>The update addressing this Host-header authentication bypass in the LiteLLM proxy shipped in <code>v1.84.0</code>, with follow-up path-handling hardening completed and backported across the maintained release lines in <code>v1.84.3</code>, <code>v1.85.2</code>, <code>v1.86.2</code>, and <code>v1.83.10-stable.patch.3</code>. The potential for bypass was limited to deployments with the three specific conditions below. The bypass was reported by Le The Thang (KCSC) and Kim Ngoc Chung (One Mount Group).</p>
<p>The conditions could allow unauthenticated access to protected management routes when the proxy listener was reachable with an arbitrary <code>Host</code> header.</p>
<p>No LiteLLM Cloud customers were affected. The update was deployed across all LiteLLM Cloud environments - backported to the release lines in use - ahead of this publication.</p>
<ul>
<li>Addressed in: <code>v1.84.0</code></li>
<li>Recommended: the latest release; follow-up path-handling hardening was backported in <code>v1.84.3</code>, <code>v1.85.2</code>, and <code>v1.86.2</code></li>
<li>Action: upgrade to <code>v1.84.0</code> or later. No configuration change is required.</li>
</ul>
<p>More info on the advisory is here: <a href="https://github.com/BerriAI/litellm/security/advisories/GHSA-4xpc-pv4p-pm3w" target="_blank" rel="noopener noreferrer">https://github.com/BerriAI/litellm/security/advisories/GHSA-4xpc-pv4p-pm3w</a>. CVE: <a href="https://www.cve.org/CVERecord?id=CVE-2026-48710" target="_blank" rel="noopener noreferrer">https://www.cve.org/CVERecord?id=CVE-2026-48710</a>.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="tldr">TL;DR<a href="https://docs.litellm.ai/en/blog/host-header-auth-bypass#tldr" class="hash-link" aria-label="Direct link to TL;DR" title="Direct link to TL;DR">​</a></h2>
<ul>
<li>A crafted <code>Host</code> header could make the proxy's auth gate evaluate a different route from the one it served, allowing potential unauthenticated access to protected management routes.</li>
<li>The update shipped in <code>v1.84.0</code>. Follow-up path-handling hardening was backported in <code>v1.84.3</code>, <code>v1.85.2</code>, and <code>v1.86.2</code>; upgrading to the latest release is recommended.</li>
<li>Potential bypass requires reaching the proxy listener with an arbitrary <code>Host</code> header. Fronting the proxy with infrastructure that validates or normalizes <code>Host</code> reduces potential for bypass depending on configuration, but is not a comprehensive substitute for upgrading.</li>
<li>No LiteLLM Cloud customers were affected.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="https://docs.litellm.ai/en/blog/host-header-auth-bypass#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
<p>The proxy's auth layer derived the effective route from <code>request.url.path</code> in <code>litellm/proxy/auth/auth_utils.py::get_request_route()</code>, which Starlette reconstructs from the <code>Host</code> header. A crafted <code>Host</code> header could therefore make the auth gate evaluate a different route from the one FastAPI actually dispatched, causing a protected management route to be treated as public.</p>
<p>Potential bypass requires an actor to reach the proxy listener with an arbitrary <code>Host</code> header. Fronting the proxy with infrastructure that validates or normalizes the <code>Host</code> header reduces potential for bypass, though whether it fully blocks the bypass depends on the specific configuration. The LiteLLM Python SDK is not affected; only the proxy server is in limited scope.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="additional-hardening">Additional hardening<a href="https://docs.litellm.ai/en/blog/host-header-auth-bypass#additional-hardening" class="hash-link" aria-label="Direct link to Additional hardening" title="Direct link to Additional hardening">​</a></h2>
<p>The primary update in <code>v1.84.0</code> addressed the reported potential for bypass by deriving the request route from the ASGI scope path rather than the <code>Host</code>-reconstructed URL. As additional follow-up, we audited every other location in the proxy that derived a route from the request URL and moved them onto the same hardened resolution. This closes the long tail of the potential for bypass and was backported across the maintained release lines in <code>v1.84.3</code>, <code>v1.85.2</code>, <code>v1.86.2</code>, and <code>v1.83.10-stable.patch.3</code>. We recommend upgrading to one of these releases for comprehensive mitigation.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="am-i-affected">Am I affected?<a href="https://docs.litellm.ai/en/blog/host-header-auth-bypass#am-i-affected" class="hash-link" aria-label="Direct link to Am I affected?" title="Direct link to Am I affected?">​</a></h2>
<p>You are potentially affected only if <strong>all</strong> of the following are true:</p>
<ul>
<li>You run the <strong>LiteLLM proxy server</strong> (not just the Python SDK).</li>
<li>You are on a version <strong>earlier than <code>v1.84.0</code></strong>.</li>
<li>The proxy listener is reachable by untrusted clients.</li>
</ul>
<p>You are <strong>not</strong> remotely open to potential bypass if the proxy listener is not reachable by untrusted clients — for example, it is bound to a private network or sits behind a gateway that requires its own authentication.</p>
<p>Fronting the proxy with infrastructure that validates or normalizes the <code>Host</code> header (a CDN/WAF, a reverse proxy with <code>server_name</code> allowlists, or a host-based load balancer) reduces potential for bypass, but whether it fully mitigates against potential bypass depends on the configuration.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-to-do">What to do<a href="https://docs.litellm.ai/en/blog/host-header-auth-bypass#what-to-do" class="hash-link" aria-label="Direct link to What to do" title="Direct link to What to do">​</a></h2>
<ol>
<li>Upgrade to <code>v1.84.0</code> or later. Upgrading to the latest release is recommended, which includes the follow-up hardening backported in <code>v1.84.3</code>, <code>v1.85.2</code>, and <code>v1.86.2</code>.</li>
<li>If your proxy was reachable from an untrusted network on an affected version, rotate any API keys created during the exposure window and review your management audit logs for unexpected key, user, or settings changes.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="mitigations">Mitigations<a href="https://docs.litellm.ai/en/blog/host-header-auth-bypass#mitigations" class="hash-link" aria-label="Direct link to Mitigations" title="Direct link to Mitigations">​</a></h2>
<p>If you cannot upgrade immediately, to better mitigate the potential for bypass, we recommend placing the proxy behind an upstream component that validates or normalizes the <code>Host</code> header before forwarding:</p>
<ul>
<li>a CDN or WAF (e.g. Cloudflare),</li>
<li>a reverse proxy with explicit <code>server_name</code> allowlists (nginx, Caddy, Traefik),</li>
<li>a cloud load balancer with host-based routing rules,</li>
</ul>
<p>or otherwise restrict network access to the proxy listener. Note this is a per-deployment property: a reverse proxy that forwards the client <code>Host</code> unchanged (e.g. nginx <code>proxy_set_header Host $host;</code>) may not comprehensively protect your use from this potential. Treat upgrading as the elimination of any potential for bypass and edge filtering only as a stopgap.</p>]]></content>
        <author>
            <name>Krrish Dholakia</name>
            <uri>https://www.linkedin.com/in/krish-d/</uri>
        </author>
        <author>
            <name>Ishaan Jaffer</name>
            <uri>https://www.linkedin.com/in/reffajnaahsi/</uri>
        </author>
        <author>
            <name>Yuneng Jiang</name>
            <uri>https://www.linkedin.com/in/yuneng-david-jiang-455676139/</uri>
        </author>
        <category label="security" term="security"/>
    </entry>
</feed>