<?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: Prabod Rathnayaka</title>
    <description>The latest articles on DEV Community by Prabod Rathnayaka (@prabod_bc).</description>
    <link>https://dev.to/prabod_bc</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%2F4180882%2Fea57415c-ad54-4fa9-9f39-3a295be86c49.png</url>
      <title>DEV Community: Prabod Rathnayaka</title>
      <link>https://dev.to/prabod_bc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/prabod_bc"/>
    <language>en</language>
    <item>
      <title>Introducing Superfluid: the local-AI native LLM server for multi-agent inference</title>
      <dc:creator>Prabod Rathnayaka</dc:creator>
      <pubDate>Tue, 13 Oct 2026 03:33:23 +0000</pubDate>
      <link>https://dev.to/prabod_bc/introducing-superfluid-the-local-ai-native-llm-server-for-multi-agent-inference-26mh</link>
      <guid>https://dev.to/prabod_bc/introducing-superfluid-the-local-ai-native-llm-server-for-multi-agent-inference-26mh</guid>
      <description>&lt;p&gt;The future of local AI is agentic and requires multiple agents to share one machine: one agent summarising your emails overnight, one watching your health data and one doing the shopping, while you are still able to chat and ask questions in between. Today's inference servers were built for throughput on data centre racks, not for one person sharing a laptop with eight agents. Without prioritisation, your question waits behind whatever is already running and without logging, a restart takes every session with it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://superfluid.sh" rel="noopener noreferrer"&gt;&lt;strong&gt;Superfluid&lt;/strong&gt;&lt;/a&gt; is an open-source (Apache-2.0) server for running LLMs on your own machine. Our server supports the OpenAI, Anthropic and Ollama APIs and various runtimes: llama.cpp for GGUF models, MLX for MLX directories, the &lt;a href="https://github.com/basecompute/baseRT" rel="noopener noreferrer"&gt;BaseRT&lt;/a&gt; engine for &lt;code&gt;.base&lt;/code&gt; bundles.&lt;/p&gt;

&lt;p&gt;Superfluid was built for multi-agent workloads on one machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://superfluid.sh/install.sh | sh
superfluid serve unsloth/Qwen3.8-27B-GGUF:UD-Q4_K_M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fcdn-uploads.huggingface.co%2Fproduction%2Fuploads%2F6a38d55b56a1afe98dd3bb43%2FrSw4nFQtZdjhFZysjzjgm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fcdn-uploads.huggingface.co%2Fproduction%2Fuploads%2F6a38d55b56a1afe98dd3bb43%2FrSw4nFQtZdjhFZysjzjgm.gif" width="600" alt="Eight agents each reading a 7.5k-token document; a chat question two seconds in is answered in 0.36 s through superfluid, while the same chat behind llama-server is still waiting for its first token" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Eight agents working on 7.5k-token documents, then a chat question arrives after two seconds. Superfluid produces an answer in 0.36s, &lt;code&gt;llama-server&lt;/code&gt; takes over 10 seconds. That's a 30x faster response for the same model on the same Mac.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your chat is answered while agents work.&lt;/strong&gt; Interactive requests preempt batch work at the next scheduler tick instead of waiting behind it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing is lost when a process dies.&lt;/strong&gt; Every token is written to a log before you see it. A crashed worker or a restarted server picks its sessions up where it left off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A shared prompt is computed once.&lt;/strong&gt; 32 requests with the same system prompt cost one prefill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One server for every runtime.&lt;/strong&gt; The same APIs, tool calling, structured output and chat templates on llama.cpp, MLX and BaseRT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-device inference&lt;/strong&gt; You add additional devices to your private cloud with a single command over an encrypted link.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Install for macOS (Apple silicon) or Linux (x86-64, arm64). On Apple silicon and Linux, the BaseRT engine is installed per default, while llama.cpp and MLX are installed automatically when needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://superfluid.sh/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or &lt;code&gt;cargo install superfluid&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Serve a GGUF from Hugging Face. The tag picks the quantization:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;superfluid serve unsloth/Qwen3.8-27B-GGUF:UD-Q4_K_M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Call it with anything that speaks the OpenAI API. Anthropic's SDK and Ollama clients pointed at the server address equally work:&lt;br&gt;
&lt;/p&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://127.0.0.1:8453/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;not-needed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;stream&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;unsloth/Qwen3.8-27B-GGUF&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;Explain KV caching in two sentences.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&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="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An MLX model works the same way: &lt;code&gt;superfluid serve mlx-community/Qwen3-4B-4bit&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run a coding agent
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;superfluid launch claude &lt;span class="nt"&gt;--model&lt;/span&gt; unsloth/Qwen3.8-27B-GGUF:UD-Q4_K_M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;launch&lt;/code&gt; starts the server if none is running and runs the agent pointed at it. It works for Claude Code, Codex, pi, OpenCode, Hermes Agent, Cline, OpenClaw and the Ollama CLI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run multi-device inference
&lt;/h2&gt;

&lt;p&gt;One machine is the head server. Create a token there and serve with a listener for nodes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;superfluid fleet token
superfluid serve unsloth/Qwen3.8-27B-GGUF:UD-Q4_K_M &lt;span class="nt"&gt;--http&lt;/span&gt; 0.0.0.0:8453 &lt;span class="nt"&gt;--fleet-listen&lt;/span&gt; 0.0.0.0:8454
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On each other machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;superfluid node &lt;span class="nb"&gt;join&lt;/span&gt; &lt;span class="nt"&gt;--model&lt;/span&gt; unsloth/Qwen3.8-27B-GGUF:UD-Q4_K_M &lt;span class="nt"&gt;--token&lt;/span&gt; &amp;lt;the token&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The node finds the head on the local network, pulls the model, and serves it over a link encrypted with the token. The head places whole sessions on nodes and only sampled tokens come back. If a node dies mid-stream, its session is replaced and no token is delivered twice. Nodes can run different runtimes for the same model: BaseRT on a Mac next to llama.cpp on a Linux box.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8l5vhhx46w0cykobv2no.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8l5vhhx46w0cykobv2no.png" alt="Coding agents and any OpenAI, Anthropic or Ollama client reach one superfluid server, which drives baseRT, llama.cpp and MLX workers on this machine and on other machines that join it" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;We measured performance with the native &lt;code&gt;superfluid/tools/suite&lt;/code&gt; on an Apple M5 Pro with Qwen3.8-27B at 4 bits, where each server deploys the same runtime.&lt;/p&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;code&gt;superfluid&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;llama-server&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Ollama&lt;/th&gt;
&lt;th&gt;&lt;code&gt;mlx_lm.server&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TTFT for a chat request behind 8 agents:&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.5 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;291 s&lt;/td&gt;
&lt;td&gt;380 s&lt;/td&gt;
&lt;td&gt;612 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache hits for 32 requests sharing a 4k-token prompt:&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;97%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;97%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time to serve after inference worker killed mid-stream&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.8 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;1.8 s, stream truncated&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fcdn-uploads.huggingface.co%2Fproduction%2Fuploads%2F6a38d55b56a1afe98dd3bb43%2FfFxkUh3bCcJNQBc_ST8mo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fcdn-uploads.huggingface.co%2Fproduction%2Fuploads%2F6a38d55b56a1afe98dd3bb43%2FfFxkUh3bCcJNQBc_ST8mo.gif" width="480" alt="Superfluid serve, the terminal monitor, while eight agents prefill on baseRT: lanes fill, prefill peaks near 1,000 tokens per second, a chat preempts a lane, decode starts and the KV pool grows" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The serving layer adds no overhead, but increases performance in several scenarios: at one and eight concurrent requests, llama.cpp served through Superfluid matches &lt;code&gt;llama-server&lt;/code&gt; on tokens per second.  Superfluid batches MLX requests that &lt;code&gt;mlx_lm.server&lt;/code&gt; serves less efficiently one at a time. Find every method and evaluation on the website: &lt;a href="https://superfluid.sh/latest/performance/benchmarks/" rel="noopener noreferrer"&gt;superfluid.sh/latest/performance/benchmarks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Try it, break it, and tell us what you find.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/basecompute/superfluid" rel="noopener noreferrer"&gt;github.com/basecompute/superfluid&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://superfluid.sh" rel="noopener noreferrer"&gt;superfluid.sh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Discord: &lt;a href="https://discord.gg/kaYmAGckCq" rel="noopener noreferrer"&gt;discord.gg/kaYmAGckCq&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
