<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Andrew S. Bandy</title>
    <description>The latest articles on DEV Community by Andrew S. Bandy (@s-bandy).</description>
    <link>https://dev.to/s-bandy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3840236%2F2ce3fcf3-2b6f-416f-82bd-466d38f7e144.jpg</url>
      <title>DEV Community: Andrew S. Bandy</title>
      <link>https://dev.to/s-bandy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/s-bandy"/>
    <language>en</language>
    <item>
      <title>Best LiteLLM Alternative in 2026</title>
      <dc:creator>Andrew S. Bandy</dc:creator>
      <pubDate>Fri, 25 Sep 2026 16:08:50 +0000</pubDate>
      <link>https://dev.to/s-bandy/best-litellm-alternative-in-2026-k5i</link>
      <guid>https://dev.to/s-bandy/best-litellm-alternative-in-2026-k5i</guid>
      <description>&lt;p&gt;It was a Tuesday in March when my Slack lit up.&lt;/p&gt;

&lt;p&gt;A friend who runs platform engineering at a mid-sized fintech sent me one line: &lt;em&gt;"Did you pin LiteLLM?"&lt;/em&gt; He hadn't. On &lt;strong&gt;March 24, 2026&lt;/strong&gt;, two LiteLLM releases on PyPI (&lt;strong&gt;1.82.7 and 1.82.8&lt;/strong&gt;) shipped with a credential-stealing payload. It harvested environment variables, SSH keys, cloud credentials, Kubernetes tokens, and database passwords, then sent them to an attacker-controlled domain. The packages had been uploaded directly to PyPI, bypassing the project's CI. &lt;a href="https://docs.litellm.ai/blog/security-update-march-2026" rel="noopener noreferrer"&gt;LiteLLM's own post-mortem&lt;/a&gt; covers the details.&lt;/p&gt;

&lt;p&gt;PyPI quarantined the versions fast. That wasn't the worrying part. The worrying part was &lt;em&gt;where&lt;/em&gt; LiteLLM sits in most stacks: in front of every LLM provider key your company owns. An AI gateway is the one box that holds the keys to everything.&lt;/p&gt;

&lt;p&gt;After that week, many teams started searching for a &lt;strong&gt;LiteLLM alternative&lt;/strong&gt;. This post is the guide I wish my friend had then.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I'm the founder of &lt;a href="https://github.com/ENTERPILOT/GoModel" rel="noopener noreferrer"&gt;GoModel&lt;/a&gt;, one of the tools below. I'll tell you where it wins and where another option is the better choice. If I'm not honest about that, this post is just an ad.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you need...&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A self-hosted, lightweight, drop-in LiteLLM replacement&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GoModel&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An LLMOps platform with evals, A/B tests and fine-tuning loops&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;TensorZero&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No infrastructure at all, and your data can go to a third-party cloud&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;OpenRouter&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What people actually use LiteLLM for
&lt;/h2&gt;

&lt;p&gt;Before you swap anything, look at what LiteLLM does for you today. In almost every team I've talked to, it comes down to five jobs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One API for many providers.&lt;/strong&gt; Your app speaks OpenAI format, and the gateway translates for Anthropic, Gemini, Bedrock, and the rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key management.&lt;/strong&gt; Provider keys live in one place, not in every service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost tracking and budgets.&lt;/strong&gt; Who spent $4,000 on GPT calls last weekend?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallbacks and routing.&lt;/strong&gt; When a provider has an outage, your product keeps working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability.&lt;/strong&gt; Logs, metrics, traces.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A good LiteLLM alternative has to do all five. Ideally it should also be &lt;em&gt;harder to compromise&lt;/em&gt;, and it shouldn't turn into another thing you have to babysit.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. GoModel: the best LiteLLM alternative for self-hosting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/ENTERPILOT/GoModel" rel="noopener noreferrer"&gt;github.com/ENTERPILOT/GoModel&lt;/a&gt; · &lt;strong&gt;License:&lt;/strong&gt; MIT · &lt;strong&gt;Language:&lt;/strong&gt; Go&lt;/p&gt;

&lt;p&gt;I started building GoModel in late 2024 because I kept running into the same problems with LiteLLM in enterprise environments: a large Python dependency tree, heavy containers, and a lot of moving parts sitting in front of the most sensitive credentials in the company. March 2026 made those concerns very concrete.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it's my top pick
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;It ships as a single static Go binary.&lt;/strong&gt; That's the main point, not a footnote. There's no &lt;code&gt;pip install&lt;/code&gt; pulling in hundreds of transitive packages at deploy time, and no &lt;code&gt;.pth&lt;/code&gt; file that can execute on interpreter start. You get one binary, a small (~17 MB) Docker image, and a dependency graph you can audit in an afternoon. The whole gateway is a smaller attack surface than the payload that hit LiteLLM users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's a real drop-in.&lt;/strong&gt; GoModel exposes &lt;strong&gt;OpenAI-compatible and Anthropic-compatible APIs&lt;/strong&gt;, so your existing SDK code usually only needs a new &lt;code&gt;base_url&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;LOGGING_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-openai-key"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  enterpilot/gomodel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8080/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-gomodel-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello from GoModel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GoModel detects which providers are available from the credentials you supply, so there's no long YAML file before your first request. Add &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; or &lt;code&gt;GEMINI_API_KEY&lt;/code&gt; and those models are available too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Broad provider coverage:&lt;/strong&gt; OpenAI, Anthropic, Google Gemini, Vertex AI, Azure OpenAI, Amazon Bedrock, DeepSeek, Groq, Fireworks, xAI, Alibaba Cloud, MiniMax, Oracle, OpenRouter, and self-hosted models through &lt;strong&gt;Ollama&lt;/strong&gt; and &lt;strong&gt;vLLM&lt;/strong&gt;, plus any OpenAI-compatible endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It covers the five jobs above:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost and token tracking, with budget controls&lt;/li&gt;
&lt;li&gt;Exact and semantic caching&lt;/li&gt;
&lt;li&gt;A guardrails pipeline&lt;/li&gt;
&lt;li&gt;Prometheus metrics and OpenTelemetry (kept in the free MIT core, not paywalled)&lt;/li&gt;
&lt;li&gt;An admin dashboard and REST API&lt;/li&gt;
&lt;li&gt;A provider-native &lt;strong&gt;passthrough&lt;/strong&gt; endpoint (&lt;code&gt;/p/{provider}/...&lt;/code&gt;) for when you need a feature the unified API doesn't expose yet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;It works where cloud gateways can't.&lt;/strong&gt; If you're in banking, healthcare, the public sector, or anywhere with an air-gapped network or strict EU data-residency rules, you need prompts and keys to stay on your own infrastructure. GoModel was designed for that from the start.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where GoModel is &lt;em&gt;not&lt;/em&gt; the right choice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If you want a full &lt;strong&gt;experimentation and fine-tuning platform&lt;/strong&gt; with built-in evals, see TensorZero below.&lt;/li&gt;
&lt;li&gt;If you don't want to run &lt;em&gt;any&lt;/em&gt; infrastructure, see OpenRouter.&lt;/li&gt;
&lt;li&gt;GoModel is younger than LiteLLM. The core is solid and releases ship frequently, but if you depend on a niche LiteLLM integration, check the provider list first.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. TensorZero: when you want an LLMOps platform, not just a gateway
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/tensorzero/tensorzero" rel="noopener noreferrer"&gt;github.com/tensorzero/tensorzero&lt;/a&gt; · &lt;strong&gt;License:&lt;/strong&gt; Apache 2.0 · &lt;strong&gt;Language:&lt;/strong&gt; Rust&lt;/p&gt;

&lt;p&gt;TensorZero is a strong project, and I recommend it to people regularly. It's built for a different goal than GoModel.&lt;/p&gt;

&lt;p&gt;GoModel sits between your app and your providers. TensorZero aims to &lt;strong&gt;close the loop&lt;/strong&gt;: it stores every inference with the feedback you attach, and then helps you use that data to improve prompts and models. You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A high-performance Rust gateway (they report &lt;strong&gt;&amp;lt;1 ms p99 overhead at 10k+ QPS&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Observability backed by your own database&lt;/li&gt;
&lt;li&gt;Evaluations with heuristics and LLM judges&lt;/li&gt;
&lt;li&gt;Optimization workflows: supervised fine-tuning, RLHF, automated prompt engineering&lt;/li&gt;
&lt;li&gt;Adaptive A/B testing, routing, fallbacks and retries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Choose TensorZero if&lt;/strong&gt; you have an ML team that wants to run structured experiments on prompts and models, and you're willing to adopt its way of doing things. You define "functions" and "variants" in config rather than just pointing your SDK at a new URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Think twice if&lt;/strong&gt; you only need a gateway. Its data and optimization layer is its main value, and it's also more to run and learn. For most teams leaving LiteLLM, a simpler drop-in gets them back to shipping faster.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. OpenRouter: when the cloud is fine
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://openrouter.ai" rel="noopener noreferrer"&gt;openrouter.ai&lt;/a&gt; · Managed SaaS&lt;/p&gt;

&lt;p&gt;Sometimes the honest answer is: &lt;em&gt;don't run a gateway at all.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;OpenRouter gives you one API key and one bill for a very large catalog of models across many providers. There's nothing to deploy, patch, or monitor. For a side project, a hackathon, an early-stage startup, or a team that wants to try twenty models this week, that's great.&lt;/p&gt;

&lt;p&gt;The trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your prompts and responses go through a third party.&lt;/strong&gt; For many companies that's fine. For regulated industries, or anything covered by strict data-residency rules, it often isn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fees.&lt;/strong&gt; OpenRouter charges a fee on credit purchases (around 5.5% at the time of writing). Bring-your-own-key usage is free up to a monthly allowance, with a small fee after that. At low volume this doesn't matter. At scale you'll notice it. &lt;a href="https://openrouter.ai/pricing" rel="noopener noreferrer"&gt;Check their current pricing&lt;/a&gt; before committing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Less control&lt;/strong&gt; over routing logic, caching, and guardrails than a self-hosted gateway gives you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't have to choose one or the other. GoModel supports OpenRouter as an upstream provider, so you can self-host the control plane (keys, budgets, logs, guardrails) and still use OpenRouter's catalog for long-tail models.&lt;/p&gt;




&lt;h2&gt;
  
  
  Side-by-side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;GoModel&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;TensorZero&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;OpenRouter&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;em&gt;LiteLLM (baseline)&lt;/em&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;Managed cloud&lt;/td&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;Go (single binary)&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Proprietary&lt;/td&gt;
&lt;td&gt;MIT core + enterprise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drop-in OpenAI-compatible API&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic-compatible API&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost tracking and budgets&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (billing)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caching (exact + semantic)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Provider-level&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guardrails&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Via functions&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evals / fine-tuning loop&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Air-gapped / on-prem friendly&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supply-chain surface&lt;/td&gt;
&lt;td&gt;Small&lt;/td&gt;
&lt;td&gt;Small&lt;/td&gt;
&lt;td&gt;Vendor's problem&lt;/td&gt;
&lt;td&gt;Large (PyPI tree)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to first request&lt;/td&gt;
&lt;td&gt;~1 min&lt;/td&gt;
&lt;td&gt;~15–30 min&lt;/td&gt;
&lt;td&gt;~1 min&lt;/td&gt;
&lt;td&gt;~5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Setup times are my rough experience, not formal benchmarks. Try them yourself.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to choose (the human version)
&lt;/h2&gt;

&lt;p&gt;Forget feature matrices for a minute and ask three questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Can my prompts leave my network?&lt;/strong&gt;&lt;br&gt;
If not, OpenRouter is out. Look at GoModel or TensorZero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Do I need a gateway or an experimentation platform?&lt;/strong&gt;&lt;br&gt;
If you want your existing code to keep working and your security team to relax, choose GoModel. If you want to run your own fine-tuning and A/B testing loop, choose TensorZero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Who's on call for this at 3 a.m.?&lt;/strong&gt;&lt;br&gt;
This question matters more than any benchmark. A single binary with few dependencies is easier to keep running than a stack with many services. Pick the tool your team can operate calmly, not the one with the longest feature list.&lt;/p&gt;




&lt;h2&gt;
  
  
  Migrating from LiteLLM to GoModel in 10 minutes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run GoModel&lt;/strong&gt; next to LiteLLM using the Docker command above, with the same provider keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set &lt;code&gt;GOMODEL_MASTER_KEY&lt;/code&gt;&lt;/strong&gt; so only your services can call it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Point one non-critical service&lt;/strong&gt; at &lt;code&gt;http://gomodel:8080/v1&lt;/code&gt; instead of your LiteLLM URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare&lt;/strong&gt; responses, latency and cost in the GoModel dashboard for a day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move the rest&lt;/strong&gt; of your services over, then retire LiteLLM and its Python environment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because both expose OpenAI-compatible APIs, the change in most codebases is a single environment variable.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the best LiteLLM alternative in 2026?&lt;/strong&gt;&lt;br&gt;
For self-hosted teams, &lt;strong&gt;GoModel&lt;/strong&gt;: an MIT-licensed Go AI gateway with a single binary, OpenAI- and Anthropic-compatible APIs, cost tracking, caching, and guardrails. For an LLMOps platform with evals and fine-tuning, &lt;strong&gt;TensorZero&lt;/strong&gt;. For a fully managed option, &lt;strong&gt;OpenRouter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is LiteLLM still safe to use?&lt;/strong&gt;&lt;br&gt;
The compromised versions (1.82.7 and 1.82.8) were removed and the LiteLLM team published a response. If you stay, pin exact versions, verify hashes, and scan your dependencies. Many teams moved anyway because they wanted a smaller dependency surface in front of their provider keys.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there an open-source LiteLLM alternative written in Go?&lt;/strong&gt;&lt;br&gt;
Yes. &lt;a href="https://github.com/ENTERPILOT/GoModel" rel="noopener noreferrer"&gt;GoModel&lt;/a&gt; is MIT-licensed, written in Go, and ships as a single binary and a small Docker image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I self-host an OpenRouter alternative?&lt;/strong&gt;&lt;br&gt;
Yes. GoModel and TensorZero are both self-hostable. GoModel can also use OpenRouter as one of its upstream providers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does GoModel support local models?&lt;/strong&gt;&lt;br&gt;
Yes, through Ollama, vLLM, or any OpenAI-compatible server.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;The LiteLLM incident wasn't really about one project. It showed how much trust we put in the component that holds all our AI keys, often without thinking about it much.&lt;/p&gt;

&lt;p&gt;Whatever you choose, choose on purpose. Know what's in your dependency tree, where your prompts go, and who can fix it when something breaks.&lt;/p&gt;

&lt;p&gt;If GoModel sounds like a fit, &lt;a href="https://github.com/ENTERPILOT/GoModel" rel="noopener noreferrer"&gt;star it on GitHub&lt;/a&gt;, try the one-line Docker command, and open an issue if something's missing. I read every one.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Found a mistake in this comparison? Tell me in the comments and I'll fix it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>go</category>
      <category>opensource</category>
    </item>
    <item>
      <title>LiteLLM Alternative: The Best Options for 2026</title>
      <dc:creator>Andrew S. Bandy</dc:creator>
      <pubDate>Tue, 22 Sep 2026 07:54:49 +0000</pubDate>
      <link>https://dev.to/s-bandy/litellm-alternative-the-best-options-for-2026-36f4</link>
      <guid>https://dev.to/s-bandy/litellm-alternative-the-best-options-for-2026-36f4</guid>
      <description>&lt;h2&gt;
  
  
  Quick answer: what is the best LiteLLM alternative?
&lt;/h2&gt;

&lt;p&gt;The best LiteLLM alternative for most teams is &lt;strong&gt;&lt;a href="https://github.com/ENTERPILOT/GoModel/" rel="noopener noreferrer"&gt;GoModel&lt;/a&gt;&lt;/strong&gt;, an MIT-licensed, open-source AI gateway written in Go. GoModel ships as a single binary, exposes an OpenAI-compatible API, and includes caching, guardrails, budgets, and observability. Other strong options are Bifrost for raw performance, TensorZero for LLM optimization, and Portkey for a managed enterprise platform.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;LiteLLM alternative&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;GoModel&lt;/td&gt;
&lt;td&gt;Secure, self-hosted, auditable gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Bifrost&lt;/td&gt;
&lt;td&gt;Maximum throughput&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;TensorZero&lt;/td&gt;
&lt;td&gt;Prompt and model optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Portkey&lt;/td&gt;
&lt;td&gt;Managed enterprise platform&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What is a LiteLLM alternative?
&lt;/h2&gt;

&lt;p&gt;A LiteLLM alternative is any AI gateway or LLM proxy that replaces LiteLLM's core job: giving applications one unified API across multiple LLM providers, with routing, fallbacks, cost controls, and logging. Most teams search for a LiteLLM alternative when they need better security, higher performance, or easier deployment in regulated environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why teams are looking for a LiteLLM alternative in 2026
&lt;/h2&gt;

&lt;p&gt;LiteLLM is a widely used Python library that acts as a unified proxy for over 100 LLM providers. Its popularity also made it a target.&lt;/p&gt;

&lt;p&gt;On March 24, 2026, LiteLLM versions 1.82.7 and 1.82.8 on PyPI were published with credential-stealing malware, attributed to the threat actor TeamPCP. The payload hid in a &lt;code&gt;.pth&lt;/code&gt; file that Python executes automatically at startup, so the code ran without anyone importing LiteLLM. It harvested SSH keys, cloud credentials, Kubernetes tokens, and environment variables, including API keys.&lt;/p&gt;

&lt;p&gt;The maintainers responded quickly, and users running the official Docker proxy image were not affected, since that image pins package versions. Still, the incident made a structural risk visible: an AI gateway holds API keys for your whole AI stack, and a Python package with a deep dependency tree is a large attack surface for that job.&lt;/p&gt;

&lt;p&gt;The other common reasons teams look for a LiteLLM alternative are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance.&lt;/strong&gt; A Python proxy usually needs more replicas and tuning under heavy load than a compiled Go or Rust gateway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment constraints.&lt;/strong&gt; Air-gapped and on-premises environments favor self-contained binaries over runtime package installs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade predictability.&lt;/strong&gt; LiteLLM's fast release pace can make upgrades harder to manage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to choose a LiteLLM alternative
&lt;/h2&gt;

&lt;p&gt;A good LiteLLM alternative should offer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;An OpenAI-compatible API&lt;/strong&gt;, so migration is a base-URL change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A minimal supply-chain footprint&lt;/strong&gt;, ideally a compiled binary with pinned dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance features&lt;/strong&gt;: virtual keys, budgets, rate limits, and fallbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching&lt;/strong&gt;, both exact and semantic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-standard observability&lt;/strong&gt; through OpenTelemetry and Prometheus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-hosting&lt;/strong&gt;, including on-prem and air-gapped support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparent licensing&lt;/strong&gt;, with enterprise features clearly separated from the open core.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. GoModel: the best overall LiteLLM alternative
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GoModel is an open-source LiteLLM alternative written in Go, designed for secure, self-hosted AI gateway deployments.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language:&lt;/strong&gt; Go&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT (open core)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; single binary, Docker image of about 17 MB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API:&lt;/strong&gt; OpenAI-compatible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://gomodel.enterpilot.io" rel="noopener noreferrer"&gt;gomodel.enterpilot.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why GoModel is the top LiteLLM alternative
&lt;/h3&gt;

&lt;p&gt;GoModel was built specifically to address the limitations of Python-based gateways. It compiles to one static binary with no interpreter, no &lt;code&gt;pip install&lt;/code&gt; at deploy time, and no &lt;code&gt;.pth&lt;/code&gt;-style auto-execution path. Security teams can checksum it, scan it, and move it into a locked-down network as a single artifact.&lt;/p&gt;

&lt;p&gt;GoModel covers the features LiteLLM proxy users rely on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exact and semantic caching&lt;/li&gt;
&lt;li&gt;Budget controls and usage tracking&lt;/li&gt;
&lt;li&gt;A guardrails pipeline for prompts and responses&lt;/li&gt;
&lt;li&gt;Prometheus metrics and OpenTelemetry, both free in the MIT core&lt;/li&gt;
&lt;li&gt;An admin dashboard&lt;/li&gt;
&lt;li&gt;Per-provider-family translators that respect each provider's API differences&lt;/li&gt;
&lt;li&gt;A passthrough endpoint (&lt;code&gt;/p/{provider}/...&lt;/code&gt;) for native provider features&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GoModel enterprise and cloud
&lt;/h3&gt;

&lt;p&gt;GoModel's enterprise module adds SSO, RBAC, audit logs, and multi-tenancy. Unlike many open-core gateways, that code lives in a visible &lt;code&gt;/ee&lt;/code&gt; folder in the public repository, so buyers can review it. GoModel Cloud offers a hosted bring-your-own-key tier for teams that don't want to run infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who should choose GoModel
&lt;/h3&gt;

&lt;p&gt;Choose GoModel as your LiteLLM alternative if you left LiteLLM over security concerns, work in a regulated industry, need on-prem or air-gapped deployment, or want an AI gateway you can fully audit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; GoModel is younger than LiteLLM, so confirm your specific providers are supported before migrating.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Bifrost: the fastest LiteLLM alternative
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bifrost is a Go-based LiteLLM alternative from Maxim AI focused on high throughput.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language:&lt;/strong&gt; Go&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; Apache 2.0 (open core)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; binary, Docker, or npx&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bifrost unifies 20+ providers behind one OpenAI-compatible API, with automatic failover, load balancing, and semantic caching. In its own sustained 5,000 RPS benchmarks, Bifrost added about 11 µs of overhead per request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs:&lt;/strong&gt; advanced capabilities such as adaptive load balancing, clustering, guardrails, and the MCP gateway are enterprise features, and the enterprise code is developed privately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose Bifrost if&lt;/strong&gt; throughput is your top priority and you accept a closed enterprise tier.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. TensorZero: the best LiteLLM alternative for optimization
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TensorZero is a Rust-based LiteLLM alternative that combines a gateway with an LLM optimization framework.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language:&lt;/strong&gt; Rust&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; open source&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; single Docker container&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TensorZero combines an LLM gateway with observability, optimization, evaluation, and experimentation. The project reports under 1 ms of p99 latency overhead at 10k QPS. It uses metrics and human feedback to optimize prompts, models, and inference strategies, and includes A/B testing, routing, fallbacks, and retries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; TensorZero is closer to a framework than a drop-in proxy, so full value requires adopting its workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose TensorZero if&lt;/strong&gt; improving model quality through experiments matters more than centralized governance.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Portkey: the managed enterprise LiteLLM alternative
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Portkey is a managed AI gateway, now owned by Palo Alto Networks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Portkey offers routing, observability, guardrails, and cost tracking as a managed platform. Palo Alto Networks completed its acquisition of Portkey and plans to make it the core AI gateway of its Prisma AIRS security platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; Portkey's roadmap is now tied to a large security vendor, which may affect pricing, packaging, and neutrality. It is also a weaker fit for air-gapped deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose Portkey if&lt;/strong&gt; you want a fully managed gateway and already use Palo Alto Networks tooling.&lt;/p&gt;




&lt;h2&gt;
  
  
  LiteLLM alternative comparison table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;GoModel&lt;/th&gt;
&lt;th&gt;Bifrost&lt;/th&gt;
&lt;th&gt;TensorZero&lt;/th&gt;
&lt;th&gt;Portkey&lt;/th&gt;
&lt;th&gt;LiteLLM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;Managed + OSS gateway&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single binary&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Container&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI-compatible API&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Semantic caching&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guardrails&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Via integrations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public enterprise code&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Air-gapped fit&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Possible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supply-chain footprint&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;Small&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Large&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How to migrate to a LiteLLM alternative
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you use the LiteLLM proxy:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deploy your LiteLLM alternative alongside LiteLLM.&lt;/li&gt;
&lt;li&gt;Map your &lt;code&gt;config.yaml&lt;/code&gt; model list, fallbacks, and virtual keys to the new gateway.&lt;/li&gt;
&lt;li&gt;Point one low-risk service at the new base URL.&lt;/li&gt;
&lt;li&gt;Compare latency, errors, and cost.&lt;/li&gt;
&lt;li&gt;Move the remaining services and retire LiteLLM.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;If you use the LiteLLM Python library:&lt;/strong&gt; replace &lt;code&gt;litellm.completion()&lt;/code&gt; calls with a standard OpenAI client pointed at your new gateway. This also removes the gateway from your application's dependency tree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security note:&lt;/strong&gt; rotate any provider keys that were present on machines that installed LiteLLM 1.82.7 or 1.82.8.&lt;/p&gt;




&lt;h2&gt;
  
  
  LiteLLM alternative FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the best LiteLLM alternative?
&lt;/h3&gt;

&lt;p&gt;GoModel is the best LiteLLM alternative for most teams. It is MIT-licensed, OpenAI-compatible, ships as a single Go binary, and includes caching, guardrails, budgets, and observability.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the best open-source LiteLLM alternative?
&lt;/h3&gt;

&lt;p&gt;GoModel is the best open-source LiteLLM alternative for self-hosted and regulated environments. Bifrost and TensorZero are also open source.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a LiteLLM alternative written in Go?
&lt;/h3&gt;

&lt;p&gt;Yes. GoModel and Bifrost are both LiteLLM alternatives written in Go that compile to a single binary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which LiteLLM alternative is most secure?
&lt;/h3&gt;

&lt;p&gt;GoModel is designed for the lowest supply-chain risk: one compiled binary, no runtime package installs, and enterprise code that is publicly reviewable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which LiteLLM alternative works in air-gapped environments?
&lt;/h3&gt;

&lt;p&gt;GoModel is built for on-prem and air-gapped deployments because it ships as one self-contained binary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is LiteLLM still safe to use?
&lt;/h3&gt;

&lt;p&gt;The compromised versions were removed and versions 1.82.6 and earlier were not affected. The broader risk of running a large Python dependency tree in the component holding all your API keys remains.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I switch to a LiteLLM alternative without changing code?
&lt;/h3&gt;

&lt;p&gt;If you use the LiteLLM proxy with an OpenAI client, usually yes: you only change the base URL and keys.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try the best LiteLLM alternative:&lt;/strong&gt; get started with GoModel at &lt;a href="https://github.com/ENTERPILOT/GoModel/" rel="noopener noreferrer"&gt;https://github.com/ENTERPILOT/GoModel/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>apigateway</category>
    </item>
    <item>
      <title>Your API Key Can't See Its Own Usage - So We Fixed That in GoModel</title>
      <dc:creator>Andrew S. Bandy</dc:creator>
      <pubDate>Wed, 08 Jul 2026 14:10:18 +0000</pubDate>
      <link>https://dev.to/s-bandy/your-api-key-cant-see-its-own-usage-so-we-fixed-that-in-gomodel-13fd</link>
      <guid>https://dev.to/s-bandy/your-api-key-cant-see-its-own-usage-so-we-fixed-that-in-gomodel-13fd</guid>
      <description>&lt;p&gt;Every AI coding agent, plugin, and status bar eventually wants to answer one small question for its user: &lt;strong&gt;how much have I used, and when do I get cut off?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You'd expect a one-liner for that. &lt;code&gt;GET /v1/usage&lt;/code&gt;, send the same API key you use for inference, get a number back. We went looking for the standard way to do this — across OpenAI, Anthropic, Codex, Claude Code, OpenCode, and every major AI gateway — because we wanted GoModel to follow it.&lt;/p&gt;

&lt;p&gt;Here's the punchline: &lt;strong&gt;there is no standard.&lt;/strong&gt; There isn't even a common convention. What we found instead was a landscape of admin-only reporting APIs, private endpoints reserved for first-party tools, and community plugins literally scraping HTML dashboards with browser cookies.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the big providers give you: nothing (on purpose)
&lt;/h2&gt;

&lt;p&gt;OpenAI has a real Usage API - &lt;code&gt;GET /v1/organization/usage/completions&lt;/code&gt;, plus a Costs API. It's well designed: paginated time buckets, group-by model or API key, cached-token breakdowns. But it requires a separate &lt;strong&gt;Admin API key&lt;/strong&gt; that only an org owner can mint, and that admin key can't do inference. The key your app actually holds can't ask about itself at all. The old self-service endpoints people remember (&lt;code&gt;GET /v1/usage?date=...&lt;/code&gt;, &lt;code&gt;/v1/dashboard/billing/usage&lt;/code&gt;) were never official and have been locked to browser sessions since 2023.&lt;/p&gt;

&lt;p&gt;Anthropic made the same call. Usage and cost reports live under &lt;code&gt;/v1/organizations/usage_report/*&lt;/code&gt; and need an &lt;code&gt;sk-ant-admin...&lt;/code&gt; key. They even ship a read-only Rate Limits API that names "sync your gateway with your org limits" as the use case — and gated that behind the admin key too.&lt;/p&gt;

&lt;p&gt;With a regular key, both vendors give you exactly one thing: &lt;strong&gt;rate-limit response headers&lt;/strong&gt; (&lt;code&gt;x-ratelimit-remaining-tokens&lt;/code&gt;, &lt;code&gt;anthropic-ratelimit-requests-remaining&lt;/code&gt;, ...) on each inference call. Useful, but reactive — you learn your headroom as a side effect of spending it, and you learn nothing about budgets or historical usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meanwhile, their own tools poll private endpoints
&lt;/h2&gt;

&lt;p&gt;The funny part: both companies clearly know consumers need this, because their own products have it — privately.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Codex&lt;/strong&gt; polls &lt;code&gt;chatgpt.com/backend-api/wham/usage&lt;/code&gt; (OAuth-only, undocumented) about once a minute to render its usage display. The response is percent-of-window: &lt;code&gt;{"primary_window": {"used_percent": 12, "reset_at": ...}}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;'s &lt;code&gt;/usage&lt;/code&gt; command calls &lt;code&gt;api.anthropic.com/api/oauth/usage&lt;/code&gt; — also undocumented, also OAuth-only, and it even rate-limits you into oblivion if you don't send the right &lt;code&gt;User-Agent&lt;/code&gt;. Community usage monitors reverse-engineered it anyway.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the pattern at the top of the market is: &lt;em&gt;self-service usage exists, but only for our own clients, on internal endpoints you're not supposed to use.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  And the tools downstream are hurting
&lt;/h2&gt;

&lt;p&gt;The demand side is not subtle. The example that motivated this work: &lt;a href="https://opencode.ai" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt; — the open-source coding agent — has a gateway (Zen) with real usage windows and balances, and &lt;strong&gt;no API for any of it&lt;/strong&gt;. The result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A community plugin (&lt;code&gt;opencode-quota&lt;/code&gt;) scrapes the billing dashboard's HTML using browser cookie auth to display quota percentages.&lt;/li&gt;
&lt;li&gt;There are open issues asking for &lt;code&gt;GET /zen/v1/balance&lt;/code&gt; and usage-window endpoints, and an open proposal for &lt;code&gt;GET /zen/go/v1/usage&lt;/code&gt; returning &lt;code&gt;{"windows": [{"name": "5 hour", "usagePercent": 42, "resetInSec": 4711}]}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ollama Cloud users are filing the same issues (&lt;code&gt;/api/me&lt;/code&gt;, &lt;code&gt;/api/usage&lt;/code&gt;) for the same reason.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When your users are scraping your dashboard with cookies, they have told you what API they want.&lt;/p&gt;

&lt;h2&gt;
  
  
  The closest thing to a convention
&lt;/h2&gt;

&lt;p&gt;Two gateways actually shipped self-service introspection, and one got close:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenRouter&lt;/strong&gt;: &lt;code&gt;GET /api/v1/key&lt;/code&gt; with your normal inference key returns &lt;code&gt;usage&lt;/code&gt;, &lt;code&gt;usage_daily/weekly/monthly&lt;/code&gt;, &lt;code&gt;limit&lt;/code&gt;, &lt;code&gt;limit_remaining&lt;/code&gt;, &lt;code&gt;limit_reset&lt;/code&gt;. This is the de-facto reference design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requesty&lt;/strong&gt;: &lt;code&gt;GET /v1/manage/apikey/self&lt;/code&gt; returns &lt;code&gt;monthly_spend&lt;/code&gt; and &lt;code&gt;monthly_limit&lt;/code&gt; with the same bearer key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiteLLM&lt;/strong&gt;: &lt;code&gt;GET /key/info&lt;/code&gt; with no parameter defaults to the calling key and returns &lt;code&gt;spend&lt;/code&gt;, &lt;code&gt;max_budget&lt;/code&gt;, &lt;code&gt;budget_reset_at&lt;/code&gt;, &lt;code&gt;tpm_limit&lt;/code&gt;, &lt;code&gt;rpm_limit&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Distill those and you get the only "standard" that exists — a design pattern, not a schema: &lt;strong&gt;GET, same base URL, same bearer key, self-referential, no parameters required.&lt;/strong&gt; Plus rate-limit headers on inference responses as the complementary channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  How GoModel does it
&lt;/h2&gt;

&lt;p&gt;GoModel now answers the whole question in one call. &lt;code&gt;GET /v1/usage&lt;/code&gt;, authenticated with the same key you use for chat completions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:8080/v1/usage &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_gom_..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"user_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/team/alpha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"server_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-07T09:30:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-08"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"end_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-07"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_requests"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;91234&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cached_input_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12790&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_cost"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.73&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"budgets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"user_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/team/alpha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"period_label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"monthly"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"spent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;41.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"remaining"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;58.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"usage_ratio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.412&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"period_end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-01T00:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"resets_in_seconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2125800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"exceeded"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rate_limits"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"user_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/team/alpha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"period_label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"minute"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"max_requests"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"requests_used"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"requests_remaining"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"requests_usage_ratio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"window_end"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-07T09:31:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"resets_in_seconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"exhausted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three blocks, three questions answered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;usage&lt;/code&gt;&lt;/strong&gt; — requests, tokens (with cache breakdowns), and estimated cost over a date window you control (&lt;code&gt;days&lt;/code&gt;, or &lt;code&gt;start_date&lt;/code&gt;/&lt;code&gt;end_date&lt;/code&gt;, up to 365 days; last 30 by default).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;budgets&lt;/code&gt;&lt;/strong&gt; — every spend limit that gates you, including ones inherited from parent paths, with &lt;code&gt;spent&lt;/code&gt;, &lt;code&gt;remaining&lt;/code&gt;, the period bounds, and an &lt;code&gt;exceeded&lt;/code&gt; flag that mirrors what enforcement will actually do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;rate_limits&lt;/code&gt;&lt;/strong&gt; — live counters for every rate-limit rule covering you: used, remaining, and when the window resets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few design decisions worth explaining:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's scoped by user path, not by key.&lt;/strong&gt; In GoModel, budgets, rate limits, and usage accounting all hang off a hierarchical &lt;code&gt;user_path&lt;/code&gt; (like &lt;code&gt;/team/alpha/service&lt;/code&gt;), and API keys bind to a path. Several keys can share one path, and when we add a full users system, a user will simply &lt;em&gt;be&lt;/em&gt; a path. Every self-service precedent out there is key-centric; ours is identity-centric — but from the caller's perspective it behaves identically: send your key, get your own status, and you can't read outside your subtree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Polling is free.&lt;/strong&gt; The endpoint doesn't consume rate-limit quota, so a status widget checking every few seconds never eats into the budget it's displaying. (Codex polls its internal endpoint every 60 seconds for the same reason.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Absolute numbers &lt;em&gt;and&lt;/em&gt; the percentages.&lt;/strong&gt; The consumer-facing idiom at OpenAI and Anthropic is percent-of-window (&lt;code&gt;used_percent&lt;/code&gt;, &lt;code&gt;utilization&lt;/code&gt;) — deliberately opaque about actual quotas. We return real counts and real money with real window boundaries, and then precompute the display idiom anyway. Every budget carries a &lt;code&gt;usage_ratio&lt;/code&gt;, a &lt;code&gt;resets_in_seconds&lt;/code&gt; countdown, and an &lt;code&gt;exceeded&lt;/code&gt; flag. Every rate limit carries an &lt;code&gt;exhausted&lt;/code&gt; flag, a usage ratio per limited dimension (&lt;code&gt;requests_usage_ratio&lt;/code&gt;, &lt;code&gt;tokens_usage_ratio&lt;/code&gt;), and — for windowed rules — the same countdown; a concurrency cap has no window, so it reports in-flight slots instead. Countdowns are relative to the &lt;code&gt;server_time&lt;/code&gt; in the same payload, so client clock skew can't break them, and both flags mirror what enforcement will actually do. A status bar renders this with zero math; a plugin that wants the raw numbers has them too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers still work.&lt;/strong&gt; GoModel keeps emitting OpenAI-style &lt;code&gt;x-ratelimit-*&lt;/code&gt; headers on inference responses, so the endpoint and the in-band signals tell one consistent story.&lt;/p&gt;

&lt;p&gt;The endpoint is in GoModel today, and it exists because someone asked for exactly the OpenCode-plugin use case described above. Full request and response reference — every field, the date window, the error cases — is in the &lt;a href="https://gomodel.enterpilot.io/docs/advanced/usage-api" rel="noopener noreferrer"&gt;GoModel Usage API docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Usage visibility has quietly become admin-only across the LLM ecosystem — not because it's hard, but because nobody made it part of the API contract. The result is a cottage industry of OAuth token borrowing, dashboard scraping, and GitHub issues asking for the same three fields: &lt;em&gt;used, limit, resets at&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If you run a gateway, your callers shouldn't need admin access to know when they're about to hit a wall. Give them one GET.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>apigateway</category>
      <category>performance</category>
      <category>startup</category>
    </item>
    <item>
      <title>Benchmarking AI Gateways: GoModel vs LiteLLM vs Portkey vs Bifrost</title>
      <dc:creator>Andrew S. Bandy</dc:creator>
      <pubDate>Fri, 26 Jun 2026 17:51:26 +0000</pubDate>
      <link>https://dev.to/s-bandy/benchmarking-ai-gateways-gomodel-vs-litellm-vs-portkey-vs-bifrost-5d98</link>
      <guid>https://dev.to/s-bandy/benchmarking-ai-gateways-gomodel-vs-litellm-vs-portkey-vs-bifrost-5d98</guid>
      <description>&lt;p&gt;In October 2025 I tried to build my startup on top of LiteLLM.&lt;/p&gt;

&lt;p&gt;At first it looked like the obvious choice. It supported many providers, it had&lt;br&gt;
an OpenAI-compatible API, and it was already used by a lot of people. I did not&lt;br&gt;
want to write an AI gateway. I wanted to build the product behind it.&lt;/p&gt;

&lt;p&gt;Then I started running it on the hot path.&lt;/p&gt;

&lt;p&gt;My opinion changed there.&lt;/p&gt;

&lt;p&gt;A gateway is not a dashboard or integration glue you call once in a while. It&lt;br&gt;
sits on every request, every retry, every stream, every tool call, every&lt;br&gt;
fallback, every timeout.&lt;/p&gt;

&lt;p&gt;A heavy gateway charges rent forever.&lt;/p&gt;

&lt;p&gt;Most AI gateway comparisons miss that part. They talk about provider count,&lt;br&gt;
dashboards, tracing, and "support for 1000+ models". Those things matter, but&lt;br&gt;
they are not free. Before the gateway calls OpenAI, Anthropic, Gemini, vLLM, or&lt;br&gt;
anything else, it has already spent your CPU, memory, cold-start time, and&lt;br&gt;
operational budget.&lt;/p&gt;

&lt;p&gt;I am not comparing full product maturity here. I am comparing how these gateways&lt;br&gt;
behave on the hot path.&lt;/p&gt;

&lt;p&gt;So I started writing &lt;a href="https://github.com/ENTERPILOT/GoModel" rel="noopener noreferrer"&gt;GoModel&lt;/a&gt;: a small&lt;br&gt;
open-source AI gateway and AI control plane in Go, with an OpenAI-compatible API&lt;br&gt;
and explicit provider adapters.&lt;/p&gt;

&lt;p&gt;When I &lt;a href="https://news.ycombinator.com/item?id=47861333" rel="nofollow noopener noreferrer"&gt;launched GoModel on Hacker News&lt;/a&gt;,&lt;br&gt;
I promised a real, reproducible benchmark. This article is that follow-up.&lt;/p&gt;

&lt;p&gt;The benchmark question is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How lean is each AI gateway when it sits on the request path?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question runs through the whole benchmark: GoModel vs LiteLLM vs Portkey vs&lt;br&gt;
Bifrost, measured by latency, throughput, memory, CPU, cold start, and image&lt;br&gt;
size rather than landing pages or feature matrices.&lt;/p&gt;
&lt;h2&gt;
  
  
  The runtime footprint matters
&lt;/h2&gt;

&lt;p&gt;Latency gets the easiest arguments. It rarely tells the whole story.&lt;/p&gt;

&lt;p&gt;Most real LLM calls are dominated by inference time. If a model takes &lt;code&gt;2000 ms&lt;/code&gt;&lt;br&gt;
to answer, the difference between &lt;code&gt;5 ms&lt;/code&gt; and &lt;code&gt;15 ms&lt;/code&gt; of proxy overhead is not&lt;br&gt;
the main story.&lt;/p&gt;

&lt;p&gt;The main story is the deployment envelope:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How much RAM does the gateway need under load?&lt;/li&gt;
&lt;li&gt;How much CPU does it burn per request?&lt;/li&gt;
&lt;li&gt;How many requests can it serve per core?&lt;/li&gt;
&lt;li&gt;How fast does it cold-start?&lt;/li&gt;
&lt;li&gt;How large is the Docker image?&lt;/li&gt;
&lt;li&gt;Can you run it as a sidecar, on a small VM, in serverless, or near local
models?&lt;/li&gt;
&lt;li&gt;Is the core gateway actually open-source?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those numbers decide whether the gateway can run where you want it to run.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;372 MB&lt;/code&gt; compressed image (&lt;code&gt;1.2 GB&lt;/code&gt; unpacked) that idles around gigabytes of&lt;br&gt;
RAM and takes &lt;code&gt;25 s&lt;/code&gt; to cold-start is a different operational thing than a&lt;br&gt;
&lt;code&gt;16 MB&lt;/code&gt; image that peaks at &lt;code&gt;37 MB&lt;/code&gt; of RAM and is serving traffic &lt;code&gt;0.56 s&lt;/code&gt; after&lt;br&gt;
launch.&lt;/p&gt;

&lt;p&gt;So I care about the runtime footprint.&lt;/p&gt;
&lt;h2&gt;
  
  
  What this benchmark does not prove
&lt;/h2&gt;

&lt;p&gt;This benchmark does &lt;strong&gt;not&lt;/strong&gt; prove that one gateway is best for every company.&lt;/p&gt;

&lt;p&gt;I am not measuring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bug counts or overall correctness&lt;/li&gt;
&lt;li&gt;semantic cache quality&lt;/li&gt;
&lt;li&gt;tracing UI quality&lt;/li&gt;
&lt;li&gt;guardrail quality&lt;/li&gt;
&lt;li&gt;admin dashboards&lt;/li&gt;
&lt;li&gt;long-term provider maintenance&lt;/li&gt;
&lt;li&gt;every possible provider-specific feature&lt;/li&gt;
&lt;li&gt;total provider count&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those things matter. Some of them matter a lot.&lt;/p&gt;

&lt;p&gt;LiteLLM in particular has more integrated providers and more gateway features&lt;br&gt;
than GoModel today. If your first requirement is maximum provider coverage right&lt;br&gt;
now, LiteLLM has a real advantage. This benchmark does not erase that. It&lt;br&gt;
measures the runtime footprint of putting each gateway on the request path. In&lt;br&gt;
practice, many smaller or newer providers already expose an OpenAI-compatible&lt;br&gt;
API, so provider count is not always the same as practical routing coverage.&lt;/p&gt;

&lt;p&gt;The benchmark measures one narrower thing: &lt;strong&gt;runtime and deployment overhead on&lt;br&gt;
the request path&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That still matters, because the gateway is on the hot path. If you run high&lt;br&gt;
request volume, local models, serverless workloads, edge workloads, or many small&lt;br&gt;
model calls, the overhead stops being theoretical.&lt;/p&gt;
&lt;h2&gt;
  
  
  AI gateway benchmark setup
&lt;/h2&gt;

&lt;p&gt;I tested four AI gateways people actually compare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GoModel&lt;/li&gt;
&lt;li&gt;LiteLLM&lt;/li&gt;
&lt;li&gt;Portkey&lt;/li&gt;
&lt;li&gt;Bifrost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every gateway talked to the &lt;strong&gt;same instant mock backend&lt;/strong&gt;, on purpose. I did not&lt;br&gt;
want to benchmark OpenAI, Anthropic, AWS networking, or random internet jitter.&lt;br&gt;
I wanted to isolate the gateway itself.&lt;/p&gt;

&lt;p&gt;Each gateway ran one at a time, in Docker, on an &lt;strong&gt;AWS &lt;code&gt;c7i.large&lt;/code&gt;&lt;/strong&gt; with&lt;br&gt;
2 vCPU and 4 GiB RAM, running the latest &lt;strong&gt;Amazon Linux 2023&lt;/strong&gt; AMI. The whole&lt;br&gt;
thing is Terraform'd, runs with one command, and tears itself down afterwards.&lt;/p&gt;

&lt;p&gt;I first ran this on a free-tier &lt;code&gt;t2.micro&lt;/code&gt;. That was cheap and easy to&lt;br&gt;
reproduce, but unfair to the heavier gateways. A 1 GiB machine cannot hold a&lt;br&gt;
gateway that wants gigabytes of memory, so it starts swapping. At that point you&lt;br&gt;
are benchmarking the host being too small.&lt;/p&gt;

&lt;p&gt;So I moved to &lt;code&gt;c7i.large&lt;/code&gt;: still small, but non-burstable and large enough that&lt;br&gt;
nothing swaps. It also makes the LiteLLM setup more honest. LiteLLM recommends&lt;br&gt;
one worker per vCPU, and this machine has 2 vCPUs, so LiteLLM gets 2&lt;br&gt;
workers. That gives it the multi-core access it is supposed to have instead of&lt;br&gt;
pinning it to a single worker on a tiny box.&lt;/p&gt;

&lt;p&gt;The test covered six workloads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chat completions, non-streaming&lt;/li&gt;
&lt;li&gt;chat completions, streaming&lt;/li&gt;
&lt;li&gt;Responses API, non-streaming&lt;/li&gt;
&lt;li&gt;Responses API, streaming&lt;/li&gt;
&lt;li&gt;Anthropic messages, non-streaming&lt;/li&gt;
&lt;li&gt;Anthropic messages, streaming&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each workload used &lt;code&gt;8,000&lt;/code&gt; requests at concurrency &lt;code&gt;10&lt;/code&gt;, across &lt;strong&gt;two trials&lt;br&gt;
with randomized gateway order&lt;/strong&gt;. Latency is the &lt;strong&gt;median across trials&lt;/strong&gt;, and I&lt;br&gt;
report p99 with its min-max range so one noisy window cannot tell the whole&lt;br&gt;
story.&lt;/p&gt;

&lt;p&gt;I would not call this a statistically exhaustive study. It is a reproducible&lt;br&gt;
engineering benchmark, and the harness is public so people can rerun it, change&lt;br&gt;
the machine, or add their own workloads.&lt;/p&gt;

&lt;p&gt;A few details matter if you want to reproduce or criticize the numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Throughput is measured, not inferred.&lt;/strong&gt; The latency runs report
completed-req/s at fixed concurrency, but real capacity comes from a separate
concurrency sweep that drives each gateway to saturation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every dialect is warmed up before measurement.&lt;/strong&gt; LiteLLM lazily imports some
per-dialect translation code on first use. A chat-only warmup made its
Responses and Messages paths look worse than they should. I warmed up all
dialects to avoid that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retries are disabled for all gateways.&lt;/strong&gt; I also disabled GoModel's circuit
breaker for this benchmark. In production, rejecting traffic after upstream
trouble is the right behavior. In a saturation benchmark, it would make the
throughput number unfairly low.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiteLLM runs with its recommended worker count.&lt;/strong&gt; A LiteLLM worker is
effectively single-threaded, and its production guidance is one worker per
vCPU. On this box that means &lt;code&gt;2&lt;/code&gt; workers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming uses terminal-marker or idle-gap detection.&lt;/strong&gt; If a gateway streams
content but never sends a terminal event, the harness measures to last byte
instead of hanging forever.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  GoModel vs LiteLLM vs Portkey vs Bifrost
&lt;/h2&gt;

&lt;p&gt;Representative latency is chat completions, non-streaming. All resource figures&lt;br&gt;
are measured under load on the same box.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;GoModel&lt;/th&gt;
&lt;th&gt;Bifrost&lt;/th&gt;
&lt;th&gt;Portkey&lt;/th&gt;
&lt;th&gt;LiteLLM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency overhead &lt;code&gt;p50&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;1.8 ms&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2.5 ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;9.7 ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;30.6 ms&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency &lt;code&gt;p99&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;6.9 ms&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;18.3 ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;30.5 ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;39.3 ms&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Throughput (sustained)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;4900 req/s&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3100 req/s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;950 req/s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;324 req/s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peak RAM under load&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;37 MB&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;143 MB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;112 MB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2.3 GB&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Efficiency (req/s per CPU %)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;52&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;25&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2.6&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cold start to first request&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;0.56 s&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;7.1 s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.1 s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;25.5 s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker image (compressed pull)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;16 MB&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;77 MB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;59 MB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;372 MB&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workload coverage&lt;/td&gt;
&lt;td&gt;&lt;code&gt;6/6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;6/6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4/6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;6/6&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor-neutral core&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Partial †&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core source available&lt;/td&gt;
&lt;td&gt;Yes ‡&lt;/td&gt;
&lt;td&gt;Partial ‡&lt;/td&gt;
&lt;td&gt;Partial ‡&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  What stood out
&lt;/h2&gt;

&lt;p&gt;GoModel had the lowest median latency and the tightest tail: &lt;code&gt;1.8 ms&lt;/code&gt; p50 and&lt;br&gt;
&lt;code&gt;6.9 ms&lt;/code&gt; p99.&lt;/p&gt;

&lt;p&gt;Bifrost was close on median latency at &lt;code&gt;2.5 ms&lt;/code&gt;, which is a good result. The&lt;br&gt;
gap opened at the tail and in memory: &lt;code&gt;18.3 ms&lt;/code&gt; p99 and &lt;code&gt;143 MB&lt;/code&gt; peak RAM under&lt;br&gt;
load.&lt;/p&gt;

&lt;p&gt;Portkey was heavier than I expected for this narrow proxy benchmark. It served&lt;br&gt;
&lt;code&gt;950 req/s&lt;/code&gt; sustained and used &lt;code&gt;112 MB&lt;/code&gt; peak RAM under load. In this setup it did&lt;br&gt;
not serve the Anthropic &lt;code&gt;/v1/messages&lt;/code&gt; dialect, so it gets &lt;code&gt;4/6&lt;/code&gt; workload&lt;br&gt;
coverage. Treat that as a setup limitation, not a claim that Portkey cannot&lt;br&gt;
support Anthropic in a fuller virtual-key configuration.&lt;/p&gt;

&lt;p&gt;LiteLLM was the outlier. At its recommended worker count, it used about&lt;br&gt;
&lt;code&gt;2.3 GB&lt;/code&gt; of RAM, cold-started in &lt;code&gt;25.5 s&lt;/code&gt;, and sustained &lt;code&gt;324 req/s&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Not because Python is morally bad. The language matters only when it changes the&lt;br&gt;
deployment envelope. Here it does: memory floor, image size, cold-start time,&lt;br&gt;
dependency graph, and throughput per core.&lt;/p&gt;

&lt;p&gt;The later &lt;a href="https://futuresearch.ai/blog/litellm-pypi-supply-chain-attack/" rel="nofollow noopener noreferrer"&gt;supply-chain incident around LiteLLM&lt;/a&gt;&lt;br&gt;
also made me more confident in GoModel's design direction. A small Go binary&lt;br&gt;
with a standard-library-heavy dependency tree is structurally less exposed to&lt;br&gt;
that class of problem than a large Python dependency graph.&lt;/p&gt;
&lt;h2&gt;
  
  
  What AI gateway benchmarks do not capture
&lt;/h2&gt;

&lt;p&gt;Forwarding JSON is not the hard part.&lt;/p&gt;

&lt;p&gt;The hard part is provider drift.&lt;/p&gt;

&lt;p&gt;OpenAI, Anthropic, Gemini, AWS Bedrock, Azure OpenAI, Groq, xAI, Cerebras, vLLM,&lt;br&gt;
and local servers all disagree in small ways. Then they change those ways. Tool&lt;br&gt;
calling changes. Streaming changes. Reasoning parameters change. Image inputs&lt;br&gt;
change. Error formats change. Rate-limit semantics change.&lt;/p&gt;

&lt;p&gt;An AI gateway or AI control plane has to absorb that without becoming magic.&lt;/p&gt;

&lt;p&gt;GoModel's bet is not "support every model name on the internet".&lt;/p&gt;

&lt;p&gt;The bet is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;support the providers people actually deploy&lt;/li&gt;
&lt;li&gt;keep provider adapters explicit&lt;/li&gt;
&lt;li&gt;accept OpenAI-compatible requests generously&lt;/li&gt;
&lt;li&gt;translate only what needs translation&lt;/li&gt;
&lt;li&gt;pass through what should stay provider-specific&lt;/li&gt;
&lt;li&gt;return conservative OpenAI-compatible responses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the same reason, GoModel starts as a small OpenAI-compatible gateway, not as&lt;br&gt;
a dashboard with a proxy attached.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why this matters for local models and vLLM
&lt;/h2&gt;

&lt;p&gt;If all your traffic goes to a cloud model that takes several seconds to answer,&lt;br&gt;
gateway overhead can look academic.&lt;/p&gt;

&lt;p&gt;Local models change the math.&lt;/p&gt;

&lt;p&gt;If you are routing through an AI gateway to vLLM, Ollama, LM Studio, llama.cpp,&lt;br&gt;
or small specialized models on your own network, the model call can be much&lt;br&gt;
faster. Then gateway overhead, cold starts, memory, and sidecar size matter more.&lt;/p&gt;

&lt;p&gt;One reason I want GoModel to stay small: a gateway should be cheap enough to put&lt;br&gt;
near the workload.&lt;/p&gt;
&lt;h2&gt;
  
  
  Notes on neutrality and open source
&lt;/h2&gt;

&lt;p&gt;Bifrost is built by Maxim AI, an LLM&lt;br&gt;
evaluation and observability platform. It routes to many model providers, but&lt;br&gt;
the gateway also sits close to Maxim's eval and observability ecosystem. If you&lt;br&gt;
want to choose your own eval platform, or stay independent from any eval&lt;br&gt;
platform, ask whether Bifrost is the right match for you. Good software can&lt;br&gt;
still have incentives attached. "Vendor-neutral" needs an asterisk here.&lt;/p&gt;

&lt;p&gt;"Open-source" also needs care.&lt;/p&gt;

&lt;p&gt;Portkey keeps observability storage, dashboard, multi-team RBAC, and at-scale&lt;br&gt;
semantic caching in a closed managed tier. Bifrost's core gateway is Apache-2.0,&lt;br&gt;
but its Enterprise edition adds closed or managed features. LiteLLM's proxy core&lt;br&gt;
is MIT, but enterprise features like SSO, audit logs, and fine-grained access&lt;br&gt;
control sit behind a proprietary commercial license.&lt;/p&gt;

&lt;p&gt;GoModel is open-source today. Some enterprise-grade AI control plane features may&lt;br&gt;
stay private. The core gateway is intended to remain useful without those private&lt;br&gt;
features.&lt;/p&gt;
&lt;h2&gt;
  
  
  Reproduce it yourself
&lt;/h2&gt;

&lt;p&gt;The benchmark is built to be self-verifiable. It provisions the AWS instance,&lt;br&gt;
runs every gateway against the same backend, prints the tables, and destroys the&lt;br&gt;
infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/ENTERPILOT/GoModel/tree/main/docs/2026-06-25_aws_gateway_benchmark" rel="noopener noreferrer"&gt;Reproduce it yourself&lt;/a&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./run.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One caveat: it runs on &lt;strong&gt;paid&lt;/strong&gt; AWS infrastructure, not the free tier. A&lt;br&gt;
&lt;code&gt;c7i.large&lt;/code&gt; is about &lt;code&gt;$0.09&lt;/code&gt;/hour and the run self-destructs within an hour or&lt;br&gt;
two, so budget &lt;strong&gt;under &lt;code&gt;$1&lt;/code&gt;&lt;/strong&gt; per run to be safe.&lt;/p&gt;

&lt;p&gt;If you pass &lt;code&gt;KEEP=1&lt;/code&gt; or teardown fails, you keep paying until you destroy the&lt;br&gt;
box, so double-check the teardown.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I did not start GoModel because I wanted another AI gateway in the world.&lt;/p&gt;

&lt;p&gt;I started it because the gateway I wanted to use became part of the problem. It&lt;br&gt;
sat on the hot path, but did not feel like hot-path software: too heavy, too&lt;br&gt;
slow to start, too expensive to keep around, too large for the job.&lt;/p&gt;

&lt;p&gt;This benchmark is the result of turning that frustration into numbers.&lt;/p&gt;

&lt;p&gt;The numbers say GoModel is small in the places I care about: &lt;code&gt;16 MB&lt;/code&gt; image,&lt;br&gt;
&lt;code&gt;37 MB&lt;/code&gt; peak RAM, &lt;code&gt;0.56 s&lt;/code&gt; cold start, &lt;code&gt;1.8 ms&lt;/code&gt; p50, &lt;code&gt;6.9 ms&lt;/code&gt; p99, and&lt;br&gt;
&lt;code&gt;4900 req/s&lt;/code&gt; sustained throughput on a small AWS box.&lt;/p&gt;

&lt;p&gt;LiteLLM still has more providers and more features today. Portkey and Bifrost&lt;br&gt;
have their own strengths. But if the gateway is going to sit between your users&lt;br&gt;
and every model call, I think it should first be cheap, predictable, and boring&lt;br&gt;
to run.&lt;/p&gt;

&lt;p&gt;GoModel is my attempt to build that kind of gateway.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>performance</category>
      <category>infrastructure</category>
      <category>webdev</category>
    </item>
    <item>
      <title>LiteLLM was compromised, but GoModel is a good alternative</title>
      <dc:creator>Andrew S. Bandy</dc:creator>
      <pubDate>Tue, 24 Mar 2026 18:39:51 +0000</pubDate>
      <link>https://dev.to/s-bandy/litellm-was-compromised-thats-why-im-building-gomodel-nmm</link>
      <guid>https://dev.to/s-bandy/litellm-was-compromised-thats-why-im-building-gomodel-nmm</guid>
      <description>&lt;p&gt;LiteLLM just had a serious supply chain incident.&lt;/p&gt;

&lt;p&gt;According to the &lt;a href="https://github.com/BerriAI/litellm/issues/24518" rel="noopener noreferrer"&gt;public GitHub reports&lt;/a&gt;, malicious PyPI versions of LiteLLM were published, including 1.82.8, with code that could run automatically on Python startup and steal secrets like environment variables, SSH keys, and cloud credentials. The reported payload sent that data to an attacker-controlled domain. A follow-up issue says the PyPI package was compromised through the maintainer's PyPI account, and that the bad releases were not shipped through the official GitHub CI/CD flow.&lt;/p&gt;

&lt;p&gt;This is bigger than one package. It is a reminder that the AI infra layer is now part of your security boundary.&lt;/p&gt;

&lt;p&gt;Fortunately, there is a good alternative. GoModel: a faster, simpler alternative to LiteLLM, written in Go. Simpler, smaller and better performance for teams that want a reliable LLM gateway.&lt;/p&gt;

&lt;p&gt;Repo link: &lt;a href="https://github.com/ENTERPILOT/GOModel/" rel="noopener noreferrer"&gt;https://github.com/ENTERPILOT/GOModel/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>performance</category>
      <category>opensource</category>
      <category>security</category>
    </item>
    <item>
      <title>Benchmarking GoModel, a LiteLLM alternative: lessons learned from building a simple benchmark</title>
      <dc:creator>Andrew S. Bandy</dc:creator>
      <pubDate>Mon, 23 Mar 2026 15:36:23 +0000</pubDate>
      <link>https://dev.to/s-bandy/benchmarking-gomodel-vs-litellm-alternative-lessons-learned-from-building-a-simple-benchmark-45m</link>
      <guid>https://dev.to/s-bandy/benchmarking-gomodel-vs-litellm-alternative-lessons-learned-from-building-a-simple-benchmark-45m</guid>
      <description>&lt;p&gt;When I started to look for an AI Gateway for my project I've encountered GoModel. I did not plan to spend much time on benchmarking.&lt;/p&gt;

&lt;p&gt;I assumed benchmarking would be annoying, fragile, and probably much harder than it looked. In my head, it felt like one of those tasks that sounds simple at first, but turns into a mini research project once you actually start.&lt;/p&gt;

&lt;p&gt;What I learned is the opposite: creating a &lt;strong&gt;useful&lt;/strong&gt; benchmark is much easier than most people think.&lt;/p&gt;

&lt;p&gt;And one big reason is that AI makes the whole process much easier than it was a few years ago.&lt;/p&gt;

&lt;p&gt;That was the biggest lesson for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is GoModel?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ENTERPILOT/GOModel" rel="noopener noreferrer"&gt;GoModel&lt;/a&gt; is an open-source AI gateway / LLM proxy written in Go. It sits between your app and model providers like OpenAI, Anthropic, Gemini, Groq, xAI, and Ollama, and exposes a single OpenAI-compatible API.&lt;/p&gt;

&lt;p&gt;I built it because I wanted a lightweight, production-friendly gateway that was easy to deploy, easy to reason about, and fully open-source.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I decided to benchmark it
&lt;/h2&gt;

&lt;p&gt;At some point, I kept making the same claim in my head:&lt;/p&gt;

&lt;p&gt;“GoModel feels lighter and faster.”&lt;/p&gt;

&lt;p&gt;That may be true, but “feels” is not evidence.&lt;/p&gt;

&lt;p&gt;I was mostly comparing it against LiteLLM, because LiteLLM is the best-known option in this space and the default reference point for many people looking at LLM gateways.&lt;/p&gt;

&lt;p&gt;So I decided to stop guessing and just measure it.&lt;/p&gt;

&lt;p&gt;That turned out to be one of the most useful things I have done for the project, not only because of the results, but because of what I learned while building the benchmark itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The biggest change: benchmarking is easier now because you can just talk to AI (Lesson 1)
&lt;/h2&gt;

&lt;p&gt;A few years ago, even starting a benchmark felt heavy.&lt;/p&gt;

&lt;p&gt;First you had to think through the methodology. Then you had to decide what to measure. Then you had to write the scripts. Then you had to figure out how to run them, collect the numbers, and make sense of the results.&lt;/p&gt;

&lt;p&gt;Now a lot of that work is much easier.&lt;/p&gt;

&lt;p&gt;You can literally start by describing what you want in plain English:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I have two services&lt;/li&gt;
&lt;li&gt;they do the same job&lt;/li&gt;
&lt;li&gt;I want to compare throughput, latency, and memory usage&lt;/li&gt;
&lt;li&gt;I want a simple repeatable benchmark&lt;/li&gt;
&lt;li&gt;I do not need a perfect academic setup&lt;/li&gt;
&lt;li&gt;I just want something fair and useful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is already enough to get moving.&lt;/p&gt;

&lt;p&gt;AI is very good at helping with exactly this kind of task. Not because it magically solves benchmarking for you, but because it removes a lot of the friction around getting started.&lt;/p&gt;

&lt;p&gt;It can help you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;define a reasonable benchmark scope&lt;/li&gt;
&lt;li&gt;generate load scripts&lt;/li&gt;
&lt;li&gt;suggest what metrics to collect&lt;/li&gt;
&lt;li&gt;point out obvious mistakes in the setup&lt;/li&gt;
&lt;li&gt;format results&lt;/li&gt;
&lt;li&gt;help you explain the limitations clearly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That part feels very different from how things used to be.&lt;/p&gt;

&lt;p&gt;Before, benchmarking often felt blocked by setup cost.&lt;/p&gt;

&lt;p&gt;Now it is much more like: &lt;strong&gt;&lt;a href="https://steipete.me/posts/just-talk-to-it" rel="noopener noreferrer"&gt;just talk to AI&lt;/a&gt;, get a first version working, then iterate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That does not mean you should trust every output blindly. You still need to think. You still need to validate the setup. You still need to understand what is actually being measured.&lt;/p&gt;

&lt;p&gt;But the barrier to entry is much lower now.&lt;/p&gt;

&lt;p&gt;And I think that is a big deal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 2: a benchmark does not need to be perfect to be useful
&lt;/h2&gt;

&lt;p&gt;This was the biggest mindset shift.&lt;/p&gt;

&lt;p&gt;I think many developers avoid benchmarking because they imagine they need a huge setup: many machines, a big test matrix, production traffic replay, deep statistical analysis, and charts for every possible scenario.&lt;/p&gt;

&lt;p&gt;In reality, you can learn a lot from a small benchmark if you ask a clear question.&lt;/p&gt;

&lt;p&gt;My question was simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If both tools are used as an LLM gateway in front of the same kind of workload, how do they behave in terms of throughput, latency, and memory usage?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is already enough.&lt;/p&gt;

&lt;p&gt;You do not need to model the entire internet. You just need a test that is fair enough to reveal something meaningful.&lt;/p&gt;

&lt;p&gt;AI also helps here because it forces you to phrase the question clearly. If you cannot explain the benchmark clearly to an AI assistant, there is a good chance your scope is still too vague.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 3: benchmarking forces product clarity
&lt;/h2&gt;

&lt;p&gt;This part surprised me.&lt;/p&gt;

&lt;p&gt;I expected benchmarking to tell me about performance.&lt;/p&gt;

&lt;p&gt;What it also did was clarify the product itself.&lt;/p&gt;

&lt;p&gt;Once you measure something, you are forced to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is this product actually optimized for?&lt;/li&gt;
&lt;li&gt;Where should it be better?&lt;/li&gt;
&lt;li&gt;What trade-offs did I make intentionally?&lt;/li&gt;
&lt;li&gt;What should users care about most?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my case, the benchmark made the positioning much clearer.&lt;/p&gt;

&lt;p&gt;GoModel is not just “an AI gateway.”&lt;/p&gt;

&lt;p&gt;It is a Go-based, open-source, single-binary gateway designed to be lightweight, simple to deploy, and efficient in the hot path of LLM requests.&lt;/p&gt;

&lt;p&gt;Without benchmarking, those are just words.&lt;/p&gt;

&lt;p&gt;With benchmarking, they become testable claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 4: benchmarking is also a debugging tool
&lt;/h2&gt;

&lt;p&gt;Before doing this, I mostly thought about benchmarks as something you publish.&lt;/p&gt;

&lt;p&gt;That was a mistake.&lt;/p&gt;

&lt;p&gt;A benchmark is also one of the fastest ways to find weak spots in your own system.&lt;/p&gt;

&lt;p&gt;As soon as you push something under repeatable load, you start noticing where memory grows faster than expected, where latency becomes uneven, and where parts of the system become bottlenecks.&lt;/p&gt;

&lt;p&gt;Even if I had never published the results, building the benchmark would still have been worth it.&lt;/p&gt;

&lt;p&gt;It gave me a much more honest picture of the system.&lt;/p&gt;

&lt;p&gt;And again, AI helps here not by replacing the benchmark, but by helping you move faster once you find a problem. You can ask it to review the script, suggest what might be skewing the result, or help you isolate one part of the test.&lt;/p&gt;

&lt;h2&gt;
  
  
  My biggest takeaway
&lt;/h2&gt;

&lt;p&gt;The biggest lesson I learned is very simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benchmarking is much more accessible today with AI tools.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You do not need a lab.&lt;/p&gt;

&lt;p&gt;You do not need a giant team.&lt;/p&gt;

&lt;p&gt;You do not need a perfect methodology.&lt;/p&gt;

&lt;p&gt;And now, you also do not need to start from a blank page.&lt;/p&gt;

&lt;p&gt;You can just describe what you want to measure, use AI to help generate a first version, and improve it from there.&lt;/p&gt;

&lt;p&gt;You still need to think.&lt;/p&gt;

&lt;p&gt;You still need to validate the setup.&lt;/p&gt;

&lt;p&gt;You still need to be honest about the limits.&lt;/p&gt;

&lt;p&gt;But getting started is much easier than it used to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;If you are building infrastructure, developer tools, or performance-sensitive software, I think it is worth benchmarking earlier than you expect.&lt;/p&gt;

&lt;p&gt;Not because you need a marketing graph.&lt;/p&gt;

&lt;p&gt;Because benchmarking forces clarity.&lt;/p&gt;

&lt;p&gt;It helps you understand your product better, find bottlenecks faster, and communicate value more concretely.&lt;/p&gt;

&lt;p&gt;And today, with AI, it is easier than ever to start.&lt;/p&gt;

&lt;p&gt;That was true for me with benchmarking GoModel, and it is probably true for a lot of other projects too.&lt;/p&gt;

&lt;p&gt;If you want to check out the project, GoModel is open-source and available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ENTERPILOT/GOModel" rel="noopener noreferrer"&gt;GOModel on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is also a benchmark result published there by enterpilot start-up:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://enterpilot.io/blog/gomodel-vs-litellm-benchmark-march-2026/" rel="noopener noreferrer"&gt;GoModel vs LiteLLM benchmark (March 2026)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>go</category>
      <category>performance</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
