<?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: HuyHK</title>
    <description>The latest articles on DEV Community by HuyHK (@huyhk).</description>
    <link>https://dev.to/huyhk</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%2F4238811%2Fbe78c3b8-0d02-4872-a91a-a2f4d44591f6.jpg</url>
      <title>DEV Community: HuyHK</title>
      <link>https://dev.to/huyhk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/huyhk"/>
    <language>en</language>
    <item>
      <title>Stop Managing Multiple LLM API Integrations: Use One Compatible Endpoint</title>
      <dc:creator>HuyHK</dc:creator>
      <pubDate>Wed, 11 Nov 2026 10:07:30 +0000</pubDate>
      <link>https://dev.to/huyhk/stop-managing-multiple-llm-api-integrations-use-one-compatible-endpoint-2h8e</link>
      <guid>https://dev.to/huyhk/stop-managing-multiple-llm-api-integrations-use-one-compatible-endpoint-2h8e</guid>
      <description>&lt;p&gt;If you've built an application that uses multiple LLM providers, you probably know the pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different API keys&lt;/li&gt;
&lt;li&gt;Different base URLs&lt;/li&gt;
&lt;li&gt;Different SDKs&lt;/li&gt;
&lt;li&gt;Different billing dashboards&lt;/li&gt;
&lt;li&gt;Different request formats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, integrating another model seems easy. But maintaining several providers in a production application can become surprisingly messy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The usual approach
&lt;/h2&gt;

&lt;p&gt;You might end up with code like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;openaiClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;anthropicClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you need separate logic for each provider, error handling, retries, usage tracking, and billing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What if you could use one compatible endpoint?
&lt;/h2&gt;

&lt;p&gt;An API gateway that supports OpenAI-compatible and Anthropic-compatible formats can simplify this setup.&lt;/p&gt;

&lt;p&gt;For example, UberLLM provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One API key for multiple models&lt;/li&gt;
&lt;li&gt;OpenAI-compatible endpoints&lt;/li&gt;
&lt;li&gt;Anthropic-compatible endpoints&lt;/li&gt;
&lt;li&gt;A model catalog covering multiple providers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the OpenAI SDK, the integration looks familiar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;"openai"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"https://api.uberllm.dev/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="no"&gt;UBERLLM_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&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="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"deepseek/deepseek-v4-flash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Explain dependency injection in simple terms."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&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;The main change is the base URL, API key, and model ID. Your existing OpenAI SDK workflow stays largely the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is this the right architecture for every project?
&lt;/h2&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;Before adopting a gateway, I'd evaluate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Provider availability and reliability&lt;/li&gt;
&lt;li&gt;Model pricing and billing transparency&lt;/li&gt;
&lt;li&gt;Streaming and tool-calling compatibility&lt;/li&gt;
&lt;li&gt;Rate limits and error handling&lt;/li&gt;
&lt;li&gt;Data handling and security requirements&lt;/li&gt;
&lt;li&gt;Observability and request-level cost tracking&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For some applications, direct provider integrations are still the better choice.&lt;/p&gt;

&lt;p&gt;For others, a unified endpoint can reduce integration and maintenance overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  One option worth exploring
&lt;/h2&gt;

&lt;p&gt;I've been looking into &lt;a href="https://uberllm.dev/" rel="noopener noreferrer"&gt;UberLLM&lt;/a&gt;, which offers OpenAI- and Anthropic-compatible APIs behind one endpoint.&lt;/p&gt;

&lt;p&gt;If you'd like to explore it, here's my referral link: &lt;a href="https://uberllm.dev/?ref=755g76v" rel="noopener noreferrer"&gt;https://uberllm.dev/?ref=755g76v&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; This is a referral link. I may receive a commission if you sign up and purchase credits through it.&lt;/p&gt;

&lt;p&gt;I'd be interested to hear how other developers manage multiple LLM providers in production.&lt;/p&gt;

&lt;p&gt;Do you prefer direct integrations, a self-hosted gateway, or a managed API gateway?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
