<?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: seif</title>
    <description>The latest articles on DEV Community by seif (@astrosbd).</description>
    <link>https://dev.to/astrosbd</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3863405%2Fe28fb958-5898-40e1-bc2c-afb97630a293.png</url>
      <title>DEV Community: seif</title>
      <link>https://dev.to/astrosbd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/astrosbd"/>
    <language>en</language>
    <item>
      <title>I Built a CLI That Talks to 13 LLM Providers — Here's What I Learned</title>
      <dc:creator>seif</dc:creator>
      <pubDate>Mon, 06 Apr 2026 09:49:45 +0000</pubDate>
      <link>https://dev.to/astrosbd/i-built-a-cli-that-talks-to-13-llm-providers-heres-what-i-learned-13ok</link>
      <guid>https://dev.to/astrosbd/i-built-a-cli-that-talks-to-13-llm-providers-heres-what-i-learned-13ok</guid>
      <description>&lt;p&gt;A few months ago, I hit a wall with AI coding tools.&lt;/p&gt;

&lt;p&gt;Not because they were bad. In fact, some of them were incredibly good. The problem was that each one came with an invisible asterisk: &lt;em&gt;great, as long as you stay inside this vendor's world&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Use this model, this API shape, this tool format, this auth flow, this worldview.&lt;/p&gt;

&lt;p&gt;As a developer, that started to bother me more and more.&lt;/p&gt;

&lt;p&gt;I wanted a coding agent CLI that felt serious enough for real work, but open enough that I could swap providers, inspect the runtime, and build on top of it without fighting a black box.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;cloclo&lt;/strong&gt;: an open-source MIT-licensed CLI that can talk to 13 LLM providers through one runtime.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cloclo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why I started: vendor lock-in was slowing me down
&lt;/h2&gt;

&lt;p&gt;If you build deeply around one API, you inherit all of its assumptions: how system instructions are passed, how tools are defined, how streaming behaves, how auth works.&lt;/p&gt;

&lt;p&gt;The moment you try another provider, the "portable" abstraction starts leaking everywhere.&lt;/p&gt;

&lt;p&gt;So instead of building a thin compatibility layer, I started building a runtime that treats providers as interchangeable &lt;strong&gt;where possible&lt;/strong&gt;, but explicitly models their differences &lt;strong&gt;where necessary&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The hard part: making 13 APIs feel like one
&lt;/h2&gt;

&lt;p&gt;The biggest challenge wasn't adding provider number 13. It was deciding what the abstraction should &lt;em&gt;not&lt;/em&gt; hide.&lt;/p&gt;

&lt;p&gt;What worked better was a contract-based approach: provider detection, auth resolution, model normalization, capability flags, instruction placement, tool calling conversion, streaming adaptation.&lt;/p&gt;

&lt;p&gt;In other words: one runtime, but not one delusion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cloclo &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"review this codebase and suggest simplifications"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That should feel like one command. But under the hood, the runtime transforms prompts differently depending on the provider.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I designed AICL
&lt;/h2&gt;

&lt;p&gt;As the CLI evolved, I realized I was building an environment where agents needed to communicate with each other in a structured way.&lt;/p&gt;

&lt;p&gt;Plain text works surprisingly far — until it doesn't.&lt;/p&gt;

&lt;p&gt;So I designed &lt;strong&gt;AICL&lt;/strong&gt;: an agent-to-agent notation for structured semantic exchange.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ω:cloclo | ψ:fix(auth_bug) | ◊:missing_null_guard σ:0.88 | λ:read→patch→test | ∇:ship
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That line encodes: who owns the message, the intent, confidence level, planned actions, and direction. If you want agents to collaborate without smearing everything into natural-language mush, you need some shared structure.&lt;/p&gt;




&lt;h2&gt;
  
  
  What surprised me about models in agent loops
&lt;/h2&gt;

&lt;p&gt;A model can look brilliant in a single-turn demo and fall apart in an agent loop.&lt;/p&gt;

&lt;p&gt;Agent loops reward: instruction fidelity over charisma, consistency over cleverness, stable tool use over eloquent prose, and willingness to say "I don't know" over confident improvisation.&lt;/p&gt;

&lt;h3&gt;
  
  
  The best chat model is not always the best agent model
&lt;/h3&gt;

&lt;p&gt;Some models sound amazing but become unreliable when they need to follow a loop like: inspect → choose tool → wait for result → revise plan → continue.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tool discipline matters more than raw intelligence
&lt;/h3&gt;

&lt;p&gt;A model that uses tools conservatively and accurately is often more useful than a "creative" model that keeps making assumptions.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The more interesting work is: improving routing between providers, making multi-agent workflows more dependable, sharpening tool safety, expanding the skill system, and making the runtime easier for others to extend.&lt;/p&gt;

&lt;p&gt;If AI agents are going to become real software components, they need better ways to express intent, uncertainty, verification, and handoff.&lt;/p&gt;

&lt;p&gt;That's what cloclo is really exploring.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cloclo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're building in this space too, I'd genuinely love to hear what breaks first for you: provider abstraction, tool calling, or agent reliability.&lt;/p&gt;

&lt;p&gt;My bet: all three, just in a different order.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>llm</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
