<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>liteLLM Blog</title>
        <link>https://docs.litellm.ai/blog</link>
        <description>liteLLM Blog</description>
        <lastBuildDate>Fri, 03 Apr 2026 12:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Security Update: Vulnerability Disclosures and Ongoing Hardening]]></title>
            <link>https://docs.litellm.ai/blog/security-hardening-april-2026</link>
            <guid>https://docs.litellm.ai/blog/security-hardening-april-2026</guid>
            <pubDate>Fri, 03 Apr 2026 12:00:00 GMT</pubDate>
            <description><![CDATA[Disclosure of security vulnerabilities fixed in LiteLLM v1.83.0, and the launch of our bug bounty program.]]></description>
            <content:encoded><![CDATA[<p>After the <a href="https://docs.litellm.ai/blog/security-update-march-2026" target="_blank" rel="noopener noreferrer">supply chain incident</a> in March, we brought in <a href="https://verialabs.com/" target="_blank" rel="noopener noreferrer">Veria Labs</a> to audit the LiteLLM proxy and fixed a number of vulnerability reports from independent researchers. All issues below are fixed in v1.83.0. If you are affected, particularly if you have JWT auth enabled, we recommend upgrading.</p>
<p>We've also launched a <a href="https://docs.litellm.ai/blog/security-hardening-april-2026#bug-bounty-program">bug bounty program</a> and Veria Labs is continuing to audit the proxy. More fixes will ship in upcoming versions.</p>
<p>The two high-severity issues (<a href="https://github.com/BerriAI/litellm/security/advisories/GHSA-53mr-6c8q-9789" target="_blank" rel="noopener noreferrer">CVE-2026-35029</a> and <a href="https://github.com/BerriAI/litellm/security/advisories/GHSA-69x8-hrgq-fjj8" target="_blank" rel="noopener noreferrer">GHSA-69x8-hrgq-fjj8</a>) <strong>both require the attacker to already have a valid API key for the proxy</strong>. These are not exploitable by unauthenticated users.</p>
<p>The critical-severity issue (<a href="https://github.com/BerriAI/litellm/security/advisories/GHSA-jjhc-v7c2-5hh6" target="_blank" rel="noopener noreferrer">CVE-2026-35030</a>) is an authentication bypass, but only affects deployments with <code>enable_jwt_auth</code> explicitly enabled, which is off by default. <strong>The default LiteLLM configuration is not affected, and no LiteLLM Cloud customers had this feature enabled.</strong></p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="vulnerabilities">Vulnerabilities<a href="https://docs.litellm.ai/blog/security-hardening-april-2026#vulnerabilities" class="hash-link" aria-label="Direct link to Vulnerabilities" title="Direct link to Vulnerabilities">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cve-2026-35030-authentication-bypass-via-oidc-cache-collision-critical">CVE-2026-35030: Authentication bypass via OIDC cache collision (Critical)<a href="https://docs.litellm.ai/blog/security-hardening-april-2026#cve-2026-35030-authentication-bypass-via-oidc-cache-collision-critical" class="hash-link" aria-label="Direct link to CVE-2026-35030: Authentication bypass via OIDC cache collision (Critical)" title="Direct link to CVE-2026-35030: Authentication bypass via OIDC cache collision (Critical)">​</a></h3>
<p>Found by Veria Labs.</p>
<p>When <code>enable_jwt_auth</code> is enabled, LiteLLM cached OIDC userinfo using <code>token[:20]</code> as the cache key. JWTs from the same signing algorithm share the same header prefix, so an attacker could forge a token that hits another user's cache entry and inherit their session. We fixed this by keying the cache on <code>sha256(token)</code> instead.</p>
<p><strong>Most deployments are not affected.</strong> This requires <code>enable_jwt_auth: true</code>, which is off by default. If you can't upgrade, disable JWT auth as a workaround.</p>
<p>Full advisory: <a href="https://github.com/BerriAI/litellm/security/advisories/GHSA-jjhc-v7c2-5hh6" target="_blank" rel="noopener noreferrer">GHSA-jjhc-v7c2-5hh6</a></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cve-2026-35029-privilege-escalation-via-configupdate-high">CVE-2026-35029: Privilege escalation via <code>/config/update</code> (High)<a href="https://docs.litellm.ai/blog/security-hardening-april-2026#cve-2026-35029-privilege-escalation-via-configupdate-high" class="hash-link" aria-label="Direct link to cve-2026-35029-privilege-escalation-via-configupdate-high" title="Direct link to cve-2026-35029-privilege-escalation-via-configupdate-high">​</a></h3>
<p>Found by Lakera.</p>
<p><code>/config/update</code> didn't check the caller's role. Any authenticated user could modify the proxy's runtime configuration, which could lead to arbitrary file read, admin account takeover, or remote code execution. We now require the <code>proxy_admin</code> role on this endpoint.</p>
<p>Full advisory: <a href="https://github.com/BerriAI/litellm/security/advisories/GHSA-53mr-6c8q-9789" target="_blank" rel="noopener noreferrer">GHSA-53mr-6c8q-9789</a></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="password-hash-exposure-and-pass-the-hash-login-high">Password hash exposure and pass-the-hash login (High)<a href="https://docs.litellm.ai/blog/security-hardening-april-2026#password-hash-exposure-and-pass-the-hash-login-high" class="hash-link" aria-label="Direct link to Password hash exposure and pass-the-hash login (High)" title="Direct link to Password hash exposure and pass-the-hash login (High)">​</a></h3>
<p>Weak hashing originally reported by GitHub user <a href="https://github.com/hamzayevmaqsud" target="_blank" rel="noopener noreferrer">hamzayevmaqsud</a> (<a href="https://github.com/BerriAI/litellm/issues/15484" target="_blank" rel="noopener noreferrer">#15484</a>). The full chain was identified by Luca Vandenweghe and Maarten De Rammelaere of <a href="https://www.iodigital.com/" target="_blank" rel="noopener noreferrer">iO Digital</a>.</p>
<p>Passwords were stored as unsalted SHA-256 hashes, and in some cases plaintext. Several API endpoints returned the hash to any authenticated user, and <code>/v2/login</code> accepted the raw hash as a credential without re-hashing it, so a stolen hash was as good as the password itself. We've moved to scrypt with random salts and stripped hashes from all API responses.</p>
<p>Full advisory: <a href="https://github.com/BerriAI/litellm/security/advisories/GHSA-69x8-hrgq-fjj8" target="_blank" rel="noopener noreferrer">GHSA-69x8-hrgq-fjj8</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bug-bounty-program">Bug bounty program<a href="https://docs.litellm.ai/blog/security-hardening-april-2026#bug-bounty-program" class="hash-link" aria-label="Direct link to Bug bounty program" title="Direct link to Bug bounty program">​</a></h2>
<p>After the supply chain incident and these disclosures it was clear we needed more external eyes on the project. We've set up a bug bounty program so researchers have a way to report issues.</p>
<p>Bounties are currently paid for P0 (supply chain) and P1 (unauthenticated proxy access) vulnerabilities:</p>
<table><thead><tr><th>Severity</th><th>Bounty</th><th>Example</th></tr></thead><tbody><tr><td>Critical</td><td>$1,500 – $3,000</td><td>Supply chain compromise</td></tr><tr><td>High</td><td>$500 – $1,500</td><td>Unauthenticated access to protected data</td></tr></tbody></table>
<p>We plan on expanding the program further in the coming months. More info about the bug bounty program is available <a href="https://github.com/BerriAI/litellm/security" target="_blank" rel="noopener noreferrer">here</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next<a href="https://docs.litellm.ai/blog/security-hardening-april-2026#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next">​</a></h2>
<p>Veria Labs is continuing to work with us on a broader audit of the proxy. Security advisories sent through Github will be responded to within five business days. We'll publish advisories as issues are confirmed and fixed.</p>]]></content:encoded>
            <category>security</category>
        </item>
        <item>
            <title><![CDATA[April Townhall: Security + Product Roadmap]]></title>
            <link>https://docs.litellm.ai/blog/april-townhall-announcement</link>
            <guid>https://docs.litellm.ai/blog/april-townhall-announcement</guid>
            <pubDate>Thu, 02 Apr 2026 07:30:00 GMT</pubDate>
            <description><![CDATA[Join the LiteLLM April townhall on Friday, 10 April at 7:30 AM to learn about LiteLLM's security and product roadmap.]]></description>
            <content:encoded><![CDATA[<p>We are hosting our April townhall on <strong>Friday, 10 April 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,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAADAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMH/8QAHxAAAQQABwAAAAAAAAAAAAAAAQACAwQRFTFTgZLR/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQL/xAAXEQEBAQEAAAAAAAAAAAAAAAABABEx/9oADAMBAAIRAxEAPwDCYr01aJgiEAOGroGOJ5IJU8ytbo6N8RFAGEvb/9k=&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="/assets/ideal-img/april_townhall_banner.11dc874.640.png" srcset="/assets/ideal-img/april_townhall_banner.11dc874.640.png 640w,/assets/ideal-img/april_townhall_banner.f46611e.1024.png 1024w" width="640" height="166"></noscript></div>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="agenda">Agenda<a href="https://docs.litellm.ai/blog/april-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="how-to-contribute">How to contribute<a href="https://docs.litellm.ai/blog/april-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 your thoughts to this <a href="https://github.com/BerriAI/litellm/issues/24825" target="_blank" rel="noopener noreferrer">ticket</a> to help us shape the agenda.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="register">Register<a href="https://docs.litellm.ai/blog/april-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/hvyVXwbFjzJQE7dEA" target="_blank" rel="noopener noreferrer">LiteLLM April 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:encoded>
            <category>announcement</category>
            <category>townhall</category>
        </item>
        <item>
            <title><![CDATA[Announcing CI/CD v2 for LiteLLM]]></title>
            <link>https://docs.litellm.ai/blog/ci-cd-v2-improvements</link>
            <guid>https://docs.litellm.ai/blog/ci-cd-v2-improvements</guid>
            <pubDate>Mon, 30 Mar 2026 21:30:00 GMT</pubDate>
            <description><![CDATA[CI/CD v2 introduces isolated environments, stronger security gates, and safer release separation for LiteLLM.]]></description>
            <content:encoded><![CDATA[<p>The CI/CD v2 is now live for LiteLLM.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAYAAAB8ZH1oAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAb0lEQVR4nD2NiQrDMAxD8/9fupK6hhxOQg4NmXUCYYyfpYCfaq0wM+ScMcbA3tsnPedEeEFVRYzRzSeK8FrLZzjnYPSOZobWGnrvKKX8U18FHh4R6H07xISUksN8ZK2DrPlcFx5Vh9ggIl7PRO4EvzaSwx0PchZkAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="311"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/ci_cd_architecture.776d500.640.png" srcset="/assets/ideal-img/ci_cd_architecture.776d500.640.png 640w,/assets/ideal-img/ci_cd_architecture.299029f.1920.png 1920w" width="640" height="311"></noscript></div>
<br>
<p>Building on the roadmap from our <a href="https://docs.litellm.ai/blog/security-townhall-updates#roadmap" target="_blank" rel="noopener noreferrer">security incident</a>, CI/CD v2 introduces isolated environments, stronger security gates, and safer release separation for LiteLLM.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-changed">What changed<a href="https://docs.litellm.ai/blog/ci-cd-v2-improvements#what-changed" class="hash-link" aria-label="Direct link to What changed" title="Direct link to What changed">​</a></h2>
<ul>
<li>Security scans and unit tests run in isolated environments.</li>
<li>Validation and release are separated into different repositories, making it harder for an attacker to reach release credentials.</li>
<li>Trusted Publishing for PyPI releases - this means no long-lived credentials are used to publish releases.</li>
<li>Immutable Docker release tags - this means no tampering of Docker release tags after they are published <a href="https://docs.docker.com/docker-hub/repos/manage/hub-images/immutable-tags/" target="_blank" rel="noopener noreferrer">Learn more</a>. Note: work for GHCR docker releases is planned as well.</li>
<li>Docker image signing with <a href="https://github.com/sigstore/cosign" target="_blank" rel="noopener noreferrer">Cosign</a> - all release images are signed so users can independently verify they came from us.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="verify-docker-image-signatures">Verify Docker image signatures<a href="https://docs.litellm.ai/blog/ci-cd-v2-improvements#verify-docker-image-signatures" class="hash-link" aria-label="Direct link to Verify Docker image signatures" title="Direct link to Verify Docker image signatures">​</a></h2>
<p>Starting from <code>v1.83.0-nightly</code>, all LiteLLM Docker images published to GHCR are signed with <a href="https://docs.sigstore.dev/cosign/overview/" target="_blank" rel="noopener noreferrer">cosign</a>. Every release is signed with the same key introduced in <a href="https://github.com/BerriAI/litellm/commit/0112e53046018d726492c814b3644b7d376029d0" target="_blank" rel="noopener noreferrer">commit <code>0112e53</code></a>.</p>
<p><strong>Verify using the pinned commit hash (recommended):</strong></p>
<p>A commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:</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">cosign verify \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:&lt;release-tag&gt;</span><br></span></code></pre></div></div>
<p><strong>Verify using a release tag (convenience):</strong></p>
<p>Tags are protected in this repository and resolve to the same key. This option is easier to read but relies on tag protection rules:</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">cosign verify \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --key https://raw.githubusercontent.com/BerriAI/litellm/&lt;release-tag&gt;/cosign.pub \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:&lt;release-tag&gt;</span><br></span></code></pre></div></div>
<p>Replace <code>&lt;release-tag&gt;</code> with the version you are deploying (e.g. <code>v1.83.0-stable</code>).</p>
<p>Expected output:</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">The following checks were performed on each of these signatures:</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  - The cosign claims were validated</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  - The signatures were verified against the specified public key</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next<a href="https://docs.litellm.ai/blog/ci-cd-v2-improvements#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next">​</a></h2>
<p>Moving forward, we plan on:</p>
<ul>
<li>
<p>Adopting OpenSSF (this is a set of security criteria that projects should meet to demonstrate a strong security posture - <a href="https://baseline.openssf.org/versions/2026-02-19.html" target="_blank" rel="noopener noreferrer">Learn more</a>)</p>
<ul>
<li>We've added Scorecard and Allstar to our Github</li>
</ul>
</li>
<li>
<p>Adding SLSA Build Provenance to our CI/CD pipeline - this means we allow users to independently verify that a release came from us and prevent silent modifications of releases after they are published.</p>
</li>
</ul>
<p>We hope that this will mean you can be confident that the releases you are using are safe and from us.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-principle">The principle<a href="https://docs.litellm.ai/blog/ci-cd-v2-improvements#the-principle" class="hash-link" aria-label="Direct link to The principle" title="Direct link to The principle">​</a></h2>
<p>The new CI/CD pipeline reflects the principles, outlined below, and is designed to be more secure and reliable:</p>
<ul>
<li><strong>Limit</strong> what each package can access</li>
<li><strong>Reduce</strong> the number of sensitive environment variables</li>
<li><strong>Avoid</strong> compromised packages</li>
<li><strong>Prevent</strong> release tampering</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-help">How to help:<a href="https://docs.litellm.ai/blog/ci-cd-v2-improvements#how-to-help" class="hash-link" aria-label="Direct link to How to help:" title="Direct link to How to help:">​</a></h2>
<p>Help us plan April's stability sprint - <a href="https://github.com/BerriAI/litellm/issues/24825" target="_blank" rel="noopener noreferrer">https://github.com/BerriAI/litellm/issues/24825</a></p>]]></content:encoded>
            <category>engineering</category>
            <category>ci-cd</category>
            <category>security</category>
        </item>
        <item>
            <title><![CDATA[LiteLLM + Vanta: SOC 2 Type 2 and ISO 27001 Recertification]]></title>
            <link>https://docs.litellm.ai/blog/vanta-compliance-recertification</link>
            <guid>https://docs.litellm.ai/blog/vanta-compliance-recertification</guid>
            <pubDate>Mon, 30 Mar 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[LiteLLM is partnering with Vanta on SOC 2 Type 2 and ISO 27001 recertification and engaging independent auditors for verification.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="LiteLLM x Vanta SOC-2 Recertification" src="https://docs.litellm.ai/assets/images/vanta_soc2_recertification-fde66e1d979a0b86abd5400b5f48e57e.png" width="1024" height="535" class="img_ev3q"></p>
<p>We are partnering with <a href="https://www.vanta.com/" target="_blank" rel="noopener noreferrer">Vanta</a> to recertify LiteLLM's compliance for SOC 2 Type 2 and ISO 27001.</p>
<p>As part of this process, we are also identifying independent auditors to validate and verify our compliance posture.</p>
<p>This is part of our commitment to being the most secure and transparent AI Gateway possible.</p>]]></content:encoded>
            <category>security</category>
            <category>compliance</category>
        </item>
        <item>
            <title><![CDATA[Security Townhall Updates]]></title>
            <link>https://docs.litellm.ai/blog/security-townhall-updates</link>
            <guid>https://docs.litellm.ai/blog/security-townhall-updates</guid>
            <pubDate>Fri, 27 Mar 2026 12:00:00 GMT</pubDate>
            <description><![CDATA[What happened, what we've done, and what comes next for LiteLLM's release and security processes.]]></description>
            <content:encoded><![CDATA[<p>Thank you to everyone who joined our town hall.</p>
<p>We wanted to use that time to walk through what we know, what we've done so far, and how we're improving LiteLLM's release and security processes going forward. This post is a written version of that update. <a href="https://drive.google.com/file/d/17hsSG7nk-OYL7VRCTbTa7McrWREtS9OO/view?usp=sharing" target="_blank" rel="noopener noreferrer">Slides available here</a></p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-happened">What happened<a href="https://docs.litellm.ai/blog/security-townhall-updates#what-happened" class="hash-link" aria-label="Direct link to What happened" title="Direct link to What happened">​</a></h2>
<p>On March 24, 2026 at 10:39 UTC, LiteLLM v1.82.7 was pushed to PyPI. Version v1.82.8 was published soon after. Those packages were live for about 40 minutes before being quarantined by PyPI. By 16:00 UTC, the LiteLLM team had worked with PyPI to delete the affected packages.</p>
<p>At this point, our understanding is that this was a supply-chain incident affecting those two published versions.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-did-this-happen">How did this happen?<a href="https://docs.litellm.ai/blog/security-townhall-updates#how-did-this-happen" class="hash-link" aria-label="Direct link to How did this happen?" title="Direct link to How did this happen?">​</a></h2>
<p>Our understanding is that the issue came from the <a href="https://www.aquasec.com/blog/trivy-supply-chain-attack-what-you-need-to-know/" target="_blank" rel="noopener noreferrer">compromised Trivy security scanner</a> dependency in our CI/CD pipeline.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAHAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMI/8QAGhAAAgMBAQAAAAAAAAAAAAAAAAECESExQv/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwDTThBPOvcdWU56YAH/2Q==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="426"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/shared_ci_cd_environment.cc08ed1.640.png" srcset="/assets/ideal-img/shared_ci_cd_environment.cc08ed1.640.png 640w,/assets/ideal-img/shared_ci_cd_environment.6a6445c.1024.png 1024w" width="640" height="426"></noscript></div>
<p>There were three major contributing factors:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-shared-cicd-environment">1. Shared CI/CD environment<a href="https://docs.litellm.ai/blog/security-townhall-updates#1-shared-cicd-environment" class="hash-link" aria-label="Direct link to 1. Shared CI/CD environment" title="Direct link to 1. Shared CI/CD environment">​</a></h3>
<p>At the time, everything was running on CircleCI, and all steps shared a common environment. That increased blast radius: if one component was compromised, it could potentially access credentials or context intended for other parts of the pipeline.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-static-credentials-in-environment-variables">2. Static credentials in environment variables<a href="https://docs.litellm.ai/blog/security-townhall-updates#2-static-credentials-in-environment-variables" class="hash-link" aria-label="Direct link to 2. Static credentials in environment variables" title="Direct link to 2. Static credentials in environment variables">​</a></h3>
<p>Release credentials, including credentials for PyPI, GHCR, and Docker publishing, were available as static secrets in the environment. That meant a compromised step could access long-lived release credentials.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-unpinned-trivy-dependency">3. Unpinned Trivy dependency<a href="https://docs.litellm.ai/blog/security-townhall-updates#3-unpinned-trivy-dependency" class="hash-link" aria-label="Direct link to 3. Unpinned Trivy dependency" title="Direct link to 3. Unpinned Trivy dependency">​</a></h3>
<p>In our security scanning component, we had an unpinned Trivy dependency. Our present understanding is that a compromised Trivy package ran during the scan, had access to environment variables, and enabled attackers to obtain those credentials.</p>
<p><strong>In summary:</strong> a compromised package in CI had access to secrets it should not have had, and those secrets were then used in the release path.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-weve-already-done">What we've already done<a href="https://docs.litellm.ai/blog/security-townhall-updates#what-weve-already-done" class="hash-link" aria-label="Direct link to What we've already done" title="Direct link to What we've already done">​</a></h2>
<p>In the last 3 days, we've taken the following steps:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-minimize-scope-of-impact">1. Minimize Scope of Impact<a href="https://docs.litellm.ai/blog/security-townhall-updates#1-minimize-scope-of-impact" class="hash-link" aria-label="Direct link to 1. Minimize Scope of Impact" title="Direct link to 1. Minimize Scope of Impact">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="prevented-further-key-abuse">Prevented further key abuse<a href="https://docs.litellm.ai/blog/security-townhall-updates#prevented-further-key-abuse" class="hash-link" aria-label="Direct link to Prevented further key abuse" title="Direct link to Prevented further key abuse">​</a></h4>
<p>We deleted or rotated all impacted or adjacent secret keys, including PyPI, GitHub, Docker, and related credentials. Out of an abundance of caution, we've also rotated LiteLLM maintainer accounts.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="prevent-branch-attacks">Prevent branch attacks<a href="https://docs.litellm.ai/blog/security-townhall-updates#prevent-branch-attacks" class="hash-link" aria-label="Direct link to Prevent branch attacks" title="Direct link to Prevent branch attacks">​</a></h4>
<p>We removed roughly 6,000 open branches and added an auto-deletion policy for branches merged into <code>main</code>. This reduces the surface area for branch-based abuse.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="pinned-cicd-dependencies">Pinned CI/CD dependencies<a href="https://docs.litellm.ai/blog/security-townhall-updates#pinned-cicd-dependencies" class="hash-link" aria-label="Direct link to Pinned CI/CD dependencies" title="Direct link to Pinned CI/CD dependencies">​</a></h4>
<p>We've pinned all Github Actions, and are working on pinning all CircleCI dependencies as well.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="paused-releases">Paused releases<a href="https://docs.litellm.ai/blog/security-townhall-updates#paused-releases" class="hash-link" aria-label="Direct link to Paused releases" title="Direct link to Paused releases">​</a></h4>
<p>We've paused new releases until we've confirmed codebase security and put stronger release controls in place.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-secured-litellm">2. Secured LiteLLM<a href="https://docs.litellm.ai/blog/security-townhall-updates#2-secured-litellm" class="hash-link" aria-label="Direct link to 2. Secured LiteLLM" title="Direct link to 2. Secured LiteLLM">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="forensic-analysis">Forensic analysis<a href="https://docs.litellm.ai/blog/security-townhall-updates#forensic-analysis" class="hash-link" aria-label="Direct link to Forensic analysis" title="Direct link to Forensic analysis">​</a></h4>
<p>We are working with Google's Mandiant cybersecurity team to confirm the source of the attack and verify the security of the codebase. We also confirmed that no malicious code was pushed to <code>main</code>.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="confirm-application-security">Confirm Application Security<a href="https://docs.litellm.ai/blog/security-townhall-updates#confirm-application-security" class="hash-link" aria-label="Direct link to Confirm Application Security" title="Direct link to Confirm Application Security">​</a></h4>
<p>In parallel, we are working with whitehat hackers at <a href="https://verialabs.com/" target="_blank" rel="noopener noreferrer">Veria Labs</a> to verify application security and review improvements to our CI/CD process.</p>
<p>We have also confirmed that the last 20 LiteLLM releases contain no indicators of compromise, and that no unauthenticated attacks can be made against LiteLLM Proxy based on our current investigation. <a href="https://docs.litellm.ai/blog/security-update-march-2026#verified-safe-versions" target="_blank" rel="noopener noreferrer">Check Security Blog for release verification.</a></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="created-a-security-working-group">Created a security working group<a href="https://docs.litellm.ai/blog/security-townhall-updates#created-a-security-working-group" class="hash-link" aria-label="Direct link to Created a security working group" title="Direct link to Created a security working group">​</a></h4>
<p>We created a new security working group inside LiteLLM focused on:</p>
<ul>
<li>Building threat models</li>
<li>Auditing the build process and dependencies</li>
</ul>
<p>If you're interested in joining the security working group, please file an issue <a href="https://github.com/BerriAI/litellm-security-wg" target="_blank" rel="noopener noreferrer">here</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-improved-cicd">3. Improved CI/CD<a href="https://docs.litellm.ai/blog/security-townhall-updates#3-improved-cicd" class="hash-link" aria-label="Direct link to 3. Improved CI/CD" title="Direct link to 3. Improved CI/CD">​</a></h3>
<p>We've already begun making structural changes to how releases are built and published. These align with our goals (covered in the next section) around isolated environments, ephemeral credentials, and release auditing.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="roadmap">Roadmap<a href="https://docs.litellm.ai/blog/security-townhall-updates#roadmap" class="hash-link" aria-label="Direct link to Roadmap" title="Direct link to Roadmap">​</a></h2>
<p>We plan on following 4 guiding principles for our new CI/CD pipeline:</p>
<ol>
<li><strong>Limit</strong> what each package can access</li>
<li><strong>Reduce</strong> the number of sensitive environment variables</li>
<li><strong>Avoid</strong> compromised packages</li>
<li><strong>Prevent</strong> release tampering</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="isolated-environments">Isolated environments<a href="https://docs.litellm.ai/blog/security-townhall-updates#isolated-environments" class="hash-link" aria-label="Direct link to Isolated environments" title="Direct link to Isolated environments">​</a></h3>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAACAAoDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAEI/8QAHBAAAgICAwAAAAAAAAAAAAAAAAESMQIRIUGx/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ANIbcrfXpcW4rl0AB//Z&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="132"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/assets/ideal-img/isolated_ci_cd_environments.c07a1eb.640.png" srcset="/assets/ideal-img/isolated_ci_cd_environments.c07a1eb.640.png 640w,/assets/ideal-img/isolated_ci_cd_environments.e4b94cf.1024.png 1024w" width="640" height="132"></noscript></div>
<p>We are breaking our CI/CD into 4 semantic concepts:</p>
<ol>
<li>Unit tests</li>
<li>Integration tests</li>
<li>Security scans</li>
<li>Release publishing</li>
</ol>
<p>And will be running each of these in isolated environments.</p>
<p>This will limit the damage that any single compromised component can cause.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ephemeral-credentials">Ephemeral credentials<a href="https://docs.litellm.ai/blog/security-townhall-updates#ephemeral-credentials" class="hash-link" aria-label="Direct link to Ephemeral credentials" title="Direct link to Ephemeral credentials">​</a></h3>
<p>We plan to move to ephemeral credentials for PyPI (Trusted Publisher) and GHCR (Token-based authentication) releases. This will reduce the risk of credentials being leaked or compromised.</p>
<p>We have already begun doing this:</p>
<ul>
<li>PyPI Trusted Publisher on GitHub Actions <a href="https://github.com/BerriAI/litellm/pull/24654" target="_blank" rel="noopener noreferrer">PR</a></li>
<li>GHCR Token-based authentication on GitHub Actions <a href="https://github.com/BerriAI/litellm/pull/24683" target="_blank" rel="noopener noreferrer">PR</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="release-auditing">Release auditing<a href="https://docs.litellm.ai/blog/security-townhall-updates#release-auditing" class="hash-link" aria-label="Direct link to Release auditing" title="Direct link to Release auditing">​</a></h3>
<p>Our goal is to allow users to independently verify that a release came from us and prevent silent modifications of releases after they are published.</p>
<p>This will ensure, your releases are safe, even when:</p>
<ul>
<li>Stolen PyPI/GHCR credentials are used to publish malicious releases</li>
<li>Tampered registry artifacts are published</li>
<li>Tag mutations are made after the release is published</li>
</ul>
<p>We believe that <a href="https://github.com/sigstore/cosign" target="_blank" rel="noopener noreferrer">Cosign</a> is a good fit for this, and have shipped it in <a href="https://github.com/BerriAI/litellm/pull/24683" target="_blank" rel="noopener noreferrer">PR #24683</a>.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-verify-a-docker-image-with-cosign">How to verify a Docker image with Cosign<a href="https://docs.litellm.ai/blog/security-townhall-updates#how-to-verify-a-docker-image-with-cosign" class="hash-link" aria-label="Direct link to How to verify a Docker image with Cosign" title="Direct link to How to verify a Docker image with Cosign">​</a></h4>
<p>Starting from <code>v1.83.0-nightly</code>, all LiteLLM Docker images published to GHCR are signed with <a href="https://docs.sigstore.dev/cosign/overview/" target="_blank" rel="noopener noreferrer">cosign</a>. Every release is signed with the same key that was introduced in <a href="https://github.com/BerriAI/litellm/commit/0112e53046018d726492c814b3644b7d376029d0" target="_blank" rel="noopener noreferrer">commit <code>0112e53</code></a>.</p>
<p><strong>Verify using the pinned commit hash (recommended):</strong></p>
<p>A commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:</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">cosign verify \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:&lt;release-tag&gt;</span><br></span></code></pre></div></div>
<p><strong>Verify using a release tag (convenience):</strong></p>
<p>Tags are protected in this repository and resolve to the same key. This option is easier to read but relies on tag protection rules:</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">cosign verify \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --key https://raw.githubusercontent.com/BerriAI/litellm/&lt;release-tag&gt;/cosign.pub \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:&lt;release-tag&gt;</span><br></span></code></pre></div></div>
<p>Replace <code>&lt;release-tag&gt;</code> with the version you are deploying (e.g. <code>v1.83.0-stable</code>).</p>
<p>Expected output:</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">The following checks were performed on each of these signatures:</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  - The cosign claims were validated</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  - The signatures were verified against the specified public key</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="avoid-compromised-packages">Avoid Compromised Packages<a href="https://docs.litellm.ai/blog/security-townhall-updates#avoid-compromised-packages" class="hash-link" aria-label="Direct link to Avoid Compromised Packages" title="Direct link to Avoid Compromised Packages">​</a></h3>
<ul>
<li>Move to pinned, verified SHAs for packages and actions used in CI/CD, avoiding <code>latest</code> wherever possible.</li>
<li>Add a cooldown period before upgrading to a new version of a package - allows more time to investigate and verify the new version.</li>
</ul>
<p>We've added zizmor to help us catch issues such as unpinned dependencies and credential leakage. <a href="https://github.com/BerriAI/litellm/commit/a671275f5c5b0e1fb1adacdf3b6ef779aaa5d56c" target="_blank" rel="noopener noreferrer">commit</a>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="frequently-asked-questions">Frequently Asked Questions<a href="https://docs.litellm.ai/blog/security-townhall-updates#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently Asked Questions" title="Direct link to Frequently Asked Questions">​</a></h2>
<p><strong>Q: Did you observe any lateral movement into your corporate environment during this incident?</strong></p>
<p>A: No. Our investigation to date, conducted in coordination with external security experts, has found no evidence of lateral movement into our internal corporate systems. The incident was isolated to the CI/CD pipeline and the release path for specific versions (v1.82.7 and v1.82.8). As a proactive measure, we have rotated all potentially impacted or adjacent secrets—including PyPI, GitHub, and Docker credentials—and updated maintainer account security to ensure continued isolation.</p>
<p><strong>Q: Do you expect delays in future product releases due to these new security measures?</strong></p>
<p>A: We are committed to balancing security with speed. While we have temporarily paused releases to implement stronger controls, we are moving quickly to automate our new security protocols. We are currently implementing isolated CI/CD environments, ephemeral credentials (via Trusted Publishers), and release auditing with Cosign. These improvements are designed to be integrated into our automated pipeline, allowing us to maintain a fast release cadence while ensuring every package is verified and secure.</p>
<p><strong>Q: Were older packages impacted?</strong></p>
<p>Our current findings show no indicators of compromise in the last 20 versions of LiteLLM. This was manually verified by our team and independently reviewed by Veria Labs.</p>
<p>We have also published the verified versions for users to use. <a href="https://docs.litellm.ai/blog/security-update-march-2026#verified-safe-versions" target="_blank" rel="noopener noreferrer">Check Security Blog for release verification.</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="questions--support">Questions &amp; Support<a href="https://docs.litellm.ai/blog/security-townhall-updates#questions--support" class="hash-link" aria-label="Direct link to Questions &amp; Support" title="Direct link to Questions &amp; Support">​</a></h2>
<p>If you believe your systems may be affected, contact us immediately:</p>
<ul>
<li><strong>Security:</strong> <a href="mailto:security@berri.ai" target="_blank" rel="noopener noreferrer">security@berri.ai</a></li>
<li><strong>Support:</strong> <a href="mailto:support@berri.ai" target="_blank" rel="noopener noreferrer">support@berri.ai</a></li>
<li><strong>Slack:</strong> Reach out to the LiteLLM team directly <a href="https://join.slack.com/t/litellmossslack/shared_invite/zt-3o7nkuyfr-p_kbNJj8taRfXGgQI1~YyA" target="_blank" rel="noopener noreferrer">here</a></li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="hiring">Hiring<a href="https://docs.litellm.ai/blog/security-townhall-updates#hiring" class="hash-link" aria-label="Direct link to Hiring" title="Direct link to Hiring">​</a></h2>
<p>We are currently hiring for:</p>
<ul>
<li>DevOps Engineer - to keep ci/cd secure and running smoothly</li>
<li>Security Engineer - to keep the application secure</li>
</ul>
<p>If you're interest in joining, please apply <a href="https://jobs.ashbyhq.com/litellm" target="_blank" rel="noopener noreferrer">here</a></p>]]></content:encoded>
            <category>security</category>
            <category>incident-report</category>
        </item>
        <item>
            <title><![CDATA[Security Update: Suspected Supply Chain Incident]]></title>
            <link>https://docs.litellm.ai/blog/security-update-march-2026</link>
            <guid>https://docs.litellm.ai/blog/security-update-march-2026</guid>
            <pubDate>Tue, 24 Mar 2026 14:00:00 GMT</pubDate>
            <description><![CDATA[As of 2:00 PM ET on March 24, 2026]]></description>
            <content:encoded><![CDATA[<blockquote>
<p><strong>Status:</strong> Active investigation
<strong>Last updated:</strong> March 27, 2026</p>
</blockquote>
<blockquote>
<p><strong>Update (March 30):</strong> A new <strong>clean</strong> version of LiteLLM is now available (v1.83.0). This was released by our new <a href="https://docs.litellm.ai/blog/ci-cd-v2-improvements" target="_blank" rel="noopener noreferrer">CI/CD v2</a> pipeline which added isolated environments, stronger security gates, and safer release separation for LiteLLM.</p>
</blockquote>
<blockquote>
<p><strong>Update (March 27):</strong> Review Townhall updates, including explanation of the incident, what we've done, and what comes next. <a href="https://docs.litellm.ai/blog/security-townhall-updates" target="_blank" rel="noopener noreferrer">Learn more</a></p>
</blockquote>
<blockquote>
<p><strong>Update (March 27):</strong> Added <a href="https://docs.litellm.ai/blog/security-update-march-2026#verified-safe-versions">Verified safe versions</a> section with SHA-256 checksums for all audited PyPI and Docker releases.</p>
</blockquote>
<blockquote>
<p><strong>Update (March 26):</strong> Added <code>checkmarx[.]zone</code> to <a href="https://docs.litellm.ai/blog/security-update-march-2026#indicators-of-compromise-iocs">Indicators of compromise</a></p>
</blockquote>
<blockquote>
<p><strong>Update (March 25):</strong> Added community-contributed scripts for scanning GitHub Actions and GitLab CI pipelines for the compromised versions. See <a href="https://docs.litellm.ai/blog/security-update-march-2026#how-to-check-if-you-are-affected">How to check if you are affected</a>. s/o <a href="https://www.linkedin.com/in/fryware/" target="_blank" rel="noopener noreferrer">@Zach Fury</a> for these scripts.</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="tldr">TLDR;<a href="https://docs.litellm.ai/blog/security-update-march-2026#tldr" class="hash-link" aria-label="Direct link to TLDR;" title="Direct link to TLDR;">​</a></h2>
<ul>
<li>The compromised PyPI packages were <strong>litellm==1.82.7</strong> and <strong>litellm==1.82.8</strong>. Those packages were live on March 24, 2026 from 10:39 UTC for about 40 minutes before being quarantined by PyPI.</li>
<li>We believe that the compromise originated from the <a href="https://www.aquasec.com/blog/trivy-supply-chain-attack-what-you-need-to-know/" target="_blank" rel="noopener noreferrer">Trivy dependency</a> used in our CI/CD security scanning workflow.</li>
<li>Customers running the official LiteLLM Proxy Docker image were not impacted. That deployment path pins dependencies in requirements.txt and does not rely on the compromised PyPI packages.</li>
<li><del>We have paused all new LiteLLM releases until we complete a broader supply-chain review and confirm the release path is safe.</del> <strong>Updated:</strong> We have now released a new <strong>safe</strong> version of LiteLLM (v1.83.0) by our new <a href="https://docs.litellm.ai/blog/ci-cd-v2-improvements" target="_blank" rel="noopener noreferrer">CI/CD v2</a> pipeline which added isolated environments, stronger security gates, and safer release separation for LiteLLM. We have also verified the codebase is safe and no malicious code was pushed to <code>main</code>.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="overview">Overview<a href="https://docs.litellm.ai/blog/security-update-march-2026#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview">​</a></h2>
<p>LiteLLM AI Gateway is investigating a suspected supply chain attack involving unauthorized PyPI package publishes. Current evidence suggests a maintainer's PyPI account may have been compromised and used to distribute malicious code.</p>
<p>At this time, we believe this incident may be linked to the broader <a href="https://www.aquasec.com/blog/trivy-supply-chain-attack-what-you-need-to-know/" target="_blank" rel="noopener noreferrer">Trivy security compromise</a>, in which stolen credentials were reportedly used to gain unauthorized access to the LiteLLM publishing pipeline.</p>
<p>This investigation is ongoing. Details below may change as we confirm additional findings.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="confirmed-affected-versions">Confirmed affected versions<a href="https://docs.litellm.ai/blog/security-update-march-2026#confirmed-affected-versions" class="hash-link" aria-label="Direct link to Confirmed affected versions" title="Direct link to Confirmed affected versions">​</a></h2>
<p>The following LiteLLM versions published to PyPI were impacted:</p>
<ul>
<li><strong>v1.82.7</strong>: contained a malicious payload in the LiteLLM AI Gateway <code>proxy_server.py</code></li>
<li><strong>v1.82.8</strong>: contained <code>litellm_init.pth</code> and a malicious payload in the LiteLLM AI Gateway <code>proxy_server.py</code></li>
</ul>
<p>If you installed or ran either of these versions, review the recommendations below immediately.</p>
<p>Note: These versions have already been removed from PyPI.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-happened">What happened<a href="https://docs.litellm.ai/blog/security-update-march-2026#what-happened" class="hash-link" aria-label="Direct link to What happened" title="Direct link to What happened">​</a></h2>
<p>Initial evidence suggests the attacker bypassed official CI/CD workflows and uploaded malicious packages directly to PyPI.</p>
<p>These compromised versions appear to have included a credential stealer designed to:</p>
<ul>
<li>Harvest secrets by scanning for:<!-- -->
<ul>
<li>environment variables</li>
<li>SSH keys</li>
<li>cloud provider credentials (AWS, GCP, Azure)</li>
<li>Kubernetes tokens</li>
<li>database passwords</li>
</ul>
</li>
<li>Encrypt and exfiltrate data via a <code>POST</code> request to <code>models.litellm.cloud</code>, which is <strong>not</strong> an official BerriAI / LiteLLM domain</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="who-is-affected">Who is affected<a href="https://docs.litellm.ai/blog/security-update-march-2026#who-is-affected" class="hash-link" aria-label="Direct link to Who is affected" title="Direct link to Who is affected">​</a></h2>
<p>You may be affected if <strong>any</strong> of the following are true:</p>
<ul>
<li>You installed or upgraded LiteLLM via <code>pip</code> on <strong>March 24, 2026</strong>, between <strong>10:39 UTC and 16:00 UTC</strong></li>
<li>You ran <code>pip install litellm</code> without pinning a version and received <strong>v1.82.7</strong> or <strong>v1.82.8</strong></li>
<li>You built a Docker image during this window that included <code>pip install litellm</code> without a pinned version</li>
<li>A dependency in your project pulled in LiteLLM as a transitive, unpinned dependency
(for example through AI agent frameworks, MCP servers, or LLM orchestration tools)</li>
</ul>
<p>You are <strong>not</strong> affected if any of the following are true:</p>
<p><strong>LiteLLM AI Gateway/Proxy users:</strong> Customers running the official LiteLLM Proxy Docker image were not impacted. That deployment path pins dependencies in requirements.txt and does not rely on the compromised PyPI packages.</p>
<ul>
<li>You are using <strong>LiteLLM Cloud</strong></li>
<li>You are using the official LiteLLM AI Gateway Docker image: <code>ghcr.io/berriai/litellm</code></li>
<li>You are on <strong>v1.82.6 or earlier</strong> and did not upgrade during the affected window</li>
<li>You installed LiteLLM from source via the GitHub repository, which was <strong>not</strong> compromised</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-check-if-you-are-affected">How to check if you are affected<a href="https://docs.litellm.ai/blog/security-update-march-2026#how-to-check-if-you-are-affected" class="hash-link" aria-label="Direct link to How to check if you are affected" title="Direct link to How to check if you are affected">​</a></h3>
<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">SDK</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">PROXY</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">GitHub Actions</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">GitLab CI</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">pip show litellm</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Go to the proxy base url, and check the version of the installed LiteLLM.</p><p><img decoding="async" loading="lazy" alt="Proxy version check" src="https://docs.litellm.ai/assets/images/proxy_version-7ecd8ff118d34c2d69423a3fd9536319.png" width="3108" height="1343" class="img_ev3q"></p></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Scans all repositories in a GitHub organization for workflow jobs that installed the compromised versions.</p><p><strong>Requirements:</strong> Python 3 and <code>requests</code> (<code>pip install requests</code>).</p><p><strong>Setup:</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">export GITHUB_TOKEN="your-github-pat"</span><br></span></code></pre></div></div><p><strong>Run:</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">python find_litellm_github.py</span><br></span></code></pre></div></div><p>Set the <code>ORG</code> variable in the script to your GitHub organization name.</p><p>Both scripts default to scanning jobs from <strong>today</strong>. Adjust the <code>WINDOW_START</code> and <code>WINDOW_END</code> constants to cover <strong>March 24, 2026</strong> (the incident date) if running on a different day.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>View full script (find_litellm_github.py)</summary><div><div class="collapsibleContent_i85q"><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)">#!/usr/bin/env python3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">"""</span><br></span><span class="token-line" style="color:#000000"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">Scan all GitHub Actions jobs in a GitHub org that ran between</span><br></span><span class="token-line" style="color:#000000"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">0800-1244 UTC today and identify any that installed litellm 1.82.7 or 1.82.8.</span><br></span><span class="token-line" style="color:#000000"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span><br></span><span class="token-line" style="color:#000000"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">Adjust WINDOW_START / WINDOW_END to cover March 24, 2026 if running later.</span><br></span><span class="token-line" style="color:#000000"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">"""</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)">import</span><span class="token plain"> io</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)">import</span><span class="token plain"> os</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)">import</span><span class="token plain"> re</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)">import</span><span class="token plain"> sys</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)">import</span><span class="token plain"> zipfile</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"> concurrent</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">futures </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> ThreadPoolExecutor</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> as_completed</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"> datetime </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> timezone</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)">import</span><span class="token plain"> requests</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">GITHUB_URL   </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)">"https://api.github.com"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">ORG          </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)">"your-org"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># &lt;-- set to your GitHub organization</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">TOKEN        </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><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 plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"GITHUB_TOKEN"</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)">""</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">TODAY        </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">now</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">timezone</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">utc</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">date</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">WINDOW_START </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">TODAY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">year</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> TODAY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">month</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> TODAY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">day</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)">8</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</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</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> tzinfo</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">timezone</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">utc</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">WINDOW_END   </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">TODAY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">year</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> TODAY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">month</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> TODAY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">day</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)">12</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)">44</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</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> tzinfo</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">timezone</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">utc</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">TARGET_VERSIONS </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 string" style="color:rgb(163, 21, 21)">"1.82.7"</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)">"1.82.8"</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">VERSION_PATTERN </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token builtin" style="color:rgb(0, 112, 193)">compile</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">r"litellm[=\-](\d+\.\d+\.\d+)"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">IGNORECASE</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">SESSION </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">Session</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">SESSION</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">headers</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">update</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 string" style="color:rgb(163, 21, 21)">"Authorization"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"Bearer </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">TOKEN</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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)">"Accept"</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)">"application/vnd.github+json"</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)">"X-GitHub-Api-Version"</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)">"2022-11-28"</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">get_paginated</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> params</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token boolean">None</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">    params </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">dict</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">params </span><span class="token keyword" style="color:rgb(0, 0, 255)">or</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 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">    params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">setdefault</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"per_page"</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 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">    page </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</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)">while</span><span class="token plain"> </span><span class="token boolean">True</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">        params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"page"</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"> page</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        resp </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> SESSION</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> params</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> timeout</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">30</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)">if</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">status_code </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">404</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)">return</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">raise_for_status</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">        data </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">json</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)">if</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">isinstance</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">dict</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">            items </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">next</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">v </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> v </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> data</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">values</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 keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">isinstance</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">v</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">list</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 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)">else</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">            items </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> data</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)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> items</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)">break</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)">yield</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> items</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)">if</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">items</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)">&lt;</span><span class="token plain"> params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"per_page"</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)">break</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        page </span><span class="token operator" style="color:rgb(0, 0, 0)">+=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">parse_ts</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">ts_str</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)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> ts_str</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)">return</span><span class="token plain"> </span><span class="token boolean">None</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)">return</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">fromisoformat</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">ts_str</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"Z"</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)">"+00:00"</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">get_repos</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">    repos </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 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)">for</span><span class="token plain"> r </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> get_paginated</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">GITHUB_URL</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/orgs/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">ORG</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/repos"</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)">"all"</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">        repos</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</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)">"id"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"id"</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 string" style="color:rgb(163, 21, 21)">"name"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"name"</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 string" style="color:rgb(163, 21, 21)">"full_name"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"full_name"</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 keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> repos</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">get_runs_in_window</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">repo_full_name</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">    created_filter </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">        </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">WINDOW_START</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation">strftime</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'%Y-%m-%dT%H:%M:%SZ'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"..</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">WINDOW_END</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation">strftime</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'%Y-%m-%dT%H:%M:%SZ'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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">    url </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">GITHUB_URL</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/repos/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">repo_full_name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/actions/runs"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    runs </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 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)">for</span><span class="token plain"> run </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> get_paginated</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</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)">"created"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> created_filter</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)">"per_page"</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 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">        ts </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> parse_ts</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">run</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"run_started_at"</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)">or</span><span class="token plain"> run</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"created_at"</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)">if</span><span class="token plain"> ts </span><span class="token keyword" style="color:rgb(0, 0, 255)">and</span><span class="token plain"> WINDOW_START </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;=</span><span class="token plain"> ts </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;=</span><span class="token plain"> WINDOW_END</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">            runs</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">run</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)">return</span><span class="token plain"> runs</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">get_jobs_for_run</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">repo_full_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> run_id</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">    url </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">GITHUB_URL</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/repos/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">repo_full_name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/actions/runs/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">run_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/jobs"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    jobs </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 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)">for</span><span class="token plain"> job </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> get_paginated</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</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)">"filter"</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)">"all"</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">        ts </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> parse_ts</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"started_at"</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)">if</span><span class="token plain"> ts </span><span class="token keyword" style="color:rgb(0, 0, 255)">and</span><span class="token plain"> WINDOW_START </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;=</span><span class="token plain"> ts </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;=</span><span class="token plain"> WINDOW_END</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">            jobs</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">job</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)">return</span><span class="token plain"> jobs</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">fetch_job_log</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">repo_full_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job_id</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">    url </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">GITHUB_URL</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/repos/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">repo_full_name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/actions/jobs/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">job_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/logs"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    resp </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> SESSION</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> timeout</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">60</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> allow_redirects</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token boolean">True</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)">if</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">status_code </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">403</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)">404</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)">410</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)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">raise_for_status</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">    content_type </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">headers</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"Content-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)">""</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)">if</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"zip"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> content_type </span><span class="token keyword" style="color:rgb(0, 0, 255)">or</span><span class="token plain"> resp</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><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token number" style="color:rgb(9, 134, 88)">2</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)">b"PK"</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)">try</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)">with</span><span class="token plain"> zipfile</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">ZipFile</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">io</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">BytesIO</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">resp</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><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)">as</span><span class="token plain"> zf</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">                parts </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 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)">for</span><span class="token plain"> name </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">sorted</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">zf</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">namelist</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 keyword" style="color:rgb(0, 0, 255)">with</span><span class="token plain"> zf</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token builtin" style="color:rgb(0, 112, 193)">open</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">name</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)">as</span><span class="token plain"> f</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">                        parts</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">f</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">read</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">decode</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"utf-8"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> errors</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"replace"</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)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"\n"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">parts</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)">except</span><span class="token plain"> zipfile</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">BadZipFile</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)">pass</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)">return</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">text</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">check_job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">repo_full_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job</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">    job_id   </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"id"</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">    job_name </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"name"</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">    run_id   </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"run_id"</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">    started  </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"started_at"</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)">""</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">    log_text </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> fetch_job_log</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">repo_full_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job_id</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)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> log_text</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)">return</span><span class="token plain"> </span><span class="token boolean">None</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">    found_versions </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">set</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">    context_lines  </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 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)">for</span><span class="token plain"> line </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> log_text</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">splitlines</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">        m </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> VERSION_PATTERN</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">search</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">line</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)">if</span><span class="token plain"> m</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">            ver </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> m</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">1</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)">if</span><span class="token plain"> ver </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> TARGET_VERSIONS</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">                found_versions</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">add</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">ver</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">                context_lines</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">line</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">strip</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" 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)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> found_versions</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)">return</span><span class="token plain"> </span><span class="token boolean">None</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)">return</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)">"repo"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">       repo_full_name</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)">"run_id"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">     run_id</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)">"job_id"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">     job_id</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)">"job_name"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">   job_name</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)">"started_at"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> started</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)">"versions"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">   </span><span class="token builtin" style="color:rgb(0, 112, 193)">sorted</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">found_versions</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 string" style="color:rgb(163, 21, 21)">"context"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">    context_lines</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 number" style="color:rgb(9, 134, 88)">10</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 string" style="color:rgb(163, 21, 21)">"job_url"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">    job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"html_url"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"https://github.com/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">repo_full_name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/actions/runs/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">run_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">main</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 keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> TOKEN</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 string" style="color:rgb(163, 21, 21)">"ERROR: Set GITHUB_TOKEN environment variable."</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">sys</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">stderr</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">        sys</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">exit</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">1</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"Time window : </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">WINDOW_START</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation">isoformat</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> -&gt; </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">WINDOW_END</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation">isoformat</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"Hunting for : litellm </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">', '</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation">join</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation builtin" style="color:rgb(0, 112, 193)">sorted</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation">TARGET_VERSIONS</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 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 string-interpolation string" style="color:rgb(163, 21, 21)">f"Fetching repositories for org '</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">ORG</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">'..."</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">    repos </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> get_repos</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Found </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation builtin" style="color:rgb(0, 112, 193)">len</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation">repos</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> repositories"</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 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">    jobs_to_check </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 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 string" style="color:rgb(163, 21, 21)">"Scanning workflow runs for time window..."</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)">for</span><span class="token plain"> repo </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> repos</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">        full_name </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> repo</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"full_name"</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)">try</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">            runs </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> get_runs_in_window</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">full_name</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)">except</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">HTTPError </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> e</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  WARN: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">full_name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> - </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">sys</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">stderr</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)">continue</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)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> runs</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)">continue</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">full_name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation builtin" style="color:rgb(0, 112, 193)">len</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation">runs</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> run(s) in window"</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)">for</span><span class="token plain"> run </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> runs</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)">try</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">                jobs </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> get_jobs_for_run</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">full_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> run</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"id"</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)">except</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">HTTPError </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> e</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"    WARN: run </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">run</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'id'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> - </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">sys</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">stderr</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)">continue</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"> job </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> jobs</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">                jobs_to_check</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</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">full_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job</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">    total </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">jobs_to_check</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"\nFetching logs for </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">total</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> job(s)..."</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 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">    hits </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 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)">with</span><span class="token plain"> ThreadPoolExecutor</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">max_workers</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">8</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)">as</span><span class="token plain"> pool</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">        futures </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">            pool</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">submit</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">check_job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> full_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job</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">full_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"id"</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)">for</span><span class="token plain"> full_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> jobs_to_check</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">        done </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0</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"> future </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> as_completed</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">futures</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">            done </span><span class="token operator" style="color:rgb(0, 0, 0)">+=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            full_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> jid </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> futures</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">future</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)">try</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">                result </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> future</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">result</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)">except</span><span class="token plain"> Exception </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> e</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  ERROR </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">full_name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> job </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">jid</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">sys</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">stderr</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)">continue</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)">if</span><span class="token plain"> result</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">                hits</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">result</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"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">                </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"  [</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">done</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">total</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">] </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">full_name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> job </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">jid</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">+</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-interpolation string" style="color:rgb(163, 21, 21)">f"  *** HIT: litellm </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">result</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'versions'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> ***"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> result </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">""</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">                flush</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token boolean">True</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 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 string" style="color:rgb(163, 21, 21)">"="</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 number" style="color:rgb(9, 134, 88)">72</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"RESULTS: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation builtin" style="color:rgb(0, 112, 193)">len</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation">hits</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> job(s) installed litellm </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">' or '</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation">join</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation builtin" style="color:rgb(0, 112, 193)">sorted</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation">TARGET_VERSIONS</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string" style="color:rgb(163, 21, 21)">"="</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 number" style="color:rgb(9, 134, 88)">72</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)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> hits</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 string" style="color:rgb(163, 21, 21)">"No matches found."</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)">return</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)">for</span><span class="token plain"> h </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">sorted</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">hits</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> key</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token keyword" style="color:rgb(0, 0, 255)">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"started_at"</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 keyword" style="color:rgb(0, 0, 255)">print</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Repo      : </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'repo'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Job       : </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'job_name'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> (#</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'job_id'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">)"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Run ID    : </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'run_id'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Started   : </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'started_at'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Versions  : litellm </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">', '</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation">join</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'versions'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  URL       : </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'job_url'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Log lines :"</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)">for</span><span class="token plain"> line </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> h</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"context"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"    </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">line</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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" 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)">if</span><span class="token plain"> __name__ </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)">"__main__"</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">    main</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div></div></div></details></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p>Scans all projects in a GitLab group (including subgroups) for CI/CD jobs that installed the compromised versions.</p><p><strong>Requirements:</strong> Python 3 and <code>requests</code> (<code>pip install requests</code>).</p><p><strong>Setup:</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">export GITLAB_TOKEN="your-gitlab-pat"</span><br></span></code></pre></div></div><p><strong>Run:</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">python find_litellm_jobs.py</span><br></span></code></pre></div></div><p>Set the <code>GROUP_NAME</code> variable in the script to your GitLab group name.</p><p>Both scripts default to scanning jobs from <strong>today</strong>. Adjust the <code>WINDOW_START</code> and <code>WINDOW_END</code> constants to cover <strong>March 24, 2026</strong> (the incident date) if running on a different day.</p><details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>View full script (find_litellm_jobs.py)</summary><div><div class="collapsibleContent_i85q"><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)">#!/usr/bin/env python3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">"""</span><br></span><span class="token-line" style="color:#000000"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">Scan all GitLab CI/CD jobs in a GitLab group that ran between</span><br></span><span class="token-line" style="color:#000000"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">0800-1244 UTC today and identify any that installed litellm 1.82.7 or 1.82.8.</span><br></span><span class="token-line" style="color:#000000"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span><br></span><span class="token-line" style="color:#000000"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">Adjust WINDOW_START / WINDOW_END to cover March 24, 2026 if running later.</span><br></span><span class="token-line" style="color:#000000"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">"""</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)">import</span><span class="token plain"> os</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)">import</span><span class="token plain"> re</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)">import</span><span class="token plain"> sys</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"> concurrent</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">futures </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> ThreadPoolExecutor</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> as_completed</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"> datetime </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> timezone</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)">import</span><span class="token plain"> requests</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">GITLAB_URL </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)">"https://gitlab.com"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">GROUP_NAME </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)">"YourGroup"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># &lt;-- set to your GitLab group name</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">TOKEN </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><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 plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"GITLAB_TOKEN"</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)">""</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">TODAY </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">now</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">timezone</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">utc</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">date</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">WINDOW_START </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">TODAY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">year</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> TODAY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">month</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> TODAY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">day</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)">8</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</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</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> tzinfo</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">timezone</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">utc</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">WINDOW_END   </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">TODAY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">year</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> TODAY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">month</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> TODAY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">day</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)">12</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)">44</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</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> tzinfo</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">timezone</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">utc</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">TARGET_VERSIONS </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 string" style="color:rgb(163, 21, 21)">"1.82.7"</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)">"1.82.8"</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">VERSION_PATTERN </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token builtin" style="color:rgb(0, 112, 193)">compile</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">r"litellm[=\-](\d+\.\d+\.\d+)"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> re</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">IGNORECASE</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">HEADERS </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 string" style="color:rgb(163, 21, 21)">"PRIVATE-TOKEN"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> TOKEN</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">SESSION </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">Session</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">SESSION</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">headers</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">update</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">HEADERS</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">get_paginated</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> params</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token boolean">None</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">    params </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">dict</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">params </span><span class="token keyword" style="color:rgb(0, 0, 255)">or</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 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">    params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">setdefault</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"per_page"</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 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">    page </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</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)">while</span><span class="token plain"> </span><span class="token boolean">True</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">        params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"page"</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"> page</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        resp </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> SESSION</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> params</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> timeout</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">30</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">        resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">raise_for_status</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">        data </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">json</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)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> data</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)">break</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)">yield</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> data</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)">if</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">data</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)">&lt;</span><span class="token plain"> params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"per_page"</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)">break</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        page </span><span class="token operator" style="color:rgb(0, 0, 0)">+=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">get_group_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">group_name</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">    resp </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> SESSION</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">GITLAB_URL</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/api/v4/groups/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">group_name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> timeout</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">30</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">    resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">raise_for_status</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)">return</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">json</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 string" style="color:rgb(163, 21, 21)">"id"</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">get_all_projects</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">group_id</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">    projects </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 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)">for</span><span class="token plain"> p </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> get_paginated</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-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">GITLAB_URL</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/api/v4/groups/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">group_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/projects"</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)">"include_subgroups"</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)">"true"</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)">"archived"</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)">"false"</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">        projects</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</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)">"id"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"id"</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 string" style="color:rgb(163, 21, 21)">"name"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> p</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"path_with_namespace"</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 keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> projects</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">parse_ts</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">ts_str</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)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> ts_str</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)">return</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    ts_str </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> ts_str</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"Z"</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)">"+00:00"</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)">return</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">fromisoformat</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">ts_str</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">jobs_in_window</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">project_id</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">    matching </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 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">    url </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">GITLAB_URL</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/api/v4/projects/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">project_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/jobs"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    params </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 string" style="color:rgb(163, 21, 21)">"per_page"</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 punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"scope[]"</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)">"success"</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)">"failed"</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)">"canceled"</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)">"running"</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">    page </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</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)">while</span><span class="token plain"> </span><span class="token boolean">True</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">        params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"page"</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"> page</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        resp </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> SESSION</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> params</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> timeout</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">30</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)">if</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">status_code </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">403</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)">return</span><span class="token plain"> matching</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">raise_for_status</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">        jobs </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">json</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)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> jobs</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)">break</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">        stop_early </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token boolean">False</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"> job </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> jobs</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">            ts </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> parse_ts</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"started_at"</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)">or</span><span class="token plain"> job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"created_at"</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)">if</span><span class="token plain"> ts </span><span class="token keyword" style="color:rgb(0, 0, 255)">is</span><span class="token plain"> </span><span class="token boolean">None</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)">continue</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)">if</span><span class="token plain"> ts </span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> WINDOW_END</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)">continue</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)">if</span><span class="token plain"> ts </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token plain"> WINDOW_START</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">                stop_early </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token boolean">True</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)">continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            matching</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">job</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)">if</span><span class="token plain"> stop_early </span><span class="token keyword" style="color:rgb(0, 0, 255)">or</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">jobs</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)">&lt;</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">100</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)">break</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        page </span><span class="token operator" style="color:rgb(0, 0, 0)">+=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</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)">return</span><span class="token plain"> matching</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">fetch_trace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">project_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job_id</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">    url </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">GITLAB_URL</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/api/v4/projects/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">project_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/jobs/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">job_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/trace"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    resp </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> SESSION</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> timeout</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">60</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)">if</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">status_code </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">403</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)">404</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)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">raise_for_status</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)">return</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">text</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">check_job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">project_name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> project_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job</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">    job_id   </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"id"</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">    job_name </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"name"</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">    ref      </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"ref"</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)">""</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">    started  </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"started_at"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"created_at"</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)">""</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">    trace </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> fetch_trace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">project_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job_id</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)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> trace</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)">return</span><span class="token plain"> </span><span class="token boolean">None</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">    found_versions </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">set</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)">for</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">match</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> VERSION_PATTERN</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">finditer</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">trace</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">        ver </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)">match</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">1</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)">if</span><span class="token plain"> ver </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> TARGET_VERSIONS</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">            found_versions</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">add</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">ver</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)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> found_versions</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)">return</span><span class="token plain"> </span><span class="token boolean">None</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">    context_lines </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 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)">for</span><span class="token plain"> line </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> trace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">splitlines</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 keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> VERSION_PATTERN</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">search</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">line</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">            ver_match </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> VERSION_PATTERN</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">search</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">line</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)">if</span><span class="token plain"> ver_match </span><span class="token keyword" style="color:rgb(0, 0, 255)">and</span><span class="token plain"> ver_match</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">group</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">1</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)">in</span><span class="token plain"> TARGET_VERSIONS</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">                context_lines</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">line</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">strip</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" 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)">return</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)">"project"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">    project_name</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)">"project_id"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> project_id</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)">"job_id"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">     job_id</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)">"job_name"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">   job_name</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)">"ref"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">        ref</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)">"started_at"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> started</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)">"versions"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">   </span><span class="token builtin" style="color:rgb(0, 112, 193)">sorted</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">found_versions</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 string" style="color:rgb(163, 21, 21)">"context"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">    context_lines</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 number" style="color:rgb(9, 134, 88)">10</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 string" style="color:rgb(163, 21, 21)">"job_url"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain">    </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">GITLAB_URL</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">project_name</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/-/jobs/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">job_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">main</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 keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> TOKEN</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 string" style="color:rgb(163, 21, 21)">"ERROR: Set GITLAB_TOKEN environment variable."</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">sys</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">stderr</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">        sys</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">exit</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">1</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"Time window : </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">WINDOW_START</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation">isoformat</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> -&gt; </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">WINDOW_END</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation">isoformat</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"Hunting for : litellm </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">', '</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation">join</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation builtin" style="color:rgb(0, 112, 193)">sorted</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation">TARGET_VERSIONS</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 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 string-interpolation string" style="color:rgb(163, 21, 21)">f"Resolving group '</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">GROUP_NAME</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">'..."</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">    group_id </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> get_group_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">GROUP_NAME</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 string" style="color:rgb(163, 21, 21)">"Fetching projects..."</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">    projects </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> get_all_projects</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">group_id</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Found </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation builtin" style="color:rgb(0, 112, 193)">len</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation">projects</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> projects"</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 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">    all_jobs_to_check </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 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 string" style="color:rgb(163, 21, 21)">"Scanning job listings for time window..."</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)">for</span><span class="token plain"> proj </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> projects</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)">try</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">            jobs </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> jobs_in_window</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">proj</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"id"</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)">except</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">HTTPError </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> e</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  WARN: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">proj</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'name'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> - </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">sys</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">stderr</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)">continue</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)">if</span><span class="token plain"> jobs</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">proj</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'name'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation builtin" style="color:rgb(0, 112, 193)">len</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation">jobs</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> job(s) in window"</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)">for</span><span class="token plain"> j </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> jobs</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">            all_jobs_to_check</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</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">proj</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"name"</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"> proj</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"id"</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"> j</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">    total </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">all_jobs_to_check</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"\nFetching traces for </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">total</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> job(s)..."</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 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">    hits </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 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)">with</span><span class="token plain"> ThreadPoolExecutor</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">max_workers</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</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)">as</span><span class="token plain"> pool</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">        futures </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">            pool</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">submit</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">check_job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> pname</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> pid</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job</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">pname</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"id"</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)">for</span><span class="token plain"> pname</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> pid</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> job </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> all_jobs_to_check</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">        done </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0</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"> future </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> as_completed</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">futures</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">            done </span><span class="token operator" style="color:rgb(0, 0, 0)">+=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            pname</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> jid </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> futures</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">future</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)">try</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">                result </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> future</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">result</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)">except</span><span class="token plain"> Exception </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> e</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  ERROR checking </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">pname</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> job </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">jid</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">e</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">sys</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">stderr</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)">continue</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)">if</span><span class="token plain"> result</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">                hits</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">result</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  [</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">done</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">/</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">total</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">] checked </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">pname</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> job </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">jid</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">+</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-interpolation string" style="color:rgb(163, 21, 21)">f"  *** HIT: litellm </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">result</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'versions'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> ***"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> result </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">""</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">                  flush</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token boolean">True</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 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 string" style="color:rgb(163, 21, 21)">"="</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 number" style="color:rgb(9, 134, 88)">72</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"RESULTS: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation builtin" style="color:rgb(0, 112, 193)">len</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation">hits</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> job(s) installed litellm </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">' or '</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation">join</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation builtin" style="color:rgb(0, 112, 193)">sorted</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation">TARGET_VERSIONS</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string" style="color:rgb(163, 21, 21)">"="</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 number" style="color:rgb(9, 134, 88)">72</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)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> hits</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 string" style="color:rgb(163, 21, 21)">"No matches found."</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)">return</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)">for</span><span class="token plain"> h </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">sorted</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">hits</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> key</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token keyword" style="color:rgb(0, 0, 255)">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> x</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"started_at"</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 keyword" style="color:rgb(0, 0, 255)">print</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Project   : </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'project'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Job       : </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'job_name'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)"> (#</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'job_id'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">)"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Branch/tag: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'ref'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Started   : </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'started_at'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Versions  : litellm </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">', '</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation">join</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'versions'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  URL       : </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">h</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(163, 21, 21)">'job_url'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"  Log lines :"</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)">for</span><span class="token plain"> line </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> h</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"context"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"    </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">line</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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" 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)">if</span><span class="token plain"> __name__ </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)">"__main__"</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">    main</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div></div></div></details></div></div></div>
<p><em>CI/CD scripts contributed by the community (<a href="https://gist.github.com/fryz/93ec8d4898ffe5b5ac5706a208823ef3" target="_blank" rel="noopener noreferrer">original gist</a>). Review before running.</em></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="indicators-of-compromise-iocs">Indicators of compromise (IoCs)<a href="https://docs.litellm.ai/blog/security-update-march-2026#indicators-of-compromise-iocs" class="hash-link" aria-label="Direct link to Indicators of compromise (IoCs)" title="Direct link to Indicators of compromise (IoCs)">​</a></h2>
<p>Review affected systems for the following indicators:</p>
<ul>
<li><code>litellm_init.pth</code> present in your <code>site-packages</code></li>
<li>Outbound traffic or requests to <code>models.litellm[.]cloud</code>
This domain is <strong>not</strong> affiliated with LiteLLM</li>
<li>Outbound traffic or requests to <code>checkmarx[.]zone</code>
This domain is <strong>not</strong> affiliated with LiteLLM</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="immediate-actions-for-affected-users">Immediate actions for affected users<a href="https://docs.litellm.ai/blog/security-update-march-2026#immediate-actions-for-affected-users" class="hash-link" aria-label="Direct link to Immediate actions for affected users" title="Direct link to Immediate actions for affected users">​</a></h2>
<p>If you installed or ran <strong>v1.82.7</strong> or <strong>v1.82.8</strong>, take the following actions immediately.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-rotate-all-secrets">1. Rotate all secrets<a href="https://docs.litellm.ai/blog/security-update-march-2026#1-rotate-all-secrets" class="hash-link" aria-label="Direct link to 1. Rotate all secrets" title="Direct link to 1. Rotate all secrets">​</a></h3>
<p>Treat any credentials present on the affected systems as compromised, including:</p>
<ul>
<li>API keys</li>
<li>Cloud access keys</li>
<li>Database passwords</li>
<li>SSH keys</li>
<li>Kubernetes tokens</li>
<li>Any secrets stored in environment variables or configuration files</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-inspect-your-filesystem">2. Inspect your filesystem<a href="https://docs.litellm.ai/blog/security-update-march-2026#2-inspect-your-filesystem" class="hash-link" aria-label="Direct link to 2. Inspect your filesystem" title="Direct link to 2. Inspect your filesystem">​</a></h3>
<p>Check your <code>site-packages</code> directory for a file named <code>litellm_init.pth</code>:</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">find /usr/lib/python3.13/site-packages/ -name "litellm_init.pth"</span><br></span></code></pre></div></div>
<p>If present:</p>
<ul>
<li>remove it immediately</li>
<li>investigate the host for further compromise</li>
<li>preserve relevant artifacts if your security team is performing forensics</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-audit-version-history">3. Audit version history<a href="https://docs.litellm.ai/blog/security-update-march-2026#3-audit-version-history" class="hash-link" aria-label="Direct link to 3. Audit version history" title="Direct link to 3. Audit version history">​</a></h3>
<p>Review your:</p>
<ul>
<li>Local environments</li>
<li>CI/CD pipelines</li>
<li>Docker builds</li>
<li>Deployment logs</li>
</ul>
<p>Confirm whether <strong>v1.82.7</strong> or <strong>v1.82.8</strong> was installed anywhere.</p>
<p>Pin LiteLLM to a known safe version such as <strong>v1.82.6 or earlier</strong>, or to a later verified release once announced.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="response-and-remediation">Response and remediation<a href="https://docs.litellm.ai/blog/security-update-march-2026#response-and-remediation" class="hash-link" aria-label="Direct link to Response and remediation" title="Direct link to Response and remediation">​</a></h2>
<p>The LiteLLM AI Gateway team has already taken the following steps:</p>
<ul>
<li>Removed compromised packages from PyPI</li>
<li>Rotated maintainer credentials and established new authorized maintainers</li>
<li>Engaged Google's Mandiant security team to assist with forensic analysis of the build and publishing chain</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="verify-docker-image-signatures">Verify Docker image signatures<a href="https://docs.litellm.ai/blog/security-update-march-2026#verify-docker-image-signatures" class="hash-link" aria-label="Direct link to Verify Docker image signatures" title="Direct link to Verify Docker image signatures">​</a></h2>
<p>Starting from <code>v1.83.0-nightly</code>, all LiteLLM Docker images published to GHCR are signed with <a href="https://docs.sigstore.dev/cosign/overview/" target="_blank" rel="noopener noreferrer">cosign</a>. Every release is signed with the same key introduced in <a href="https://github.com/BerriAI/litellm/commit/0112e53046018d726492c814b3644b7d376029d0" target="_blank" rel="noopener noreferrer">commit <code>0112e53</code></a>.</p>
<p><strong>Verify using the pinned commit hash (recommended):</strong></p>
<p>A commit hash is cryptographically immutable, so this is the strongest way to ensure you are using the original signing key:</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">cosign verify \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --key https://raw.githubusercontent.com/BerriAI/litellm/0112e53046018d726492c814b3644b7d376029d0/cosign.pub \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:&lt;release-tag&gt;</span><br></span></code></pre></div></div>
<p><strong>Verify using a release tag (convenience):</strong></p>
<p>Tags are protected in this repository and resolve to the same key. This option is easier to read but relies on tag protection rules:</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">cosign verify \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  --key https://raw.githubusercontent.com/BerriAI/litellm/&lt;release-tag&gt;/cosign.pub \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  ghcr.io/berriai/litellm:&lt;release-tag&gt;</span><br></span></code></pre></div></div>
<p>Replace <code>&lt;release-tag&gt;</code> with the version you are deploying (e.g. <code>v1.83.0-stable</code>).</p>
<p>Expected output:</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">The following checks were performed on each of these signatures:</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  - The cosign claims were validated</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  - The signatures were verified against the specified public key</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="verified-safe-versions">Verified safe versions<a href="https://docs.litellm.ai/blog/security-update-march-2026#verified-safe-versions" class="hash-link" aria-label="Direct link to Verified safe versions" title="Direct link to Verified safe versions">​</a></h2>
<p>We have audited every LiteLLM release published between v1.78.0 and v1.82.6 across both PyPI and Docker. Each artifact was verified by:</p>
<ol>
<li>Downloading the published artifact and computing its SHA-256 digest</li>
<li>Scanning for the known <a href="https://docs.litellm.ai/blog/security-update-march-2026#indicators-of-compromise-iocs">indicators of compromise</a> (IOCs)</li>
<li>Comparing the artifact contents against the corresponding Git commit in the BerriAI/litellm repository</li>
</ol>
<p><strong>All versions listed below are confirmed clean.</strong></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">PyPI Releases</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Docker Images</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="wrapper_m_RL"><table class="table_Scuz"><thead><tr><th>Version</th><th>SHA-256</th><th>Clean of IOCs</th><th>Matches Git</th><th>Git Commit</th><th>Status</th></tr></thead><tbody><tr><td class="version_VYUd">1.82.6</td><td><span class="sha_v9TV"><code>164a3ef3e19f309e<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/38d477507dad" target="_blank" rel="noopener noreferrer">38d477507dad</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.82.5</td><td><span class="sha_v9TV"><code>e1012ab816352215<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/1998c4f3703f" target="_blank" rel="noopener noreferrer">1998c4f3703f</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.82.4</td><td><span class="sha_v9TV"><code>d37c34a847e7952a<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/cfeafbe38811" target="_blank" rel="noopener noreferrer">cfeafbe38811</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.82.3</td><td><span class="sha_v9TV"><code>609901f6c5a5cf8c<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/61409275c8d8" target="_blank" rel="noopener noreferrer">61409275c8d8</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.82.2</td><td><span class="sha_v9TV"><code>641ed024774fa3d5<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/f351bbdb3683" target="_blank" rel="noopener noreferrer">f351bbdb3683</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.82.1</td><td><span class="sha_v9TV"><code>a9ec3fe42eccb161<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/94b002066e3a" target="_blank" rel="noopener noreferrer">94b002066e3a</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.82.0</td><td><span class="sha_v9TV"><code>5496b5d4532cccdc<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/6c6585af568e" target="_blank" rel="noopener noreferrer">6c6585af568e</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.16</td><td><span class="sha_v9TV"><code>d6bcc13acbd26719<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/678200ee4887" target="_blank" rel="noopener noreferrer">678200ee4887</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.15</td><td><span class="sha_v9TV"><code>2fa253658702509c<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/2e819656cee9" target="_blank" rel="noopener noreferrer">2e819656cee9</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.14</td><td><span class="sha_v9TV"><code>6394e61bbdef7121<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/96bcee0b0af7" target="_blank" rel="noopener noreferrer">96bcee0b0af7</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.13</td><td><span class="sha_v9TV"><code>ae4aea2a55e85993<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/cc957a19a560" target="_blank" rel="noopener noreferrer">cc957a19a560</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.12</td><td><span class="sha_v9TV"><code>219cf9729e5ea30c<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/ba0d541b1982" target="_blank" rel="noopener noreferrer">ba0d541b1982</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.11</td><td><span class="sha_v9TV"><code>06a66c24742e082d<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/231aedeeff7e" target="_blank" rel="noopener noreferrer">231aedeeff7e</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.10</td><td><span class="sha_v9TV"><code>9efa1cbe61ac051f<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/7488abece8e7" target="_blank" rel="noopener noreferrer">7488abece8e7</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.9</td><td><span class="sha_v9TV"><code>24ee273bc8a62299<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/a09d3e9162eb" target="_blank" rel="noopener noreferrer">a09d3e9162eb</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.8</td><td><span class="sha_v9TV"><code>78cca92f36bc6c26<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/4fea649f519b" target="_blank" rel="noopener noreferrer">4fea649f519b</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.7</td><td><span class="sha_v9TV"><code>58466c88c3289c6a<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/3f6a281d0f7a" target="_blank" rel="noopener noreferrer">3f6a281d0f7a</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.6</td><td><span class="sha_v9TV"><code>573206ba194d49a1<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/8da3a93e6e63" target="_blank" rel="noopener noreferrer">8da3a93e6e63</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.5</td><td><span class="sha_v9TV"><code>206505c5a0c6503e<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/2cc3778761d4" target="_blank" rel="noopener noreferrer">2cc3778761d4</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.3</td><td><span class="sha_v9TV"><code>3f60fd8b72758795<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/f30742fe6e8e" target="_blank" rel="noopener noreferrer">f30742fe6e8e</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr></tbody></table></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="wrapper_m_RL"><table class="table_Scuz"><thead><tr><th>Version</th><th>SHA-256</th><th>Clean of IOCs</th><th>Matches Git</th><th>Git Commit</th><th>Status</th></tr></thead><tbody><tr><td class="version_VYUd">1.82.3</td><td><span class="sha_v9TV"><code>0a571da849db5f9c<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/61409275c8d8" target="_blank" rel="noopener noreferrer">61409275c8d8</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.82.3-stable</td><td><span class="sha_v9TV"><code>0c2b2a0ad3e50af1<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/61409275c8d8" target="_blank" rel="noopener noreferrer">61409275c8d8</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.82.0-stable</td><td><span class="sha_v9TV"><code>71bf7283767ca436<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/97947c254252" target="_blank" rel="noopener noreferrer">97947c254252</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.15</td><td><span class="sha_v9TV"><code>303c31af87e7915e<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/20bf3aa8070a" target="_blank" rel="noopener noreferrer">20bf3aa8070a</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.14-stable</td><td><span class="sha_v9TV"><code>a34f975804823181<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/0435375b1271" target="_blank" rel="noopener noreferrer">0435375b1271</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.13</td><td><span class="sha_v9TV"><code>a876f3f22f9b6fd4<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/cc957a19a560" target="_blank" rel="noopener noreferrer">cc957a19a560</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.12-stable</td><td><span class="sha_v9TV"><code>e24022878ccc87f5<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/ba0d541b1982" target="_blank" rel="noopener noreferrer">ba0d541b1982</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.9-stable</td><td><span class="sha_v9TV"><code>262e53d7702ed825<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/a09d3e9162eb" target="_blank" rel="noopener noreferrer">a09d3e9162eb</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.3-stable</td><td><span class="sha_v9TV"><code>dff82ccc32fb6489<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/61ed8f9e0355" target="_blank" rel="noopener noreferrer">61ed8f9e0355</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.81.0-stable</td><td><span class="sha_v9TV"><code>f4913297d1bb3dc3<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/790a5ce0b323" target="_blank" rel="noopener noreferrer">790a5ce0b323</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.80.15-stable</td><td><span class="sha_v9TV"><code>0b4ec3861e978b4a<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/17c8d8d109b5" target="_blank" rel="noopener noreferrer">17c8d8d109b5</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.80.11-stable</td><td><span class="sha_v9TV"><code>4068108d9101cd2a<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/57e07bddd341" target="_blank" rel="noopener noreferrer">57e07bddd341</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.80.8-stable</td><td><span class="sha_v9TV"><code>0304c2eb1f3cf542<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/3381d63152f8" target="_blank" rel="noopener noreferrer">3381d63152f8</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.80.5-stable</td><td><span class="sha_v9TV"><code>a89e173135fff96a<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/6c49b95a4ab7" target="_blank" rel="noopener noreferrer">6c49b95a4ab7</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.80.0-stable</td><td><span class="sha_v9TV"><code>a3416f4cd0c896c9<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/98365205acd0" target="_blank" rel="noopener noreferrer">98365205acd0</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.79.3-stable</td><td><span class="sha_v9TV"><code>27aae83d6ab6cb0b<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/c0548542d4a9" target="_blank" rel="noopener noreferrer">c0548542d4a9</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.79.1-stable</td><td><span class="sha_v9TV"><code>7780d29a9543c4ce<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/c217bddb59ba" target="_blank" rel="noopener noreferrer">c217bddb59ba</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.79.0-stable</td><td><span class="sha_v9TV"><code>32bf6ac059a56641<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/8d495f56a9cc" target="_blank" rel="noopener noreferrer">8d495f56a9cc</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.78.5-stable</td><td><span class="sha_v9TV"><code>d5e607648eafa15e<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/c471bf1f16c2" target="_blank" rel="noopener noreferrer">c471bf1f16c2</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr><tr><td class="version_VYUd">1.78.0-stable</td><td><span class="sha_v9TV"><code>7a56b32dc7153763<!-- -->…</code><button class="copyBtn_nvJS" title="Copy full SHA-256">⧉</button></span></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td><td><span class="badgeYes_wtLG badge_UE5d">✔ YES</span></td><td><a class="commitLink_JhJ4" href="https://github.com/BerriAI/litellm/commit/5fde83d9f154" target="_blank" rel="noopener noreferrer">5fde83d9f154</a></td><td><span class="badgeClean_n91o badge_UE5d">✔ CLEAN</span></td></tr></tbody></table></div></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="questions-and-support">Questions and support<a href="https://docs.litellm.ai/blog/security-update-march-2026#questions-and-support" class="hash-link" aria-label="Direct link to Questions and support" title="Direct link to Questions and support">​</a></h2>
<p>If you believe your systems may be affected, contact us immediately:</p>
<ul>
<li><strong>Security:</strong> <code>security@berri.ai</code></li>
<li><strong>Support:</strong> <code>support@berri.ai</code></li>
<li><strong>Slack:</strong> Reach out to the LiteLLM team directly</li>
</ul>
<p>For real-time updates, follow <a href="https://x.com/LiteLLM" target="_blank" rel="noopener noreferrer">LiteLLM (YC W23) on X</a>.</p>]]></content:encoded>
            <category>security</category>
            <category>incident-report</category>
        </item>
        <item>
            <title><![CDATA[Incident Report: Guardrail logging exposed secret headers in spend logs and traces]]></title>
            <link>https://docs.litellm.ai/blog/guardrail-logging-secret-exposure-incident</link>
            <guid>https://docs.litellm.ai/blog/guardrail-logging-secret-exposure-incident</guid>
            <pubDate>Wed, 18 Mar 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Date: March 18, 2026]]></description>
            <content:encoded><![CDATA[<p><strong>Date:</strong> March 18, 2026
<strong>Duration:</strong> Unknown
<strong>Severity:</strong> High
<strong>Status:</strong> Resolved</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="https://docs.litellm.ai/blog/guardrail-logging-secret-exposure-incident#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
<p>When a custom guardrail returned the full LiteLLM request/data dictionary, the guardrail response logged by LiteLLM could include <code>secret_fields.raw_headers</code>, including plaintext <code>Authorization</code> headers containing API keys or other credentials.</p>
<p>This information could then propagate to logging and observability surfaces that consume guardrail metadata, including:</p>
<ul>
<li><strong>Spend logs in the LiteLLM UI:</strong> visible to admins with access to spend-log data</li>
<li><strong>OpenTelemetry traces:</strong> visible to anyone with access to the relevant telemetry backend</li>
</ul>
<p>LLM calls, proxy routing, and provider execution were not blocked by this bug. The impact was exposure of sensitive request headers in observability and logging paths.</p>
<!-- -->
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="background">Background<a href="https://docs.litellm.ai/blog/guardrail-logging-secret-exposure-incident#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2>
<p>LiteLLM keeps internal request data (including request headers) for use during the call. That data is not meant to be written to logs or telemetry.</p>
<p>When custom guardrails run, their outcomes are logged so they can appear in spend logs, OpenTelemetry traces, and other observability backends. If a guardrail returned the full request payload instead of a minimal result, that internal request data could be included in what was logged. Before the fix, the guardrail logging path did not strip that data before sending it to those systems.</p>
<!-- -->
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="root-cause">Root Cause<a href="https://docs.litellm.ai/blog/guardrail-logging-secret-exposure-incident#root-cause" class="hash-link" aria-label="Direct link to Root Cause" title="Direct link to Root Cause">​</a></h2>
<p>The root cause was incomplete sanitization in the guardrail logging path. When building the payload that gets sent to spend logs and traces, LiteLLM prepared guardrail responses for logging but did not strip internal request data (such as headers) from them. If a guardrail returned a response that included that data, it was passed through to the logging and observability systems unchanged.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="impact">Impact<a href="https://docs.litellm.ai/blog/guardrail-logging-secret-exposure-incident#impact" class="hash-link" aria-label="Direct link to Impact" title="Direct link to Impact">​</a></h2>
<p>This issue required all of the following:</p>
<ol>
<li>A custom guardrail returned the full LiteLLM request/data dictionary, or another response object containing <code>secret_fields</code>.</li>
<li>LiteLLM logged that guardrail response through the standard guardrail logging path.</li>
<li>An operator, admin, or telemetry consumer had access to the resulting logs or traces.</li>
</ol>
<p>When those conditions were met, sensitive values could become visible through:</p>
<ul>
<li><strong>Spend logs / UI responses:</strong> guardrail metadata could be included in spend-log payloads rendered in the admin UI.</li>
<li><strong>OpenTelemetry traces:</strong> <code>guardrail_response</code> could be written as a span attribute on guardrail spans.</li>
<li><strong>Other downstream observability backends:</strong> any integration consuming the same guardrail metadata could receive the leaked values.</li>
</ul>
<p>This was a logging and telemetry exposure bug. It did not let callers bypass auth, access other tenants directly, or change model behavior, but it could expose plaintext credentials to people with access to those observability systems.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="guidance-for-users">Guidance For Users<a href="https://docs.litellm.ai/blog/guardrail-logging-secret-exposure-incident#guidance-for-users" class="hash-link" aria-label="Direct link to Guidance For Users" title="Direct link to Guidance For Users">​</a></h2>
<ul>
<li>Upgrade to LiteLLM 1.82.3+.</li>
<li>If you operated custom guardrails that return the full request/data dict, review whether spend logs or telemetry traces were retained during the affected period.</li>
<li>Rotate any credentials that may have appeared in <code>Authorization</code> or other forwarded request headers in those systems.</li>
<li>Apply least-privilege access controls to spend-log views and telemetry backends that may contain request-derived metadata.</li>
</ul>]]></content:encoded>
            <category>incident-report</category>
            <category>security</category>
            <category>guardrails</category>
        </item>
        <item>
            <title><![CDATA[Day 0 Support: GPT-5.4-mini and GPT-5.4-nano]]></title>
            <link>https://docs.litellm.ai/blog/gpt_5_4_mini_nano</link>
            <guid>https://docs.litellm.ai/blog/gpt_5_4_mini_nano</guid>
            <pubDate>Tue, 17 Mar 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[GPT-5.4-mini and GPT-5.4-nano model support in LiteLLM]]></description>
            <content:encoded><![CDATA[<p>LiteLLM now supports GPT-5.4-mini and GPT-5.4-nano — cost-effective models for simple completions and high-throughput workloads.</p>
<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>If you're on <strong>v1.82.3-stable</strong> or above, you don't need any update to use these models.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="usage">Usage<a href="https://docs.litellm.ai/blog/gpt_5_4_mini_nano#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 SDK</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.4</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"> openai/gpt</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">5.4</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">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.4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">nano</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.4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">nano</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">litellm --config /path/to/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"># GPT-5.4-mini</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">curl -X POST "http://localhost:4000/v1/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.4-mini",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "messages": [{"role": "user", "content": "What is the capital of France?"}]</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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"># GPT-5.4-nano</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">curl -X POST "http://localhost:4000/v1/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.4-nano",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "messages": [{"role": "user", "content": "What is 2 + 2?"}]</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"></span><span class="token comment" style="color:rgb(0, 128, 0)"># GPT-5.4-mini</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.4-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)">"What is the capital of France?"</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 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><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)"># GPT-5.4-nano</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.4-nano"</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)">"What is 2 + 2?"</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 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>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notes">Notes<a href="https://docs.litellm.ai/blog/gpt_5_4_mini_nano#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes">​</a></h2>
<ul>
<li>Both models support function calling, vision, and tool-use — see the <a href="https://docs.litellm.ai/docs/providers/openai">OpenAI provider docs</a> for advanced usage.</li>
<li>GPT-5.4-nano is the most cost-effective option for simple tasks; GPT-5.4-mini offers a balance of speed and capability.</li>
</ul>]]></content:encoded>
            <category>openai</category>
            <category>gpt-5.4-mini</category>
            <category>gpt-5.4-nano</category>
            <category>completion</category>
        </item>
        <item>
            <title><![CDATA[New Video Characters, Edit and Extension API support]]></title>
            <link>https://docs.litellm.ai/blog/video_characters_api</link>
            <guid>https://docs.litellm.ai/blog/video_characters_api</guid>
            <pubDate>Mon, 16 Mar 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[LiteLLM now supports creating, retrieving, and managing reusable video characters across multiple video generations.]]></description>
            <content:encoded><![CDATA[<p>LiteLLM now supoports videos character, edit and extension apis.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-new">What's New<a href="https://docs.litellm.ai/blog/video_characters_api#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New">​</a></h2>
<p>Four new endpoints for video character operations:</p>
<ul>
<li><strong>Create character</strong> - Upload a video to create a reusable asset</li>
<li><strong>Get character</strong> - Retrieve character metadata</li>
<li><strong>Edit video</strong> - Modify generated videos</li>
<li><strong>Extend video</strong> - Continue clips with character consistency</li>
</ul>
<p><strong>Available from:</strong> LiteLLM v1.83.0+</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="quick-example">Quick Example<a href="https://docs.litellm.ai/blog/video_characters_api#quick-example" class="hash-link" aria-label="Direct link to Quick Example" title="Direct link to Quick Example">​</a></h2>
<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"> litellm</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)"># Create character from video</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">character </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">avideo_create_character</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">    name</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"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">    video</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token builtin" style="color:rgb(0, 112, 193)">open</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"luna.mp4"</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)">"rb"</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">    custom_llm_provider</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"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">    model</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"sora-2"</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 string-interpolation string" style="color:rgb(163, 21, 21)">f"Character: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">character</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token string-interpolation interpolation builtin" style="color:rgb(0, 112, 193)">id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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)"># Use in generation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">video </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">avideo</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)">"sora-2"</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 string" style="color:rgb(163, 21, 21)">"Luna dances through a magical forest."</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">    characters</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)">"id"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> character</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token builtin" style="color:rgb(0, 112, 193)">id</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">    seconds</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"8"</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)"># Get character info</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">fetched </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">avideo_get_character</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">    character_id</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">character</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token builtin" style="color:rgb(0, 112, 193)">id</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">    custom_llm_provider</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"openai"</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)"># Edit with character preserved</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">edited </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">avideo_edit</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">    video_id</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">video</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token builtin" style="color:rgb(0, 112, 193)">id</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 string" style="color:rgb(163, 21, 21)">"Add warm golden lighting"</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)"># Extend sequence</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">extended </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">avideo_extension</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">    video_id</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">video</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token builtin" style="color:rgb(0, 112, 193)">id</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 string" style="color:rgb(163, 21, 21)">"Luna waves goodbye"</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">    seconds</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"5"</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>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="via-proxy">Via Proxy<a href="https://docs.litellm.ai/blog/video_characters_api#via-proxy" class="hash-link" aria-label="Direct link to Via Proxy" title="Direct link to Via Proxy">​</a></h2>
<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"># Create character</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">curl -X POST "http://localhost:4000/v1/videos/characters" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -H "Authorization: Bearer sk-litellm-key" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -F "video=@luna.mp4" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -F "name=Luna"</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"># Get character</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">curl -X GET "http://localhost:4000/v1/videos/characters/char_abc123def456" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -H "Authorization: Bearer sk-litellm-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"># Edit video</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">curl -X POST "http://localhost:4000/v1/videos/edits" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -H "Authorization: Bearer sk-litellm-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">    "video": {"id": "video_xyz789"},</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "prompt": "Add warm golden lighting and enhance colors"</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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain"># Extend video</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">curl -X POST "http://localhost:4000/v1/videos/extensions" \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  -H "Authorization: Bearer sk-litellm-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">    "video": {"id": "video_xyz789"},</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "prompt": "Luna waves goodbye and walks into the sunset",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "seconds": "5"</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="managed-character-ids">Managed Character IDs<a href="https://docs.litellm.ai/blog/video_characters_api#managed-character-ids" class="hash-link" aria-label="Direct link to Managed Character IDs" title="Direct link to Managed Character IDs">​</a></h2>
<p>LiteLLM automatically encodes provider and model metadata into character IDs:</p>
<p><strong>What happens:</strong></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">Upload character "Luna" with model "sora-2" on OpenAI</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">LiteLLM creates: char_abc123def456 (contains provider + model_id)</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">When you reference it later, LiteLLM decodes automatically</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">Router knows exactly which deployment to use</span><br></span></code></pre></div></div>
<p><strong>Behind the scenes:</strong></p>
<ul>
<li>Character ID format: <code>character_&lt;base64_encoded_metadata&gt;</code></li>
<li>Metadata includes: provider, model_id, original_character_id</li>
<li>Transparent to you - just use the ID, LiteLLM handles routing</li>
</ul>]]></content:encoded>
            <category>videos</category>
            <category>characters</category>
            <category>proxy</category>
            <category>routing</category>
        </item>
        <item>
            <title><![CDATA[Realtime WebRTC HTTP Endpoints]]></title>
            <link>https://docs.litellm.ai/blog/realtime_webrtc_http_endpoints</link>
            <guid>https://docs.litellm.ai/blog/realtime_webrtc_http_endpoints</guid>
            <pubDate>Thu, 12 Mar 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Use the LiteLLM proxy to route OpenAI-style WebRTC realtime via HTTP: client_secrets and SDP exchange.]]></description>
            <content:encoded><![CDATA[<p>Connect to the Realtime API via WebRTC from browser/mobile clients. LiteLLM handles auth and key management.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-it-works">How it works<a href="https://docs.litellm.ai/blog/realtime_webrtc_http_endpoints#how-it-works" class="hash-link" aria-label="Direct link to How it works" title="Direct link to How it works">​</a></h2>
<p><img decoding="async" loading="lazy" alt="WebRTC flow: Browser, LiteLLM Proxy, and OpenAI/Azure" src="https://docs.litellm.ai/assets/images/webrtc_flow-fec21e7e5ee4dd2fefecd921464dac8d.png" width="1024" height="404" class="img_ev3q"></p>
<p><strong>Flow of generating ephemeral token</strong></p>
<p><img decoding="async" loading="lazy" alt="Ephemeral token flow: Browser requests token, LiteLLM gets real token from OpenAI, returns encrypted token" src="https://docs.litellm.ai/assets/images/ephemeral_token-4944942cb47e00195c87b88d8cda4650.png" width="1600" height="591" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="proxy-setup">Proxy Setup<a href="https://docs.litellm.ai/blog/realtime_webrtc_http_endpoints#proxy-setup" class="hash-link" aria-label="Direct link to Proxy Setup" title="Direct link to Proxy Setup">​</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"> 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">realtime</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">4o</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">realtime</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">preview</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token datetime number" style="color:rgb(9, 134, 88)">2024-12-17</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">    </span><span class="token key atrule">model_info</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">mode</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> realtime</span><br></span></code></pre></div></div>
<p><strong>Azure:</strong> use <code>model: azure/gpt-4o-realtime-preview</code>, <code>api_key</code>, <code>api_base</code>.</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">litellm --config /path/to/config.yaml</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="try-it-live">Try it live<a href="https://docs.litellm.ai/blog/realtime_webrtc_http_endpoints#try-it-live" class="hash-link" aria-label="Direct link to Try it live" title="Direct link to Try it live">​</a></h2>
<style>
.wrt-wrap {
  font-family: &#x27;JetBrains Mono&#x27;, &#x27;Fira Code&#x27;, monospace;
  background: #0d0d14;
  border: 1px solid #1e1e2e;
  border-radius: 10px;
  overflow: hidden;
  margin: 24px 0;
}

.wrt-toggle {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 20px;
  cursor: pointer;
  user-select: none;
  background: #0d0d14;
  transition: background 0.15s;
}
.wrt-toggle:hover { background: #111120; }

.wrt-toggle-left { display: flex; align-items: center; gap: 10px; }

.wrt-live-dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: #00ff88;
  box-shadow: 0 0 8px #00ff88;
  animation: wrt-blink 2s infinite;
}
@keyframes wrt-blink { 0%,100%{opacity:1} 50%{opacity:0.4} }

.wrt-toggle-title { font-size: 12px; font-weight: 600; color: #e2e8f0; letter-spacing: 0.06em; }
.wrt-toggle-sub { font-size: 10px; color: #4a5568; margin-top: 1px; }
.wrt-chevron { font-size: 11px; color: #4a5568; transition: transform 0.2s; }
.wrt-chevron.open { transform: rotate(180deg); }

.wrt-body {
  border-top: 1px solid #1e1e2e;
  display: grid;
  grid-template-columns: 280px 1fr;
  height: 460px;
}

.wrt-sidebar {
  border-right: 1px solid #1e1e2e;
  padding: 14px;
  display: flex;
  flex-direction: column;
  gap: 12px;
  overflow-y: auto;
}

.wrt-label {
  font-size: 9px;
  letter-spacing: 0.15em;
  color: #4a5568;
  text-transform: uppercase;
  margin-bottom: 5px;
}

.wrt-field { display: flex; flex-direction: column; gap: 4px; margin-bottom: 6px; }
.wrt-field label { font-size: 10px; color: #4a5568; }
.wrt-field input {
  background: #0a0a0f;
  border: 1px solid #1e1e2e;
  border-radius: 5px;
  color: #e2e8f0;
  font-family: inherit;
  font-size: 11px;
  padding: 7px 9px;
  outline: none;
  width: 100%;
  transition: border-color 0.2s;
}
.wrt-field input:focus { border-color: #7c3aed; }

.wrt-divider { height: 1px; background: #1e1e2e; }

.wrt-btn {
  display: flex; align-items: center; justify-content: center;
  border: none; border-radius: 5px; cursor: pointer;
  font-family: inherit; font-size: 11px; font-weight: 600;
  padding: 8px; width: 100%;
  transition: all 0.15s; letter-spacing: 0.04em;
}
.wrt-btn + .wrt-btn { margin-top: 5px; }
.wrt-btn-primary { background: #00ff88; color: #000; }
.wrt-btn-primary:hover:not(:disabled) { filter: brightness(1.1); }
.wrt-btn-primary:disabled { opacity: 0.35; cursor: not-allowed; }
.wrt-btn-danger { background: transparent; color: #ff4466; border: 1px solid #ff4466; }
.wrt-btn-danger:hover:not(:disabled) { background: rgba(255,68,102,0.08); }
.wrt-btn-danger:disabled { opacity: 0.3; cursor: not-allowed; }
.wrt-btn-ghost { background: #111118; color: #e2e8f0; border: 1px solid #1e1e2e; }
.wrt-btn-ghost:hover { border-color: #7c3aed; }

.wrt-flow { display: flex; align-items: center; padding: 4px 0; gap: 0; }
.wrt-flow-box {
  padding: 4px 7px; border-radius: 4px; font-size: 9px;
  border: 1px solid #1e1e2e; color: #4a5568;
  transition: all 0.3s; white-space: nowrap;
}
.wrt-flow-box.active { border-color: #00ff88; color: #00ff88; box-shadow: 0 0 8px rgba(0,255,136,0.15); }
.wrt-flow-arrow { font-size: 10px; color: #4a5568; padding: 0 4px; transition: color 0.3s; }
.wrt-flow-arrow.active { color: #00ff88; }

.wrt-meta { display: flex; flex-direction: column; gap: 4px; }
.wrt-meta-row { display: flex; justify-content: space-between; font-size: 10px; }
.wrt-meta-row span:first-child { color: #4a5568; }
.wrt-meta-row span:last-child { color: #e2e8f0; }

.wrt-status-pill {
  display: flex; align-items: center; gap: 6px;
  font-size: 10px; color: #4a5568;
  background: #111118; border: 1px solid #1e1e2e;
  border-radius: 100px; padding: 3px 10px;
}
.wrt-status-dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: #4a5568; transition: all 0.3s;
}
.wrt-status-dot.connected { background: #00ff88; box-shadow: 0 0 6px #00ff88; }
.wrt-status-dot.connecting { background: #ffaa00; animation: wrt-blink 1s infinite; }
.wrt-status-dot.error { background: #ff4466; }

.wrt-main { display: flex; flex-direction: column; overflow: hidden; }

.wrt-header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 8px 14px; border-bottom: 1px solid #1e1e2e; background: #111118;
}
.wrt-header-title { font-size: 10px; color: #4a5568; letter-spacing: 0.08em; }

.wrt-tabs { display: flex; padding: 0 14px; border-bottom: 1px solid #1e1e2e; }
.wrt-tab {
  font-size: 9px; letter-spacing: 0.08em; padding: 10px 12px; cursor: pointer;
  color: #4a5568; border-bottom: 2px solid transparent; transition: all 0.15s;
  user-select: none;
}
.wrt-tab.active { color: #00ff88; border-bottom-color: #00ff88; }
.wrt-tab:hover:not(.active) { color: #e2e8f0; }

.wrt-tab-content { flex: 1; overflow: hidden; display: none; flex-direction: column; }
.wrt-tab-content.active { display: flex; }

.wrt-log {
  flex: 1; overflow-y: auto; padding: 8px 12px;
  display: flex; flex-direction: column; gap: 2px;
}
.wrt-log::-webkit-scrollbar { width: 3px; }
.wrt-log::-webkit-scrollbar-thumb { background: #1e1e2e; border-radius: 2px; }

.wrt-entry {
  display: grid; grid-template-columns: 58px 56px 1fr; gap: 8px;
  padding: 3px 7px; border-radius: 3px;
  border-left: 2px solid transparent;
  font-size: 10px; line-height: 1.5;
  animation: wrt-fadein 0.15s ease;
}
@keyframes wrt-fadein { from { opacity:0; transform:translateY(2px); } to { opacity:1; transform:none; } }

.wrt-entry.info    { border-left-color: #7c3aed; }
.wrt-entry.info    .we-tag { color: #7c3aed; }
.wrt-entry.success { border-left-color: #00ff88; }
.wrt-entry.success .we-tag { color: #00ff88; }
.wrt-entry.error   { border-left-color: #ff4466; }
.wrt-entry.error   .we-tag { color: #ff4466; }
.wrt-entry.warn    { border-left-color: #ffaa00; }
.wrt-entry.warn    .we-tag { color: #ffaa00; }
.wrt-entry.step    { border-left-color: #60a5fa; }
.wrt-entry.step    .we-tag { color: #60a5fa; }

.we-time { color: #4a5568; font-size: 9px; padding-top: 1px; }
.we-tag  { font-size: 9px; font-weight: 700; padding-top: 1px; }
.we-msg  { color: #e2e8f0; word-break: break-all; white-space: pre-wrap; }

.wrt-empty {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  flex: 1; gap: 6px; color: #4a5568; font-size: 11px;
}

.wrt-sdp-pane { flex: 1; display: grid; grid-template-columns: 1fr 1fr; overflow: hidden; }
.wrt-sdp-box { display: flex; flex-direction: column; border-right: 1px solid #1e1e2e; overflow: hidden; }
.wrt-sdp-box:last-child { border-right: none; }
.wrt-sdp-hdr {
  padding: 7px 12px; border-bottom: 1px solid #1e1e2e;
  font-size: 9px; color: #4a5568; letter-spacing: 0.08em;
  display: flex; align-items: center; gap: 6px;
}
.wrt-sdp-dot { width: 5px; height: 5px; border-radius: 50%; background: #1e1e2e; }
.wrt-sdp-dot.active { background: #00ff88; }
.wrt-sdp-pane textarea {
  flex: 1; background: transparent; border: none; color: #e2e8f0;
  font-family: inherit; font-size: 10px; padding: 10px 12px;
  resize: none; outline: none; line-height: 1.5;
}

.wrt-audio-pane {
  flex: 1; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 14px;
}
.wrt-viz { display: flex; align-items: center; gap: 2px; height: 44px; }
.wrt-bar { width: 3px; border-radius: 2px; min-height: 2px; background: #00ff88; transition: height 0.05s; }
.wrt-mic-btn {
  width: 52px; height: 52px; border-radius: 50%;
  background: #111118; border: 1.5px solid #1e1e2e;
  font-size: 18px; cursor: pointer;
  display: flex; align-items: center; justify-content: center; transition: all 0.2s;
}
.wrt-mic-btn.active { border-color: #00ff88; box-shadow: 0 0 16px rgba(0,255,136,0.2); }
.wrt-audio-status { font-size: 10px; color: #4a5568; text-align: center; }
</style><div class="wrt-wrap"><div class="wrt-toggle closed"><div class="wrt-toggle-left"><div class="wrt-live-dot"></div><div><div class="wrt-toggle-title">INTERACTIVE TESTER</div><div class="wrt-toggle-sub">Browser → LiteLLM → OpenAI · WebRTC</div></div></div><span class="wrt-chevron">▼</span></div></div><style>
.wrt-wrap {
  background: #1f2937;
  border: 1px solid #334155;
}
.wrt-toggle,
.wrt-toggle:hover {
  background: #111827;
}
.wrt-toggle-title,
.we-msg {
  color: #e2e8f0;
}
.wrt-toggle-sub,
.wrt-label,
.wrt-field label,
.wrt-flow-box,
.wrt-flow-arrow,
.wrt-meta-row span:first-child,
.wrt-header-title,
.wrt-tab,
.we-time {
  color: #94a3b8;
}
.wrt-body,
.wrt-sidebar,
.wrt-main,
.wrt-header,
.wrt-tabs,
.wrt-sdp-box,
.wrt-sdp-hdr,
.wrt-divider {
  border-color: #334155;
}
.wrt-header {
  background: #111827;
}
.wrt-field input,
.wrt-mic-btn,
.wrt-status-pill {
  background: #0b1220;
  border-color: #334155;
  color: #e2e8f0;
}
.wrt-field input:focus,
.wrt-btn-ghost:hover {
  border-color: #60a5fa;
}
.wrt-btn-ghost {
  background: #0b1220;
  border-color: #334155;
  color: #e2e8f0;
}
.wrt-log::-webkit-scrollbar-thumb {
  background: #475569;
}
.wrt-tab.active {
  color: #93c5fd;
  border-bottom-color: #93c5fd;
}
.wrt-empty,
.wrt-audio-status,
.wrt-meta-row span:last-child {
  color: #cbd5e1;
}
.wrt-sdp-dot {
  background: #475569;
}
.wrt-sdp-pane textarea {
  color: #e2e8f0;
}
</style>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="client-usage">Client Usage<a href="https://docs.litellm.ai/blog/realtime_webrtc_http_endpoints#client-usage" class="hash-link" aria-label="Direct link to Client Usage" title="Direct link to Client Usage">​</a></h2>
<p><strong>1. Get token</strong> - <code>POST /v1/realtime/client_secrets</code> with LiteLLM API key and <code>{ model }</code>.</p>
<p><strong>2. WebRTC handshake</strong> - Create <code>RTCPeerConnection</code>, add mic track, create data channel <code>oai-events</code>, send SDP offer to <code>POST /v1/realtime/calls</code> with <code>Authorization: Bearer &lt;encrypted_token&gt;</code> and <code>Content-Type: application/sdp</code>.</p>
<p><strong>3. Events</strong> - Use the data channel for <code>session.update</code> and other events.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Full code example</summary><div><div class="collapsibleContent_i85q"><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript 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)">// 1. Token</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)">const</span><span class="token plain"> r </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">fetch</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"http://proxy:4000/v1/realtime/client_secrets"</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 literal-property property">method</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)">"POST"</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 literal-property property">headers</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><span class="token string-property property">"Authorization"</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)">"Bearer sk-litellm-key"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string-property property">"Content-Type"</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)">"application/json"</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 literal-property property">body</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token known-class-name class-name" style="color:rgb(38, 127, 153)">JSON</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">stringify</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 literal-property property">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-4o-realtime"</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 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><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"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> client_secret </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 keyword control-flow" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> r</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">json</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 keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> token </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> client_secret</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token property-access">value</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)">// 2. WebRTC</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)">const</span><span class="token plain"> pc </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)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">RTCPeerConnection</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 keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> audio </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(9, 134, 88)">document</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">createElement</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"audio"</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">audio</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token property-access">autoplay</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 boolean">true</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">pc</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method-variable function-variable method function property-access" style="color:rgb(0, 0, 255)">ontrack</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 punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token parameter">e</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">audio</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token property-access">srcObject</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token property-access">streams</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 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)">const</span><span class="token plain"> ms </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(9, 134, 88)">navigator</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token property-access">mediaDevices</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">getUserMedia</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 literal-property property">audio</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token boolean">true</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 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">pc</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">addTrack</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">ms</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">getTracks</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 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 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)">const</span><span class="token plain"> dc </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">createDataChannel</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"oai-events"</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)">const</span><span class="token plain"> offer </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">createOffer</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 keyword control-flow" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">setLocalDescription</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">offer</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"></span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> sdpRes </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">fetch</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"http://proxy:4000/v1/realtime/calls"</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 literal-property property">method</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)">"POST"</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 literal-property property">headers</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><span class="token string-property property">"Authorization"</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(163, 21, 21)">`</span><span class="token template-string string" style="color:rgb(163, 21, 21)">Bearer </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(4, 81, 165)">${</span><span class="token template-string interpolation">token</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token template-string template-punctuation string" style="color:rgb(163, 21, 21)">`</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string-property property">"Content-Type"</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)">"application/sdp"</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 literal-property property">body</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> offer</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token property-access">sdp</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><br></span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> pc</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">setRemoteDescription</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 literal-property property">type</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)">"answer"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token literal-property property">sdp</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> sdpRes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">text</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 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"></span><span class="token comment" style="color:rgb(0, 128, 0)">// 3. Events</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">dc</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">send</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token known-class-name class-name" style="color:rgb(38, 127, 153)">JSON</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">stringify</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 literal-property property">type</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)">"session.update"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token literal-property property">session</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><span class="token literal-property property">instructions</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)">"..."</span><span class="token plain"> </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 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><br></span></code></pre></div></div></div></div></details>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="faq">FAQ<a href="https://docs.litellm.ai/blog/realtime_webrtc_http_endpoints#faq" class="hash-link" aria-label="Direct link to FAQ" title="Direct link to FAQ">​</a></h2>
<p><strong>Q: What do I do if I get a 401 Token expired error?</strong><br>
<!-- -->A: Tokens are short-lived. Get a fresh token right before creating the WebRTC offer.</p>
<p><strong>Q: Which key should I use for <code>/v1/realtime/calls</code>?</strong><br>
<!-- -->A: Use the <strong>encrypted token</strong> from <code>client_secrets</code>, not your raw API key.</p>
<p><strong>Q: Should I pass the <code>model</code> parameter when making the call?</strong><br>
<!-- -->A: No, the encrypted token already encodes all routing information including model.</p>
<p><strong>Q: How do I resolve Azure <code>api-version</code> errors?</strong><br>
<!-- -->A: Set the correct <code>api_version</code> in <code>litellm_params</code> (or via the <code>AZURE_API_VERSION</code> environment variable), along with the right <code>api_base</code> and deployment values.</p>
<p><strong>Q: What if I get no audio?</strong><br>
<!-- -->A: Make sure you grant microphone permission, ensure <code>pc.ontrack</code> assigns the audio element with <code>autoplay</code> enabled, check your network/firewall for WebRTC traffic, and inspect the browser console for ICE or SDP errors.</p>]]></content:encoded>
            <category>realtime</category>
            <category>webrtc</category>
            <category>proxy</category>
            <category>openai</category>
        </item>
        <item>
            <title><![CDATA[Day 0 Support: GPT-5.4]]></title>
            <link>https://docs.litellm.ai/blog/gpt_5_4</link>
            <guid>https://docs.litellm.ai/blog/gpt_5_4</guid>
            <pubDate>Thu, 05 Mar 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[GPT-5.4 model support in LiteLLM]]></description>
            <content:encoded><![CDATA[<p>LiteLLM now supports fully GPT-5.4!</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="docker-image">Docker Image<a href="https://docs.litellm.ai/blog/gpt_5_4#docker-image" class="hash-link" aria-label="Direct link to Docker Image" title="Direct link to Docker Image">​</a></h2>
<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.81.14-stable.gpt-5.4_patch</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="usage">Usage<a href="https://docs.litellm.ai/blog/gpt_5_4#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 SDK</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 number" style="color:rgb(9, 134, 88)">5.4</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.4</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></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.81.14-stable.gpt-5.4_patch \</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.4",</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.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">    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="notes">Notes<a href="https://docs.litellm.ai/blog/gpt_5_4#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes">​</a></h2>
<ul>
<li>Restart your container to get the cost tracking for this model.</li>
<li>Use <code>/responses</code> for better model performance.</li>
<li>GPT-5.4 supports reasoning, function calling, vision, and tool-use — see the <a href="https://docs.litellm.ai/docs/providers/openai">OpenAI provider docs</a> for advanced usage.</li>
</ul>]]></content:encoded>
            <category>openai</category>
            <category>gpt-5.4</category>
            <category>completion</category>
        </item>
        <item>
            <title><![CDATA[DAY 0 Support: Gemini 3.1 Flash Lite Preview on LiteLLM]]></title>
            <link>https://docs.litellm.ai/blog/gemini_3_1_flash_lite_preview</link>
            <guid>https://docs.litellm.ai/blog/gemini_3_1_flash_lite_preview</guid>
            <pubDate>Tue, 03 Mar 2026 08:00:00 GMT</pubDate>
            <description><![CDATA[Guide to using Gemini 3.1 Flash Lite Preview on LiteLLM Proxy and SDK with day 0 support.]]></description>
            <content:encoded><![CDATA[<p>LiteLLM now supports <code>gemini-3.1-flash-lite-preview</code> with full day 0 support!</p>
<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>If you only want cost tracking, you need no change in your current Litellm version. But if you want the support for new features introduced along with it like thinking levels, you will need to use v1.80.8-stable.1 or above.</p></div></div>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="deploy-this-version">Deploy this version<a href="https://docs.litellm.ai/blog/gemini_3_1_flash_lite_preview#deploy-this-version" class="hash-link" aria-label="Direct link to Deploy this version" title="Direct link to Deploy this version">​</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">Docker</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Pip</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-showLineNumbers language-showlinenumbers codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">docker run litellm</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-showlinenumbers 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 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">-e STORE_MODEL_IN_DB=True \</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">ghcr.io/berriai/litellm:main-v1.80.8-stable.1</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-showLineNumbers language-showlinenumbers codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">pip install litellm</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-showlinenumbers 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">pip install litellm==v1.80.8-stable.1</span><br></span></code></pre></div></div></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-new">What's New<a href="https://docs.litellm.ai/blog/gemini_3_1_flash_lite_preview#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New">​</a></h2>
<p>Supports all four thinking levels:</p>
<ul>
<li><strong>MINIMAL</strong>: Ultra-fast responses with minimal reasoning</li>
<li><strong>LOW</strong>: Simple instruction following</li>
<li><strong>MEDIUM</strong>: Balanced reasoning for complex tasks</li>
<li><strong>HIGH</strong>: Maximum reasoning depth (dynamic)</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start">Quick Start<a href="https://docs.litellm.ai/blog/gemini_3_1_flash_lite_preview#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start">​</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">SDK</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">PROXY</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><strong>Basic Usage</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)">"gemini/gemini-3.1-flash-lite-preview"</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)">"Extract key entities from this text: ..."</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 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><p><strong>With Thinking Levels</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"></span><span class="token comment" style="color:rgb(0, 128, 0)"># Use MEDIUM thinking for complex reasoning tasks</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)">"gemini/gemini-3.1-flash-lite-preview"</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)">"Analyze this dataset and identify patterns"</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">    reasoning_effort</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"medium"</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)"># low, medium , high</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><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"> gemini</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">3.1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">flash</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">lite</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"> gemini/gemini</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">3.1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">flash</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">lite</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">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/GEMINI_API_KEY</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><span class="token comment" style="color:rgb(0, 128, 0)"># Or use Vertex AI</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"> vertex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">gemini</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">3.1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">flash</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">lite</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/gemini</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">3.1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">flash</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">lite</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">vertex_project</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">project</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">id</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"> us</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">central1</span><br></span></code></pre></div></div><p><strong>2. Start 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">litellm --config /path/to/config.yaml</span><br></span></code></pre></div></div><p><strong>3. Make requests</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://localhost:4000/v1/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 &lt;YOUR-LITELLM-KEY&gt;" \</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": "gemini-3.1-flash-lite",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "messages": [{"role": "user", "content": "Extract structured data from this text"}],</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "reasoning_effort": "low"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  }'</span><br></span></code></pre></div></div></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="supported-endpoints">Supported Endpoints<a href="https://docs.litellm.ai/blog/gemini_3_1_flash_lite_preview#supported-endpoints" class="hash-link" aria-label="Direct link to Supported Endpoints" title="Direct link to Supported Endpoints">​</a></h2>
<p>LiteLLM provides <strong>full end-to-end support</strong> for Gemini 3.1 Flash Lite Preview on:</p>
<ul>
<li>✅ <code>/v1/chat/completions</code> - OpenAI-compatible chat completions endpoint</li>
<li>✅ <code>/v1/responses</code> - OpenAI Responses API endpoint (streaming and non-streaming)</li>
<li>✅ <a href="https://docs.litellm.ai/docs/anthropic_unified"><code>/v1/messages</code></a> - Anthropic-compatible messages endpoint</li>
<li>✅ <code>/v1/generateContent</code> – <a href="https://docs.litellm.ai/docs/generateContent">Google Gemini API</a> compatible endpoint</li>
</ul>
<p>All endpoints support:</p>
<ul>
<li>Streaming and non-streaming responses</li>
<li>Function calling with thought signatures</li>
<li>Multi-turn conversations</li>
<li>All Gemini 3-specific features (thinking levels, thought signatures)</li>
<li>Full multimodal support (text, image, audio, video)</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="reasoning_effort-mapping-for-gemini-31"><code>reasoning_effort</code> Mapping for Gemini 3.1<a href="https://docs.litellm.ai/blog/gemini_3_1_flash_lite_preview#reasoning_effort-mapping-for-gemini-31" class="hash-link" aria-label="Direct link to reasoning_effort-mapping-for-gemini-31" title="Direct link to reasoning_effort-mapping-for-gemini-31">​</a></h2>
<p>LiteLLM automatically maps OpenAI's <code>reasoning_effort</code> parameter to Gemini's <code>thinkingLevel</code>:</p>
<table><thead><tr><th>reasoning_effort</th><th>thinking_level</th><th>Use Case</th></tr></thead><tbody><tr><td><code>minimal</code></td><td><code>minimal</code></td><td>Ultra-fast responses, simple queries</td></tr><tr><td><code>low</code></td><td><code>low</code></td><td>Basic instruction following</td></tr><tr><td><code>medium</code></td><td><code>medium</code></td><td>Balanced reasoning for moderate complexity</td></tr><tr><td><code>high</code></td><td><code>high</code></td><td>Maximum reasoning depth, complex problems</td></tr><tr><td><code>disable</code></td><td><code>minimal</code></td><td>Disable extended reasoning</td></tr><tr><td><code>none</code></td><td><code>minimal</code></td><td>No extended reasoning</td></tr></tbody></table>]]></content:encoded>
            <category>gemini</category>
            <category>day 0 support</category>
            <category>llms</category>
            <category>supernova</category>
        </item>
        <item>
            <title><![CDATA[Incident Report: Cache Eviction Closes In-Use httpx Clients]]></title>
            <link>https://docs.litellm.ai/blog/httpx-cache-eviction-incident</link>
            <guid>https://docs.litellm.ai/blog/httpx-cache-eviction-incident</guid>
            <pubDate>Fri, 27 Feb 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Date: February 27, 2026]]></description>
            <content:encoded><![CDATA[<p><strong>Date:</strong> February 27, 2026
<strong>Duration:</strong> ~6 days (Feb 21 merge -&gt; Feb 27 fix)
<strong>Severity:</strong> High
<strong>Status:</strong> Resolved</p>
<blockquote>
<p><strong>Note:</strong> This fix is available starting from LiteLLM <code>v1.81.14.rc.2</code> or higher.</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="https://docs.litellm.ai/blog/httpx-cache-eviction-incident#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
<p>A change to improve Redis connection pool cleanup introduced a regression that closed <strong>httpx clients</strong> that were still actively being used by the proxy. The <code>LLMClientCache</code> (an in-memory TTL cache) stores both Redis clients <em>and</em> httpx clients under the same eviction policy. When a cache entry expired or was evicted, the new cleanup code called <code>aclose()</code>/<code>close()</code> on the evicted value which worked correctly for Redis clients, but destroyed httpx clients that other parts of the system still held references to and were actively using for LLM API calls.</p>
<p><strong>Impact:</strong> Any proxy instance that hit the cache TTL (default 10 minutes) or capacity limit (200 entries) would have its httpx clients closed out from under it, causing requests to LLM providers to fail with connection errors.</p>
<!-- -->
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="background">Background<a href="https://docs.litellm.ai/blog/httpx-cache-eviction-incident#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2>
<p><code>LLMClientCache</code> extends <code>InMemoryCache</code> and is used to cache SDK clients (OpenAI, Anthropic, etc.) to avoid re-creating them on every request. These clients are keyed by configuration + event loop ID. The cache has:</p>
<ul>
<li><strong>Max size:</strong> 200 entries</li>
<li><strong>Default TTL:</strong> 10 minutes</li>
</ul>
<p>When the cache is full or entries expire, <code>InMemoryCache.evict_cache()</code> calls <code>_remove_key()</code> to drop entries.</p>
<p>The cached values are a mix of:</p>
<ul>
<li><strong>Redis/async Redis clients</strong> — owned exclusively by the cache, safe to close on eviction</li>
<li><strong>httpx-backed SDK clients</strong> (OpenAI, Anthropic, etc.) — shared references, still in use by router/model instances</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="root-cause">Root Cause<a href="https://docs.litellm.ai/blog/httpx-cache-eviction-incident#root-cause" class="hash-link" aria-label="Direct link to Root Cause" title="Direct link to Root Cause">​</a></h2>
<p><a href="https://github.com/BerriAI/litellm/pull/21717" target="_blank" rel="noopener noreferrer">PR #21717</a> overrode <code>_remove_key()</code> in <code>LLMClientCache</code> to close async clients on eviction:</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Problematic code added in PR #21717</summary><div><div class="collapsibleContent_i85q"><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)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">LLMClientCache</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">InMemoryCache</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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">_remove_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">str</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 operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token boolean">None</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">        value </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">cache_dict</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">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 builtin" style="color:rgb(0, 112, 193)">super</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">_remove_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">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 keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> value </span><span class="token keyword" style="color:rgb(0, 0, 255)">is</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> </span><span class="token boolean">None</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">            close_fn </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">getattr</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">value</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)">"aclose"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token boolean">None</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)">or</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">getattr</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">value</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)">"close"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token boolean">None</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)">if</span><span class="token plain"> close_fn </span><span class="token keyword" style="color:rgb(0, 0, 255)">and</span><span class="token plain"> asyncio</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">iscoroutinefunction</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">close_fn</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)">try</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">                    asyncio</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get_running_loop</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">create_task</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">close_fn</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 keyword" style="color:rgb(0, 0, 255)">except</span><span class="token plain"> RuntimeError</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)">pass</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)">elif</span><span class="token plain"> close_fn </span><span class="token keyword" style="color:rgb(0, 0, 255)">and</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">callable</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">close_fn</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)">try</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">                    close_fn</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)">except</span><span class="token plain"> Exception</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)">pass</span><br></span></code></pre></div></div></div></div></details>
<p>The intent was correct for Redis clients — prevent connection pool leaks when cached Redis clients expire. But <code>LLMClientCache</code> also stores httpx-backed SDK clients (e.g., <code>AsyncOpenAI</code>, <code>AsyncAnthropic</code>). These clients:</p>
<ol>
<li>Have an <code>aclose()</code> method (inherited from httpx)</li>
<li>Are still held by references elsewhere in the codebase (router, model instances)</li>
<li>Were being closed without any check on whether they were still in use</li>
</ol>
<p>So when the cache evicted an entry, it would call <code>aclose()</code> on an httpx client that was still being used for active LLM requests → closed transport → connection errors.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-fix">The Fix<a href="https://docs.litellm.ai/blog/httpx-cache-eviction-incident#the-fix" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix">​</a></h2>
<p><a href="https://github.com/BerriAI/litellm/pull/22247" target="_blank" rel="noopener noreferrer">PR #22247</a> removed the <code>_remove_key</code> override entirely:</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>The fix (PR #22247)</summary><div><div class="collapsibleContent_i85q"><div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff 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"> class LLMClientCache(InMemoryCache):</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">-    def _remove_key(self, key: str) -&gt; None:</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">-        """Close async clients before evicting them to prevent connection pool leaks."""</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">-        value = self.cache_dict.get(key)</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">-        super()._remove_key(key)</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">-        if value is not None:</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">-            close_fn = getattr(value, "aclose", None) or getattr(</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">-                value, "close", None</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><span class="token-line" style="color:#000000"><span class="token plain">     def update_cache_key_with_event_loop(self, key):</span><br></span></code></pre></div></div></div></div></details>
<p>The eviction now simply drops the reference and lets Python's GC handle cleanup, which is safe because:</p>
<ul>
<li>httpx clients that are still referenced elsewhere stay alive</li>
<li>Unreferenced clients get cleaned up by GC naturally</li>
</ul>
<p>The other improvements from PR #21717 were kept:</p>
<ul>
<li><strong><code>max_connections</code> respected for URL-based Redis configs</strong>, previously silently dropped</li>
<li><strong><code>disconnect()</code> now closes both sync and async Redis clients</strong>, sync client was previously leaked</li>
<li><strong>Connection pool passthrough</strong>, when a pool is provided with a URL config, it's used directly instead of creating a duplicate</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="remediation">Remediation<a href="https://docs.litellm.ai/blog/httpx-cache-eviction-incident#remediation" class="hash-link" aria-label="Direct link to Remediation" title="Direct link to Remediation">​</a></h2>
<table><thead><tr><th>Action</th><th>Status</th><th>Code</th></tr></thead><tbody><tr><td>Remove <code>_remove_key</code> override that closes shared clients on eviction</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/pull/22247" target="_blank" rel="noopener noreferrer">PR #22247</a></td></tr><tr><td>Add e2e test: evicted client still usable (capacity)</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/pull/22313" target="_blank" rel="noopener noreferrer">PR #22313</a></td></tr><tr><td>Add e2e test: expired client still usable (TTL)</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/pull/22313" target="_blank" rel="noopener noreferrer">PR #22313</a></td></tr></tbody></table>
<p>The e2e tests go through <code>get_async_httpx_client()</code> the same code path the proxy uses in production and assert the client is still functional after eviction. These run in CI on every PR against <code>main</code>. If anyone modifies <code>LLMClientCache</code> eviction behavior, overrides <code>_remove_key</code>, or adds any form of client cleanup on eviction, these tests will fail regardless of the implementation approach.</p>]]></content:encoded>
            <category>incident-report</category>
            <category>caching</category>
            <category>stability</category>
        </item>
        <item>
            <title><![CDATA[Day 0 Support: GPT-5.3-Codex]]></title>
            <link>https://docs.litellm.ai/blog/gpt_5_3_codex</link>
            <guid>https://docs.litellm.ai/blog/gpt_5_3_codex</guid>
            <pubDate>Tue, 24 Feb 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Day 0 support for GPT-5.3-Codex on LiteLLM, including phase parameter handling for Responses API.]]></description>
            <content:encoded><![CDATA[<p>LiteLLM now supports GPT-5.3-Codex on Day 0, including support for the new assistant <code>phase</code> metadata on Responses API output items.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-phase-matters-for-gpt-53-codex">Why <code>phase</code> matters for GPT-5.3-Codex<a href="https://docs.litellm.ai/blog/gpt_5_3_codex#why-phase-matters-for-gpt-53-codex" class="hash-link" aria-label="Direct link to why-phase-matters-for-gpt-53-codex" title="Direct link to why-phase-matters-for-gpt-53-codex">​</a></h2>
<p><code>phase</code> appears on assistant output items and helps distinguish preamble/commentary turns from final closeout responses.</p>
<p>Reference: <a href="https://developers.openai.com/api/reference/overview" target="_blank" rel="noopener noreferrer">Phase parameter docs</a></p>
<p>Supported values:</p>
<ul>
<li><code>null</code></li>
<li><code>"commentary"</code></li>
<li><code>"final_answer"</code></li>
</ul>
<p>Important:</p>
<ul>
<li>Persist assistant output items with <code>phase</code> exactly as returned.</li>
<li>Send those assistant items back on the next turn.</li>
<li>Do <strong>not</strong> add <code>phase</code> to user messages.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="docker-image">Docker Image<a href="https://docs.litellm.ai/blog/gpt_5_3_codex#docker-image" class="hash-link" aria-label="Direct link to Docker Image" title="Direct link to Docker Image">​</a></h2>
<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.81.12-stable.gpt-5.3</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="usage">Usage<a href="https://docs.litellm.ai/blog/gpt_5_3_codex#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></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.3</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">codex</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.3</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">codex</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=$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.81.12-stable.gpt-5.3 \</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/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.3-codex",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "input": "Write a Python script that checks if a number is prime."</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="python-example-persist-phase-with-openai-client--litellm-base-url">Python Example: Persist <code>phase</code> with OpenAI Client + LiteLLM Base URL<a href="https://docs.litellm.ai/blog/gpt_5_3_codex#python-example-persist-phase-with-openai-client--litellm-base-url" class="hash-link" aria-label="Direct link to python-example-persist-phase-with-openai-client--litellm-base-url" title="Direct link to python-example-persist-phase-with-openai-client--litellm-base-url">​</a></h2>
<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"></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/v1"</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)"># LiteLLM Proxy</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-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 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">items </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 punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># Persist this per conversation/thread</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">_item_get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">item</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> default</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token boolean">None</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)">if</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">isinstance</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">item</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">dict</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)">return</span><span class="token plain"> item</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> default</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)">return</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">getattr</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">item</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> default</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" 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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">run_turn</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">user_text</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">str</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)">global</span><span class="token plain"> items</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)"># User message: no phase field</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    items</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</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)">"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)">"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">            </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><br></span><span class="token-line" style="color:#000000"><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 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)">"input_text"</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)">"text"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> user_text</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 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">    resp </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.3-codex"</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 plain">items</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)"># Persist assistant output items verbatim, including phase</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"> out_item </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">output </span><span class="token keyword" style="color:rgb(0, 0, 255)">or</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 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">        items</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">out_item</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: inspect latest phase for UI/telemetry routing</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    latest_phase </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token boolean">None</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"> out_item </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">reversed</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">output </span><span class="token keyword" style="color:rgb(0, 0, 255)">or</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 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)">if</span><span class="token plain"> _item_get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">out_item</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)">"type"</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)">"output_item.done"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">and</span><span class="token plain"> _item_get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">out_item</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)">"phase"</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)">is</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> </span><span class="token boolean">None</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">            latest_phase </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> _item_get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">out_item</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)">"phase"</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)">break</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)">return</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> latest_phase</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="notes">Notes<a href="https://docs.litellm.ai/blog/gpt_5_3_codex#notes" class="hash-link" aria-label="Direct link to Notes" title="Direct link to Notes">​</a></h2>
<ul>
<li>Use <code>/v1/responses</code> for GPT Codex models.</li>
<li>Preserve full assistant output history for best multi-turn behavior.</li>
<li>If <code>phase</code> metadata is dropped during history reconstruction, output quality can degrade on long-running tasks.</li>
</ul>]]></content:encoded>
            <category>openai</category>
            <category>gpt-5.3-codex</category>
            <category>codex</category>
            <category>day 0 support</category>
        </item>
        <item>
            <title><![CDATA[Incident Report: Encrypted Content Failures in Multi-Region Responses API Load Balancing]]></title>
            <link>https://docs.litellm.ai/blog/responses-api-encrypted-content-incident</link>
            <guid>https://docs.litellm.ai/blog/responses-api-encrypted-content-incident</guid>
            <pubDate>Tue, 24 Feb 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Date: Feb 24, 2026]]></description>
            <content:encoded><![CDATA[<p><strong>Date:</strong> Feb 24, 2026<br>
<strong>Duration:</strong> Ongoing (until fix deployed)<br>
<strong>Severity:</strong> High (for users load balancing Responses API across different API keys)<br>
<strong>Status:</strong> Resolved</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
<p>When load balancing OpenAI's Responses API across deployments with <strong>different API keys</strong> (e.g., different Azure regions or OpenAI organizations), follow-up requests containing encrypted content items (like <code>rs_...</code> reasoning items) would fail with:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#000000"><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 property">"error"</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">    </span><span class="token property">"message"</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)">"The encrypted content for item rs_0d09d6e56879e76500699d6feee41c8197bd268aae76141f87 could not be verified. Reason: Encrypted content organization_id did not match the target organization."</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 property">"type"</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)">"invalid_request_error"</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 property">"code"</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)">"invalid_encrypted_content"</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><br></span></code></pre></div></div>
<p>Encrypted content items are cryptographically tied to the API key's organization that created them. When the router load balanced a follow-up request to a deployment with a different API key, decryption failed.</p>
<ul>
<li><strong>Responses API calls with encrypted content:</strong> Complete failure when routed to wrong deployment</li>
<li><strong>Initial requests:</strong> Unaffected — only follow-up requests containing encrypted items failed</li>
<li><strong>Other API endpoints:</strong> No impact — chat completions, embeddings, etc. functioned normally</li>
</ul>
<!-- -->
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="background">Background<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2>
<p>OpenAI's Responses API can return encrypted "reasoning items" (with IDs like <code>rs_...</code>) that contain intermediate reasoning steps. These items are encrypted with the organization's key and can only be decrypted by the same organization's API key.</p>
<p>When load balancing across deployments with different API keys, the existing affinity mechanisms were insufficient:</p>
<ul>
<li><strong><code>responses_api_deployment_check</code></strong>: Requires <code>previous_response_id</code> which some clients (like Codex) don't provide</li>
<li><strong><code>deployment_affinity</code></strong>: Too broad — pins <em>all</em> requests from a user to one deployment, reducing effective quota by the number of users</li>
<li><strong><code>session_affinity</code></strong>: Requires explicit session IDs and still reduces quota</li>
</ul>
<!-- -->
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="root-cause">Root Cause<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#root-cause" class="hash-link" aria-label="Direct link to Root Cause" title="Direct link to Root Cause">​</a></h2>
<p>LiteLLM's router had no mechanism to track which deployment created specific encrypted content items and route follow-up requests accordingly. The router treated all deployments as interchangeable, leading to decryption failures when encrypted content crossed organizational boundaries.</p>
<p><strong>The Problem Flow:</strong></p>
<ol>
<li>User calls <code>router.aresponses()</code> with model <code>gpt-5.1-codex</code></li>
<li>Router load balances to Deployment A (Azure East US, API Key 1)</li>
<li>Response contains encrypted reasoning item <code>rs_abc123</code> (encrypted with Org 1's key)</li>
<li>User makes follow-up request with <code>rs_abc123</code> in the input</li>
<li>Router load balances to Deployment B (Azure West Europe, API Key 2)</li>
<li>Deployment B tries to decrypt <code>rs_abc123</code> with Org 2's key → <strong>fails</strong></li>
</ol>
<p><strong>Why Existing Solutions Didn't Work:</strong></p>
<ul>
<li><strong><code>previous_response_id</code></strong>: Not provided by all clients (e.g., Codex)</li>
<li><strong><code>deployment_affinity</code></strong>: Pins <em>all</em> user requests to one deployment → reduces quota to 1/N where N = number of deployments</li>
<li><strong><code>session_affinity</code></strong>: Requires explicit session management and still reduces quota</li>
</ul>
<p><strong>Timeline:</strong></p>
<ol>
<li>Users configured multi-region Responses API load balancing with different API keys</li>
<li>Initial requests succeeded, but follow-up requests with encrypted content failed intermittently</li>
<li>Error rate correlated with number of deployments (more deployments = higher chance of routing to wrong one)</li>
<li>Investigation revealed encrypted content was organization-bound</li>
<li>Existing affinity mechanisms deemed unsuitable (quota reduction, missing <code>previous_response_id</code>)</li>
<li>New solution designed and implemented: <code>encrypted_content_affinity</code></li>
</ol>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-fix">The Fix<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#the-fix" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix">​</a></h2>
<p>Implemented a new <code>encrypted_content_affinity</code> pre-call check that intelligently tracks encrypted content and routes follow-up requests <strong>only when necessary</strong>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="implementation">Implementation<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#implementation" class="hash-link" aria-label="Direct link to Implementation" title="Direct link to Implementation">​</a></h3>
<p><strong>1. Encoding <code>model_id</code> into output items</strong> (<a href="https://github.com/BerriAI/litellm/blob/main/litellm/litellm/responses/utils.py" target="_blank" rel="noopener noreferrer"><code>responses/utils.py</code></a>)</p>
<p>The same approach used for <code>previous_response_id</code> affinity — no cache needed. When a response contains output items with <code>encrypted_content</code>, LiteLLM encodes the originating deployment's <code>model_id</code> in <strong>two places</strong> for redundancy:</p>
<ol>
<li><strong>Into the item ID</strong> (if present): <code>rs_abc123</code> → <code>encitem_{base64("litellm:model_id:{model_id};item_id:rs_abc123")}</code></li>
<li><strong>Into the encrypted_content itself</strong>: Wraps the content with <code>litellm_enc:{base64("model_id:{model_id}")};{original_encrypted_content}</code></li>
</ol>
<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)"># Encoding item IDs (when present)</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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">_build_encrypted_item_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">model_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">str</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> item_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">str</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 operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">str</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">    assembled </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"litellm:model_id:</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">model_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">;item_id:</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">item_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    encoded </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> base64</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">b64encode</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">assembled</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">encode</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"utf-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 punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">decode</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"utf-8"</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)">return</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"encitem_</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">encoded</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</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)"># Wrapping encrypted_content (always, for redundancy)</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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">_wrap_encrypted_content_with_model_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">encrypted_content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">str</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> model_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">str</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 operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">str</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">    metadata </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"model_id:</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">model_id</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    encoded_metadata </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> base64</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">b64encode</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">metadata</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">encode</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"utf-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 punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">decode</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"utf-8"</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)">return</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"litellm_enc:</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">encoded_metadata</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">;</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">encrypted_content</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><br></span></code></pre></div></div>
<p><strong>Why wrap encrypted_content directly?</strong> Some clients (like Codex) don't consistently send item IDs in follow-up requests, but they always send the <code>encrypted_content</code> itself. By embedding <code>model_id</code> into the content, affinity works even when IDs are missing.</p>
<p><strong>Streaming responses:</strong> The wrapping logic is applied to both:</p>
<ul>
<li>Final response objects (non-streaming)</li>
<li>Individual streaming events (<code>response.output_item.added</code>, <code>response.output_item.done</code>)</li>
</ul>
<p>This ensures clients receiving streaming responses get wrapped content they can send back.</p>
<p>Before forwarding to the upstream provider, LiteLLM restores the original item IDs and unwraps encrypted_content so the provider never sees the encoded form:</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 comment" style="color:rgb(0, 128, 0)"># In responses/main.py — before calling the handler</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 plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> ResponsesAPIRequestUtils</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">_restore_encrypted_content_item_ids_in_input</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token builtin" style="color:rgb(0, 112, 193)">input</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div>
<p><strong>2. <code>EncryptedContentAffinityCheck</code> — routing only</strong> (<a href="https://github.com/BerriAI/litellm/blob/main/litellm/litellm/router_utils/pre_call_checks/encrypted_content_affinity_check.py" target="_blank" rel="noopener noreferrer"><code>encrypted_content_affinity_check.py</code></a>)</p>
<p>No <code>async_log_success_event</code> or cache lookups — the <code>model_id</code> is decoded directly from the item ID or encrypted_content:</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)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">EncryptedContentAffinityCheck</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">CustomLogger</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)">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">async_filter_deployments</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> model</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> healthy_deployments</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 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 triple-quoted-string string" style="color:rgb(163, 21, 21)">"""Extract model_id from input items (ID or encrypted_content) and pin to that deployment."""</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"> item </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> request_kwargs</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"input"</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 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 comment" style="color:rgb(0, 128, 0)"># Try to extract model_id from two sources:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">            model_id </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">_extract_model_id_from_input</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">item</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><br></span><span class="token-line" style="color:#000000"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> model_id</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">                deployment </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">_find_deployment_by_model_id</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">                    healthy_deployments</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> model_id</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)">if</span><span class="token plain"> deployment</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">                    request_kwargs</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"_encrypted_content_affinity_pinned"</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 boolean">True</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)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">deployment</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)">return</span><span class="token plain"> healthy_deployments</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><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">_extract_model_id_from_input</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> item</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">dict</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 operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token builtin" style="color:rgb(0, 112, 193)">str</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 triple-quoted-string string" style="color:rgb(163, 21, 21)">"""Extract model_id from either encoded ID or wrapped encrypted_content."""</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)"># 1. Try decoding from item ID (if present)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        item_id </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> item</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"id"</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)">""</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)">if</span><span class="token plain"> item_id</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">            decoded </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> ResponsesAPIRequestUtils</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">_decode_encrypted_item_id</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">item_id</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)">if</span><span class="token plain"> decoded</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)">return</span><span class="token plain"> decoded</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"model_id"</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><br></span><span class="token-line" style="color:#000000"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)"># 2. Try unwrapping from encrypted_content (fallback for clients that omit IDs)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">        encrypted_content </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> item</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"encrypted_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)">""</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)">if</span><span class="token plain"> encrypted_content </span><span class="token keyword" style="color:rgb(0, 0, 255)">and</span><span class="token plain"> encrypted_content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">startswith</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"litellm_enc:"</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">            model_id</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"> ResponsesAPIRequestUtils</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">_unwrap_encrypted_content_with_model_id</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">                encrypted_content</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)">return</span><span class="token plain"> model_id</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><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token boolean">None</span><br></span></code></pre></div></div>
<p><strong>3. Rate Limit Bypass</strong> (<a href="https://github.com/BerriAI/litellm/blob/main/litellm/litellm/router.py" target="_blank" rel="noopener noreferrer"><code>router.py</code></a>)</p>
<p>When encrypted content requires a specific deployment, RPM/TPM limits are bypassed (the request would fail on any other deployment anyway):</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 comment" style="color:rgb(0, 128, 0)"># In async_get_available_deployment, after filtering healthy deployments:</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)">if</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">    request_kwargs</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"_encrypted_content_affinity_pinned"</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)">and</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">healthy_deployments</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 number" style="color:rgb(9, 134, 88)">1</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)">return</span><span class="token plain"> healthy_deployments</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 plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># Bypass routing strategy (RPM/TPM checks)</span><br></span></code></pre></div></div>
<p><strong>3. Configuration</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">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">routing_strategy</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> usage</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">based</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">routing</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">v2</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token key atrule">enable_pre_call_checks</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">optional_pre_call_checks</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"> encrypted_content_affinity</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token key atrule">deployment_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)">86400</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 24 hours</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="key-benefits">Key Benefits<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#key-benefits" class="hash-link" aria-label="Direct link to Key Benefits" title="Direct link to Key Benefits">​</a></h3>
<p>✅ <strong>No quota reduction</strong>: Only pins requests containing encrypted items<br>
<!-- -->✅ <strong>Bypasses rate limits</strong>: When encrypted content requires a specific deployment, RPM/TPM limits don't block it<br>
<!-- -->✅ <strong>No <code>previous_response_id</code> required</strong>: Works by encoding <code>model_id</code> directly into the item ID<br>
<!-- -->✅ <strong>No cache required</strong>: <code>model_id</code> is decoded on-the-fly from the item ID — no Redis, no TTL<br>
<!-- -->✅ <strong>Globally safe</strong>: Can be enabled for all models; non-Responses-API calls are unaffected<br>
<!-- -->✅ <strong>Surgical precision</strong>: Normal requests continue to load balance freely</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="remediation">Remediation<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#remediation" class="hash-link" aria-label="Direct link to Remediation" title="Direct link to Remediation">​</a></h2>
<table><thead><tr><th>#</th><th>Action</th><th>Status</th><th>Code</th></tr></thead><tbody><tr><td>1</td><td>Encode <code>model_id</code> into encrypted-content item IDs on response</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/litellm/litellm/responses/utils.py" target="_blank" rel="noopener noreferrer"><code>responses/utils.py</code></a></td></tr><tr><td>2</td><td>Restore original item IDs before forwarding to upstream provider</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/litellm/litellm/responses/main.py" target="_blank" rel="noopener noreferrer"><code>responses/main.py</code></a></td></tr><tr><td>3</td><td><code>EncryptedContentAffinityCheck</code>: decode item IDs to route (no cache)</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/litellm/litellm/router_utils/pre_call_checks/encrypted_content_affinity_check.py" target="_blank" rel="noopener noreferrer"><code>encrypted_content_affinity_check.py</code></a></td></tr><tr><td>4</td><td>Add <code>encrypted_content_affinity</code> to <code>OptionalPreCallChecks</code> type</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/litellm/litellm/types/router.py" target="_blank" rel="noopener noreferrer"><code>types/router.py</code></a></td></tr><tr><td>5</td><td>Implement rate limit bypass for affinity-pinned requests</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/litellm/litellm/router.py" target="_blank" rel="noopener noreferrer"><code>router.py</code></a></td></tr><tr><td>6</td><td>Unit tests: encoding/decoding utilities, routing, RPM bypass</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/litellm/tests/test_litellm/router_utils/pre_call_checks/test_encrypted_content_affinity_check.py" target="_blank" rel="noopener noreferrer"><code>test_encrypted_content_affinity_check.py</code></a></td></tr><tr><td>7</td><td>Documentation: Responses API guide, load balancing guide, config reference</td><td>✅ Done</td><td><a href="https://docs.litellm.ai/docs/response_api#encrypted-content-affinity-multi-region-load-balancing" target="_blank" rel="noopener noreferrer">Docs</a></td></tr><tr><td>8</td><td><strong>[Mar 3]</strong> Fix streaming events to wrap encrypted_content</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/litellm/litellm/responses/streaming_iterator.py" target="_blank" rel="noopener noreferrer"><code>responses/streaming_iterator.py</code></a></td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="follow-up-fix-streaming-responses-mar-3-2026">Follow-up Fix: Streaming Responses (Mar 3, 2026)<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#follow-up-fix-streaming-responses-mar-3-2026" class="hash-link" aria-label="Direct link to Follow-up Fix: Streaming Responses (Mar 3, 2026)" title="Direct link to Follow-up Fix: Streaming Responses (Mar 3, 2026)">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-issue">The Issue<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#the-issue" class="hash-link" aria-label="Direct link to The Issue" title="Direct link to The Issue">​</a></h3>
<p>After the initial fix was deployed, users reported that the <code>invalid_encrypted_content</code> error <strong>still occurred</strong> when using streaming responses with clients like Codex. Investigation revealed:</p>
<ul>
<li>✅ Non-streaming responses: <code>encrypted_content</code> was correctly wrapped with <code>litellm_enc:</code> prefix</li>
<li>❌ Streaming responses: Individual <code>response.output_item.added</code> and <code>response.output_item.done</code> events contained <strong>raw, unwrapped</strong> <code>encrypted_content</code></li>
</ul>
<p>Since Codex and other clients consume responses as streams, they received unwrapped content in these events and sent it back in follow-up requests, causing the affinity check to fail.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-root-cause">The Root Cause<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#the-root-cause" class="hash-link" aria-label="Direct link to The Root Cause" title="Direct link to The Root Cause">​</a></h3>
<p>The <code>_update_encrypted_content_item_ids_in_response</code> function only modified the <strong>final</strong> response object, which is used for non-streaming responses. For streaming responses, individual chunks are processed by <code>ResponsesAPIStreamingIterator._process_chunk</code>, which was <strong>not</strong> applying the wrapping logic to streaming events.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-fix-1">The Fix<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#the-fix-1" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix">​</a></h3>
<p>Modified <code>litellm/litellm/responses/streaming_iterator.py</code> to wrap <code>encrypted_content</code> in streaming events:</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 comment" style="color:rgb(0, 128, 0)"># In ResponsesAPIStreamingIterator._process_chunk</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)">if</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">    self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">litellm_metadata</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)">and</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">litellm_metadata</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"encrypted_content_affinity_enabled"</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">    event_type </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">getattr</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">openai_responses_api_chunk</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)">"type"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token boolean">None</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)">if</span><span class="token plain"> event_type </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</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">        ResponsesAPIStreamEvents</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">OUTPUT_ITEM_ADDED</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">        ResponsesAPIStreamEvents</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">OUTPUT_ITEM_DONE</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">        item </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">getattr</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">openai_responses_api_chunk</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)">"item"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token boolean">None</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)">if</span><span class="token plain"> item</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">            encrypted_content </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">getattr</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">item</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)">"encrypted_content"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token boolean">None</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)">if</span><span class="token plain"> encrypted_content </span><span class="token keyword" style="color:rgb(0, 0, 255)">and</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">isinstance</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">encrypted_content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">str</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">                model_id </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">                    self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">litellm_metadata</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"model_info"</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 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">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"id"</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)">if</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">litellm_metadata</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)">else</span><span class="token plain"> </span><span class="token boolean">None</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)">if</span><span class="token plain"> model_id</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">                    wrapped_content </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> ResponsesAPIRequestUtils</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">_wrap_encrypted_content_with_model_id</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">                        encrypted_content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> model_id</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 builtin" style="color:rgb(0, 112, 193)">setattr</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">item</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)">"encrypted_content"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> wrapped_content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><br></span></code></pre></div></div>
<p>This ensures that <strong>all</strong> <code>encrypted_content</code> sent to clients (streaming or non-streaming) is wrapped with <code>model_id</code> metadata, enabling consistent affinity routing.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="migration-guide">Migration Guide<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#migration-guide" class="hash-link" aria-label="Direct link to Migration Guide" title="Direct link to Migration Guide">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="before-using-deployment_affinity">Before (Using <code>deployment_affinity</code>)<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#before-using-deployment_affinity" class="hash-link" aria-label="Direct link to before-using-deployment_affinity" title="Direct link to before-using-deployment_affinity">​</a></h3>
<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">optional_pre_call_checks</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"> deployment_affinity  </span><span class="token comment" style="color:rgb(0, 128, 0)"># ❌ Reduces quota by number of users</span><br></span></code></pre></div></div>
<p><strong>Problem:</strong> All requests from a user pin to one deployment, reducing effective quota to 1/N.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="after-using-encrypted_content_affinity">After (Using <code>encrypted_content_affinity</code>)<a href="https://docs.litellm.ai/blog/responses-api-encrypted-content-incident#after-using-encrypted_content_affinity" class="hash-link" aria-label="Direct link to after-using-encrypted_content_affinity" title="Direct link to after-using-encrypted_content_affinity">​</a></h3>
<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">optional_pre_call_checks</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"> encrypted_content_affinity  </span><span class="token comment" style="color:rgb(0, 128, 0)"># ✅ Only pins requests with encrypted content</span><br></span></code></pre></div></div>
<p><strong>Benefit:</strong> Normal requests load balance freely, only encrypted content requests pin when necessary.</p>
<hr>]]></content:encoded>
            <category>incident-report</category>
            <category>proxy</category>
            <category>responses-api</category>
            <category>load-balancing</category>
        </item>
        <item>
            <title><![CDATA[Incident Report: Wildcard Blocking New Models After Cost Map Reload]]></title>
            <link>https://docs.litellm.ai/blog/anthropic-wildcard-model-access-incident</link>
            <guid>https://docs.litellm.ai/blog/anthropic-wildcard-model-access-incident</guid>
            <pubDate>Mon, 23 Feb 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Date: Feb 23, 2026]]></description>
            <content:encoded><![CDATA[<p><strong>Date:</strong> Feb 23, 2026<br>
<strong>Duration:</strong> ~3 hours<br>
<strong>Severity:</strong> High (for users with provider wildcard access rules)<br>
<strong>Status:</strong> Resolved</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="https://docs.litellm.ai/blog/anthropic-wildcard-model-access-incident#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
<p>When a new Anthropic model (e.g. <code>claude-sonnet-4-6</code>) was added to the LiteLLM model cost map and a cost map reload was triggered, requests to the new model were rejected with:</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">key not allowed to access model. This key can only access models=['anthropic/*']. Tried to access claude-sonnet-4-6.</span><br></span></code></pre></div></div>
<p>The reload updated <code>litellm.model_cost</code> correctly but never re-ran <code>add_known_models()</code>, so <code>litellm.anthropic_models</code> (the in-memory set used by the wildcard resolver) remained stale. The new model was invisible to the <code>anthropic/*</code> wildcard even though the cost map knew about it.</p>
<ul>
<li><strong>LLM calls:</strong> All requests to newly-added Anthropic models were blocked with a 401.</li>
<li><strong>Existing models:</strong> Unaffected — only models missing from the stale provider set were impacted.</li>
<li><strong>Other providers:</strong> Same bug class existed for any provider wildcard (e.g. <code>openai/*</code>, <code>gemini/*</code>).</li>
</ul>
<!-- -->
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="background">Background<a href="https://docs.litellm.ai/blog/anthropic-wildcard-model-access-incident#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2>
<p>LiteLLM supports provider-level wildcard access rules. When an admin configures a key or team with <code>models=['anthropic/*']</code>, any model whose provider resolves to <code>anthropic</code> should be allowed. The resolution happens in <code>_model_custom_llm_provider_matches_wildcard_pattern</code>:</p>
<!-- -->
<p><code>litellm.anthropic_models</code> is a Python <code>set</code> populated at import time by <code>add_known_models()</code>. It is the source <code>get_llm_provider()</code> consults to map a bare model name like <code>claude-sonnet-4-6</code> to the provider string <code>"anthropic"</code>.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="root-cause">Root Cause<a href="https://docs.litellm.ai/blog/anthropic-wildcard-model-access-incident#root-cause" class="hash-link" aria-label="Direct link to Root Cause" title="Direct link to Root Cause">​</a></h2>
<p><code>add_known_models()</code> is called <strong>once</strong> at module import time. Both reload paths in <code>proxy_server.py</code> updated <code>litellm.model_cost</code> with the fresh map but never called <code>add_known_models()</code> again:</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 comment" style="color:rgb(0, 128, 0)"># Before the fix — both reload paths looked like this:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">new_model_cost_map </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> get_model_cost_map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">model_cost_map_url</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">litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">model_cost </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> new_model_cost_map          </span><span class="token comment" style="color:rgb(0, 128, 0)"># ✅ cost map updated</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">_invalidate_model_cost_lowercase_map</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 comment" style="color:rgb(0, 128, 0)"># ✅ cache cleared</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)"># ❌ add_known_models() never called</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)">#    → litellm.anthropic_models still has the old set</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)">#    → new model not in the set</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)">#    → get_llm_provider() raises for the new model</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)">#    → wildcard match returns False</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)">#    → 401 for every request to the new model</span><br></span></code></pre></div></div>
<p>The gap existed in two places:</p>
<ol>
<li><code>_check_and_reload_model_cost_map</code> — the periodic automatic reload (every 10 s)</li>
<li>The <code>/reload/model_cost_map</code> admin endpoint — the manual reload</li>
</ol>
<p><strong>Timeline:</strong></p>
<ol>
<li>New model (<code>claude-sonnet-4-6</code>) added to <code>model_prices_and_context_window.json</code></li>
<li>Admin triggers cost map reload via UI → <code>litellm.model_cost</code> updated</li>
<li>Users with <code>anthropic/*</code> wildcard keys attempt requests to <code>claude-sonnet-4-6</code></li>
<li><code>get_llm_provider('claude-sonnet-4-6')</code> raises → wildcard returns False → 401</li>
<li>Admin reloads cost map again — same result (root cause not addressed)</li>
<li>~3 hours of investigation → root cause identified → fix deployed</li>
</ol>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-fix">The Fix<a href="https://docs.litellm.ai/blog/anthropic-wildcard-model-access-incident#the-fix" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix">​</a></h2>
<p>After each reload, <code>add_known_models()</code> is called with the freshly fetched map passed explicitly. Passing the map directly (rather than relying on the module-level reference) removes any ambiguity about which dict is iterated:</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 comment" style="color:rgb(0, 128, 0)"># After the fix — both reload paths now do:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">new_model_cost_map </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> get_model_cost_map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">model_cost_map_url</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">litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">model_cost </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> new_model_cost_map</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">_invalidate_model_cost_lowercase_map</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">litellm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">add_known_models</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">model_cost_map</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">new_model_cost_map</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)"># ✅ sets repopulated</span><br></span></code></pre></div></div>
<p><code>add_known_models()</code> was also updated to accept an optional explicit map so callers cannot accidentally iterate a stale module-level reference:</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 comment" style="color:rgb(0, 128, 0)"># Before</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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">add_known_models</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 keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> value </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> model_cost</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">items</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 comment" style="color:rgb(0, 128, 0)"># reads module global — ambiguous after reload</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><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)"># After</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)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">add_known_models</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">model_cost_map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">Dict</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 boolean">None</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">    _map </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> model_cost_map </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> model_cost_map </span><span class="token keyword" style="color:rgb(0, 0, 255)">is</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token plain"> model_cost</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"> key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> value </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> _map</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">items</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 comment" style="color:rgb(0, 128, 0)"># always iterates the map you just fetched</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><br></span></code></pre></div></div>
<p>After the fix, the provider sets (<code>anthropic_models</code>, <code>open_ai_chat_completion_models</code>, etc.) are always consistent with <code>litellm.model_cost</code> immediately after every reload. New models become accessible via wildcard rules without any proxy restart.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="remediation">Remediation<a href="https://docs.litellm.ai/blog/anthropic-wildcard-model-access-incident#remediation" class="hash-link" aria-label="Direct link to Remediation" title="Direct link to Remediation">​</a></h2>
<table><thead><tr><th>#</th><th>Action</th><th>Status</th><th>Code</th></tr></thead><tbody><tr><td>1</td><td>Call <code>add_known_models(model_cost_map=...)</code> in the periodic reload path</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/litellm/proxy/proxy_server.py#L4393" target="_blank" rel="noopener noreferrer"><code>proxy_server.py#L4393</code></a></td></tr><tr><td>2</td><td>Call <code>add_known_models(model_cost_map=...)</code> in the <code>/reload/model_cost_map</code> endpoint</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/litellm/proxy/proxy_server.py#L11904" target="_blank" rel="noopener noreferrer"><code>proxy_server.py#L11904</code></a></td></tr><tr><td>3</td><td>Update <code>add_known_models()</code> to accept an explicit map parameter</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/litellm/__init__.py#L617" target="_blank" rel="noopener noreferrer"><code>__init__.py#L617</code></a></td></tr><tr><td>4</td><td>Regression test: <code>add_known_models(model_cost_map=...)</code> populates provider sets</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/tests/proxy_unit_tests/test_auth_checks.py" target="_blank" rel="noopener noreferrer"><code>test_auth_checks.py</code></a></td></tr><tr><td>5</td><td>Regression test: <code>anthropic/*</code> wildcard grants/denies access correctly after reload</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/tests/proxy_unit_tests/test_auth_checks.py" target="_blank" rel="noopener noreferrer"><code>test_auth_checks.py</code></a></td></tr></tbody></table>
<hr>]]></content:encoded>
            <category>incident-report</category>
            <category>proxy</category>
            <category>auth</category>
            <category>model-access</category>
        </item>
        <item>
            <title><![CDATA[Incident Report: SERVER_ROOT_PATH regression broke UI routing]]></title>
            <link>https://docs.litellm.ai/blog/server-root-path-incident</link>
            <guid>https://docs.litellm.ai/blog/server-root-path-incident</guid>
            <pubDate>Sat, 21 Feb 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Date: January 22, 2026]]></description>
            <content:encoded><![CDATA[<p><strong>Date:</strong> January 22, 2026
<strong>Duration:</strong> ~4 days (until fix merged January 26, 2026)
<strong>Severity:</strong> High
<strong>Status:</strong> Resolved</p>
<blockquote>
<p><strong>Note:</strong> This fix is available starting from LiteLLM <code>v1.81.3.rc.6</code> or higher.</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="https://docs.litellm.ai/blog/server-root-path-incident#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
<p>A PR (<a href="https://github.com/BerriAI/litellm/pull/19467" target="_blank" rel="noopener noreferrer"><code>#19467</code></a>) accidentally removed the <code>root_path=server_root_path</code> parameter from the FastAPI app initialization in <code>proxy_server.py</code>. This caused the proxy to ignore the <code>SERVER_ROOT_PATH</code> environment variable when serving the UI. Users who deploy LiteLLM behind a reverse proxy with a path prefix (e.g., <code>/api/v1</code> or <code>/llmproxy</code>) found that all UI pages returned 404 Not Found.</p>
<ul>
<li><strong>LLM API calls:</strong> No impact. API routing was unaffected.</li>
<li><strong>UI pages:</strong> All UI pages returned 404 for deployments using <code>SERVER_ROOT_PATH</code>.</li>
<li><strong>Swagger/OpenAPI docs:</strong> Broken when accessed through the configured root path.</li>
</ul>
<!-- -->
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="background">Background<a href="https://docs.litellm.ai/blog/server-root-path-incident#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2>
<p>Many LiteLLM deployments run behind a reverse proxy (e.g., Nginx, Traefik, AWS ALB) that routes traffic to LiteLLM under a path prefix. FastAPI's <code>root_path</code> parameter tells the application about this prefix so it can correctly serve static files, generate URLs, and handle routing.</p>
<!-- -->
<p>The <code>root_path</code> parameter was present in <code>proxy_server.py</code> since early versions of LiteLLM. It was removed as a side effect of PR <a href="https://github.com/BerriAI/litellm/pull/19467" target="_blank" rel="noopener noreferrer">#19467</a>, which was intended to fix a different UI 404 issue.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="root-cause">Root cause<a href="https://docs.litellm.ai/blog/server-root-path-incident#root-cause" class="hash-link" aria-label="Direct link to Root cause" title="Direct link to Root cause">​</a></h2>
<p>PR <a href="https://github.com/BerriAI/litellm/pull/19467" target="_blank" rel="noopener noreferrer">#19467</a> (<code>73d49f8</code>) removed the <code>root_path=server_root_path</code> line from the <code>FastAPI()</code> constructor in <code>proxy_server.py</code>:</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff 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"> app = FastAPI(</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">     docs_url=_get_docs_url(),</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">     redoc_url=_get_redoc_url(),</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">     title=_title,</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">     description=_description,</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">     version=version,</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">-    root_path=server_root_path,</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">     lifespan=proxy_startup_event,</span><br></span><span class="token-line" style="color:#000000"><span class="token plain"> )</span><br></span></code></pre></div></div>
<p>Without <code>root_path</code>, FastAPI treated all requests as if the application was mounted at <code>/</code>, causing path mismatches for any deployment using <code>SERVER_ROOT_PATH</code>.</p>
<p>The regression went undetected because:</p>
<ol>
<li><strong>No automated test</strong> verified that <code>root_path</code> was set on the FastAPI app.</li>
<li><strong>No manual test procedure</strong> existed for <code>SERVER_ROOT_PATH</code> functionality.</li>
<li><strong>Default deployments</strong> (without <code>SERVER_ROOT_PATH</code>) were unaffected, so most CI tests passed.</li>
</ol>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="remediation">Remediation<a href="https://docs.litellm.ai/blog/server-root-path-incident#remediation" class="hash-link" aria-label="Direct link to Remediation" title="Direct link to Remediation">​</a></h2>
<table><thead><tr><th>#</th><th>Action</th><th>Status</th><th>Code</th></tr></thead><tbody><tr><td>1</td><td>Restore <code>root_path=server_root_path</code> in FastAPI app initialization</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/pull/19790" target="_blank" rel="noopener noreferrer"><code>#19790</code></a> (<code>5426b3c</code>)</td></tr><tr><td>2</td><td>Add unit tests for <code>get_server_root_path()</code> and FastAPI app initialization</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/tests/proxy_unit_tests/test_server_root_path.py" target="_blank" rel="noopener noreferrer"><code>test_server_root_path.py</code></a></td></tr><tr><td>3</td><td>Add CI workflow that builds Docker image and tests UI routing with <code>SERVER_ROOT_PATH</code> on every PR</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/.github/workflows/test_server_root_path.yml" target="_blank" rel="noopener noreferrer"><code>test_server_root_path.yml</code></a></td></tr><tr><td>4</td><td>Document manual test procedure for <code>SERVER_ROOT_PATH</code></td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/discussions/8495" target="_blank" rel="noopener noreferrer">Discussion #8495</a></td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ci-workflow-details">CI workflow details<a href="https://docs.litellm.ai/blog/server-root-path-incident#ci-workflow-details" class="hash-link" aria-label="Direct link to CI workflow details" title="Direct link to CI workflow details">​</a></h2>
<p>The new <a href="https://github.com/BerriAI/litellm/blob/main/.github/workflows/test_server_root_path.yml" target="_blank" rel="noopener noreferrer"><code>test_server_root_path.yml</code></a> workflow runs on every PR against <code>main</code>. It:</p>
<ol>
<li>Builds the LiteLLM Docker image</li>
<li>Starts a container with <code>SERVER_ROOT_PATH</code> set (tests both <code>/api/v1</code> and <code>/llmproxy</code>)</li>
<li>Verifies the UI returns valid HTML at <code>{ROOT_PATH}/ui/</code></li>
<li>Fails the workflow if the UI is unreachable</li>
</ol>
<!-- -->
<p>This prevents future regressions where changes to <code>proxy_server.py</code> accidentally break <code>SERVER_ROOT_PATH</code> support.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="timeline">Timeline<a href="https://docs.litellm.ai/blog/server-root-path-incident#timeline" class="hash-link" aria-label="Direct link to Timeline" title="Direct link to Timeline">​</a></h2>
<table><thead><tr><th>Time (UTC)</th><th>Event</th></tr></thead><tbody><tr><td>Jan 22, 2026 04:20</td><td>PR <a href="https://github.com/BerriAI/litellm/pull/19467" target="_blank" rel="noopener noreferrer">#19467</a> merged, removing <code>root_path=server_root_path</code></td></tr><tr><td>Jan 22–26</td><td>Users on nightly builds report UI 404 errors when using <code>SERVER_ROOT_PATH</code></td></tr><tr><td>Jan 26, 2026 17:48</td><td>Fix PR <a href="https://github.com/BerriAI/litellm/pull/19790" target="_blank" rel="noopener noreferrer">#19790</a> merged, restoring <code>root_path=server_root_path</code></td></tr><tr><td>Feb 18, 2026</td><td>CI workflow <a href="https://github.com/BerriAI/litellm/blob/main/.github/workflows/test_server_root_path.yml" target="_blank" rel="noopener noreferrer"><code>test_server_root_path.yml</code></a> added to run on every PR</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="resolution-steps-for-users">Resolution steps for users<a href="https://docs.litellm.ai/blog/server-root-path-incident#resolution-steps-for-users" class="hash-link" aria-label="Direct link to Resolution steps for users" title="Direct link to Resolution steps for users">​</a></h2>
<p>For users still experiencing issues, update to the latest LiteLLM version:</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">pip install --upgrade litellm</span><br></span></code></pre></div></div>
<p>Verify your <code>SERVER_ROOT_PATH</code> is correctly set:</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"># In your environment or docker-compose.yml</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">SERVER_ROOT_PATH="/your-prefix"</span><br></span></code></pre></div></div>
<p>Then confirm the UI is accessible at <code>http://your-host:4000/your-prefix/ui/</code>.</p>]]></content:encoded>
            <category>incident-report</category>
            <category>ui</category>
            <category>stability</category>
        </item>
        <item>
            <title><![CDATA[DAY 0 Support: Gemini 3.1 Pro on LiteLLM]]></title>
            <link>https://docs.litellm.ai/blog/gemini_3_1_pro</link>
            <guid>https://docs.litellm.ai/blog/gemini_3_1_pro</guid>
            <pubDate>Thu, 19 Feb 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Guide to using Gemini 3.1 Pro on LiteLLM Proxy and SDK with day 0 support.]]></description>
            <content:encoded><![CDATA[<p>LiteLLM now supports <code>gemini-3.1-pro-preview</code> and all the new API changes along with it.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="deploy-this-version">Deploy this version<a href="https://docs.litellm.ai/blog/gemini_3_1_pro#deploy-this-version" class="hash-link" aria-label="Direct link to Deploy this version" title="Direct link to Deploy this version">​</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">Docker</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Pip</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-showLineNumbers language-showlinenumbers codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">docker run litellm</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-showlinenumbers 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 \</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">-e STORE_MODEL_IN_DB=True \</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">ghcr.io/berriai/litellm:main-v1.81.9-stable.gemini.3.1-pro</span><br></span></code></pre></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-showLineNumbers language-showlinenumbers codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">pip install litellm</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-showlinenumbers 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">pip install litellm==v1.81.9-stable.gemini.3.1-pro</span><br></span></code></pre></div></div></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-new">What's New<a href="https://docs.litellm.ai/blog/gemini_3_1_pro#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-new-thinking-levels-thinkinglevel-with-minimal--medium">1. New Thinking Levels: <code>thinkingLevel</code> with MINIMAL &amp; MEDIUM<a href="https://docs.litellm.ai/blog/gemini_3_1_pro#1-new-thinking-levels-thinkinglevel-with-minimal--medium" class="hash-link" aria-label="Direct link to 1-new-thinking-levels-thinkinglevel-with-minimal--medium" title="Direct link to 1-new-thinking-levels-thinkinglevel-with-minimal--medium">​</a></h3>
<p>Gemini 3.1 Pro introduces support for <strong>medium</strong> thinking level</p>
<p>LiteLLM automatically maps the OpenAI <code>reasoning_effort</code> parameter to Gemini's <code>thinkingLevel</code>, so you can use familiar <code>reasoning_effort</code> values (<code>minimal</code>, <code>low</code>, <code>medium</code>, <code>high</code>) without changing your code!</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="supported-endpoints">Supported Endpoints<a href="https://docs.litellm.ai/blog/gemini_3_1_pro#supported-endpoints" class="hash-link" aria-label="Direct link to Supported Endpoints" title="Direct link to Supported Endpoints">​</a></h2>
<p>LiteLLM provides <strong>full end-to-end support</strong> for Gemini 3.1 Pro on:</p>
<ul>
<li>✅ <code>/v1/chat/completions</code> - OpenAI-compatible chat completions endpoint</li>
<li>✅ <code>/v1/responses</code> - OpenAI Responses API endpoint (streaming and non-streaming)</li>
<li>✅ <a href="https://docs.litellm.ai/docs/anthropic_unified"><code>/v1/messages</code></a> - Anthropic-compatible messages endpoint</li>
<li>✅ <code>/v1/generateContent</code> – <a href="https://docs.litellm.ai/docs/generateContent">Google Gemini API</a> compatible endpoint</li>
</ul>
<p>All endpoints support:</p>
<ul>
<li>Streaming and non-streaming responses</li>
<li>Function calling with thought signatures</li>
<li>Multi-turn conversations</li>
<li>All Gemini 3-specific features</li>
<li>Conversion of provider specific thinking related param to thinkingLevel</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="quick-start">Quick Start<a href="https://docs.litellm.ai/blog/gemini_3_1_pro#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start">​</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">SDK</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">PROXY</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><p><strong>Basic Usage with MEDIUM thinking (NEW)</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"></span><span class="token comment" style="color:rgb(0, 128, 0)"># No need to make any changes to your code as we map openai reasoning param to thinkingLevel</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)">"gemini/gemini-3.1-pro-preview"</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)">"Solve this complex math problem: 25 * 4 + 10"</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">    reasoning_effort</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"medium"</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)"># NEW: MEDIUM thinking level</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><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"> gemini</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">3.1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">pro</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"> gemini/gemini</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">3.1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">pro</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">api_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> os.environ/GEMINI_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"> vertex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">gemini</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">3.1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">pro</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"> vertex_ai/gemini</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">3.1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">pro</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">preview</span><br></span></code></pre></div></div><p><strong>2. Start 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">litellm --config /path/to/config.yaml</span><br></span></code></pre></div></div><p><strong>3. Call with MEDIUM thinking</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://localhost:4000/v1/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 &lt;YOUR-LITELLM-KEY&gt;" \</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": "gemini-3.1-pro-preview",</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "messages": [{"role": "user", "content": "Complex reasoning task"}],</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    "reasoning_effort": "medium"</span><br></span><span class="token-line" style="color:#000000"><span class="token plain">  }'</span><br></span></code></pre></div></div></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="reasoning_effort-mapping-for-gemini-3"><code>reasoning_effort</code> Mapping for Gemini 3+<a href="https://docs.litellm.ai/blog/gemini_3_1_pro#reasoning_effort-mapping-for-gemini-3" class="hash-link" aria-label="Direct link to reasoning_effort-mapping-for-gemini-3" title="Direct link to reasoning_effort-mapping-for-gemini-3">​</a></h2>
<table><thead><tr><th>reasoning_effort</th><th>thinking_level</th></tr></thead><tbody><tr><td><code>minimal</code></td><td><code>minimal</code></td></tr><tr><td><code>low</code></td><td><code>low</code></td></tr><tr><td><code>medium</code></td><td><code>medium</code></td></tr><tr><td><code>high</code></td><td><code>high</code></td></tr><tr><td><code>disable</code></td><td><code>minimal</code></td></tr><tr><td><code>none</code></td><td><code>minimal</code></td></tr></tbody></table>]]></content:encoded>
            <category>gemini</category>
            <category>day 0 support</category>
            <category>llms</category>
        </item>
        <item>
            <title><![CDATA[Incident Report: vLLM Embeddings Broken by encoding_format Parameter]]></title>
            <link>https://docs.litellm.ai/blog/vllm-embeddings-incident</link>
            <guid>https://docs.litellm.ai/blog/vllm-embeddings-incident</guid>
            <pubDate>Wed, 18 Feb 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Date: Feb 16, 2026]]></description>
            <content:encoded><![CDATA[<p><strong>Date:</strong> Feb 16, 2026
<strong>Duration:</strong> ~3 hours
<strong>Severity:</strong> High (for vLLM embedding users)
<strong>Status:</strong> Resolved</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="https://docs.litellm.ai/blog/vllm-embeddings-incident#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
<p>A commit (<a href="https://github.com/BerriAI/litellm/commit/dbcae4aca5836770d0e9cd43abab0333c3d61ab2" target="_blank" rel="noopener noreferrer"><code>dbcae4a</code></a>) intended to fix OpenAI SDK behavior broke vLLM embeddings by explicitly passing <code>encoding_format=None</code> in API requests. vLLM rejects this with error: <code>"unknown variant \</code>`, expected float or base64"`.</p>
<ul>
<li><strong>vLLM embedding calls:</strong> Complete failure - all requests rejected</li>
<li><strong>Other providers:</strong> No impact - OpenAI and other providers functioned normally</li>
<li><strong>Other vLLM functionality:</strong> No impact - only embeddings were affected</li>
</ul>
<!-- -->
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="background">Background<a href="https://docs.litellm.ai/blog/vllm-embeddings-incident#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background">​</a></h2>
<p>The <code>encoding_format</code> parameter for embeddings specifies whether vectors should be returned as <code>float</code> arrays or <code>base64</code> encoded strings. Different providers have different expectations:</p>
<ul>
<li><strong>OpenAI SDK:</strong> If <code>encoding_format</code> is omitted, the SDK adds a default value of <code>"float"</code></li>
<li><strong>vLLM:</strong> Strictly validates <code>encoding_format</code> - only accepts <code>"float"</code>, <code>"base64"</code>, or complete omission. Rejects <code>None</code> or empty string values.</li>
</ul>
<!-- -->
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="root-cause">Root cause<a href="https://docs.litellm.ai/blog/vllm-embeddings-incident#root-cause" class="hash-link" aria-label="Direct link to Root cause" title="Direct link to Root cause">​</a></h2>
<p>A well-intentioned fix for OpenAI SDK behavior inadvertently broke vLLM embeddings:</p>
<p><strong>The Breaking Change (<a href="https://github.com/BerriAI/litellm/commit/dbcae4aca5836770d0e9cd43abab0333c3d61ab2" target="_blank" rel="noopener noreferrer"><code>dbcae4a</code></a>):</strong></p>
<p>In <code>litellm/main.py</code>, the code was changed to explicitly set <code>encoding_format=None</code> instead of omitting it:</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 comment" style="color:rgb(0, 128, 0)"># Added in dbcae4a</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)">if</span><span class="token plain"> encoding_format </span><span class="token keyword" style="color:rgb(0, 0, 255)">is</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> </span><span class="token boolean">None</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">    optional_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"encoding_format"</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"> encoding_format</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)">else</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)"># Omitting causes openai sdk to add default value of "float"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">    optional_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"encoding_format"</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 boolean">None</span><br></span></code></pre></div></div>
<p>This fix worked correctly for OpenAI - explicitly passing <code>None</code> prevented the SDK from adding its default value. However, vLLM's strict parameter validation rejected <code>None</code> values, causing all embedding requests to fail.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-fix">The Fix<a href="https://docs.litellm.ai/blog/vllm-embeddings-incident#the-fix" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix">​</a></h2>
<p>Fix deployed (<a href="https://github.com/BerriAI/litellm/commit/55348dd9c51b5b028f676d25ad023b8f052fc071" target="_blank" rel="noopener noreferrer"><code>55348dd</code></a>). The solution filters out <code>None</code> and empty string values from <code>optional_params</code> before sending requests to OpenAI-like providers (including vLLM).</p>
<p><strong>In <code>litellm/llms/openai_like/embedding/handler.py</code>:</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 comment" style="color:rgb(0, 128, 0)"># Before (broken)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">data </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 string" style="color:rgb(163, 21, 21)">"model"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> model</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)">"input"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">input</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">optional_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" 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)"># After (fixed)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#000000"><span class="token plain">filtered_optional_params </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">k</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> v </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> k</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> v </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> optional_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">items</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 keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> v </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token boolean">None</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)">''</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">data </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 string" style="color:rgb(163, 21, 21)">"model"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> model</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)">"input"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">input</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">filtered_optional_params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><br></span></code></pre></div></div>
<p>This ensures:</p>
<ul>
<li>Valid values (<code>"float"</code>, <code>"base64"</code>) are preserved and sent</li>
<li><code>None</code> and empty string values are filtered out (parameter omitted entirely)</li>
<li>OpenAI SDK no longer adds defaults because liteLLM handles the parameter upstream</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="remediation">Remediation<a href="https://docs.litellm.ai/blog/vllm-embeddings-incident#remediation" class="hash-link" aria-label="Direct link to Remediation" title="Direct link to Remediation">​</a></h2>
<table><thead><tr><th>#</th><th>Action</th><th>Status</th><th>Code</th></tr></thead><tbody><tr><td>1</td><td>Filter <code>None</code> and empty string values in OpenAI-like embedding handler</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/litellm/llms/openai_like/embedding/handler.py#L108" target="_blank" rel="noopener noreferrer"><code>handler.py#L108</code></a></td></tr><tr><td>2</td><td>Unit tests for parameter filtering (None, empty string, valid values)</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/tests/test_litellm/llms/openai_like/embedding/test_openai_like_embedding.py" target="_blank" rel="noopener noreferrer"><code>test_openai_like_embedding.py</code></a></td></tr><tr><td>3</td><td>Transformation tests for hosted_vllm embedding config</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/tests/test_litellm/llms/hosted_vllm/embedding/test_hosted_vllm_embedding_transformation.py" target="_blank" rel="noopener noreferrer"><code>test_hosted_vllm_embedding_transformation.py</code></a></td></tr><tr><td>4</td><td>E2E tests with actual vLLM endpoint</td><td>✅ Done</td><td><a href="https://github.com/BerriAI/litellm/blob/main/tests/test_litellm/llms/hosted_vllm/embedding/test_hosted_vllm_embedding_e2e.py" target="_blank" rel="noopener noreferrer"><code>test_hosted_vllm_embedding_e2e.py</code></a></td></tr><tr><td>5</td><td>Validate JSON payload structure matches vLLM expectations</td><td>✅ Done</td><td>Tests verify exact JSON sent to endpoint</td></tr></tbody></table>
<hr>]]></content:encoded>
            <category>incident-report</category>
            <category>embeddings</category>
            <category>vllm</category>
        </item>
        <item>
            <title><![CDATA[Day 0 Support: Claude Sonnet 4.6]]></title>
            <link>https://docs.litellm.ai/blog/claude_sonnet_4_6</link>
            <guid>https://docs.litellm.ai/blog/claude_sonnet_4_6</guid>
            <pubDate>Tue, 17 Feb 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[Day 0 support for Claude Sonnet 4.6 on LiteLLM AI Gateway - use across Anthropic, Azure, Vertex AI, and Bedrock.]]></description>
            <content:encoded><![CDATA[<p>LiteLLM now supports Claude Sonnet 4.6 on Day 0. Use it across Anthropic, Azure, Vertex AI, and Bedrock through the LiteLLM AI Gateway.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="docker-image">Docker Image<a href="https://docs.litellm.ai/blog/claude_sonnet_4_6#docker-image" class="hash-link" aria-label="Direct link to Docker Image" title="Direct link to Docker Image">​</a></h2>
<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.81.3-stable.sonnet-4-6</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="usage---anthropic">Usage - Anthropic<a href="https://docs.litellm.ai/blog/claude_sonnet_4_6#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><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">LiteLLM SDK</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 plain">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">6</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)">6</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.81.3-stable.sonnet-4-6 \</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-sonnet-4-6",</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 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)">"anthropic/claude-sonnet-4-6"</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)">"what llm are you"</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 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="usage---azure">Usage - Azure<a href="https://docs.litellm.ai/blog/claude_sonnet_4_6#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><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">LiteLLM SDK</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 plain">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">6</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 plain">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">6</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.81.3-stable.sonnet-4-6 \</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-sonnet-4-6",</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 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)">"azure_ai/claude-sonnet-4-6"</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-azure-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">    api_base</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"https://&lt;resource&gt;.services.ai.azure.com"</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)">"what llm are you"</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 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="usage---vertex-ai">Usage - Vertex AI<a href="https://docs.litellm.ai/blog/claude_sonnet_4_6#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><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">LiteLLM SDK</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 plain">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">6</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 number" style="color:rgb(9, 134, 88)">6</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"> us</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">east5</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.81.3-stable.sonnet-4-6 \</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-sonnet-4-6",</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 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)">"vertex_ai/claude-sonnet-4-6"</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">    vertex_project</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"your-project-id"</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">    vertex_location</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"us-east5"</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)">"what llm are you"</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 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="usage---bedrock">Usage - Bedrock<a href="https://docs.litellm.ai/blog/claude_sonnet_4_6#usage---bedrock" class="hash-link" aria-label="Direct link to Usage - Bedrock" title="Direct link to Usage - Bedrock">​</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 SDK</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 plain">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token number" style="color:rgb(9, 134, 88)">6</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 plain">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">6</span><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain">v1</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.81.3-stable.sonnet-4-6 \</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-sonnet-4-6",</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 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)">"bedrock/anthropic.claude-sonnet-4-6-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">    aws_access_key_id</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"your-access-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">    aws_secret_access_key</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"your-secret-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">    aws_region_name</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"us-east-1"</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)">"what llm are you"</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 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>]]></content:encoded>
            <category>anthropic</category>
            <category>claude</category>
            <category>sonnet 4.6</category>
        </item>
    </channel>
</rss>