<?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: Tyler Buell</title>
    <description>The latest articles on DEV Community by Tyler Buell (@tylerjrbuell).</description>
    <link>https://dev.to/tylerjrbuell</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%2F1294780%2F0fbf6ef0-5c83-47c0-9ae1-62fb1ede0c2b.jpg</url>
      <title>DEV Community: Tyler Buell</title>
      <link>https://dev.to/tylerjrbuell</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tylerjrbuell"/>
    <language>en</language>
    <item>
      <title>Reliable LLM agents in TypeScript: one harness you fully control, from a local 4B model to Claude</title>
      <dc:creator>Tyler Buell</dc:creator>
      <pubDate>Sat, 27 Jun 2026 00:16:49 +0000</pubDate>
      <link>https://dev.to/tylerjrbuell/reliable-typescript-ai-agents-the-same-code-finishes-on-a-4b-model-or-claude-and-survives-a-5985</link>
      <guid>https://dev.to/tylerjrbuell/reliable-typescript-ai-agents-the-same-code-finishes-on-a-4b-model-or-claude-and-survives-a-5985</guid>
      <description>&lt;p&gt;Every agent framework demo works. You wire up a couple of tools, point it at a frontier model, ask it something, and it nails it. Looks great in a tweet.&lt;/p&gt;

&lt;p&gt;Then you point it at a real task with a smaller model and watch it fall apart on the third tool call.&lt;/p&gt;

&lt;p&gt;That was most of my spring. I'd get an agent working nicely against Claude, swap in a local model to stop paying per token, and it would emit a tool call that was &lt;em&gt;almost&lt;/em&gt; right — a tool named &lt;code&gt;getServiceHealth&lt;/code&gt; instead of &lt;code&gt;get_service_health&lt;/code&gt;, a param called &lt;code&gt;svc&lt;/code&gt; instead of &lt;code&gt;service&lt;/code&gt;, a path with a stray quote — and the loop would just die. Re-prompt, retry, burn through iterations doing nothing, give up. The model could do the task. The harness around it couldn't keep the loop alive long enough to find out.&lt;/p&gt;

&lt;p&gt;So I stopped trying to fix the model and built the harness. It's called &lt;a href="https://github.com/tylerjrbuell/reactive-agents-ts" rel="noopener noreferrer"&gt;Reactive Agents&lt;/a&gt; — a composable TypeScript framework for building reliable LLM agents on a harness you fully control. It's organized around three things I kept wishing the other frameworks did:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reliability&lt;/strong&gt; — the loop actually finishes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparency&lt;/strong&gt; — I can see and steer every step instead of guessing at a black box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composability&lt;/strong&gt; — I add what I need and skip what I don't.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reliability is the part I'm proudest of, so let me show you instead of telling you. Here's the same agent — investigate a service alert, call two tools, correlate the data, recommend a fix — running on a 4B local model &lt;em&gt;and&lt;/em&gt; on Claude. The only thing that changes between the two runs is one line:&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%2Fnpi4b1oah14166uijnht.gif" 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%2Fnpi4b1oah14166uijnht.gif" alt="The same agent completing a tool-using investigation on a local 4B Ollama model and on Claude" width="800" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Same builder, two models
&lt;/h2&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ReactiveAgents&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;reactive-agents&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ReactiveAgents&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="nf"&gt;withProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ollama&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;withModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;qwen3:4b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;// runs on your laptop&lt;/span&gt;
  &lt;span class="c1"&gt;// .withProvider("anthropic").withModel("claude-sonnet-4-6") // frontier — same code, one line&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withReasoning&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withTools&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;getServiceHealth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getRecentDeploys&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="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The payments-api is alerting. Investigate with the health and recent-deploys &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tools, then tell me the likely cause and what to do.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;code&gt;if (local)&lt;/code&gt; branch. No second code path. The agent runs the same think → act → observe loop, calls &lt;code&gt;get_service_health&lt;/code&gt; and &lt;code&gt;get_recent_deploys&lt;/code&gt;, notices that the degradation lines up with a deploy from twelve minutes ago, and says: roll it back. On a 4B model and on Claude. (The two tools are plain &lt;code&gt;ToolBuilder.create(...)&lt;/code&gt; definitions — &lt;a href="https://github.com/tylerjrbuell/reactive-agents-ts/blob/main/apps/examples/src/demos/local-vs-frontier.ts" rel="noopener noreferrer"&gt;here's the demo source&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Let me be straight about what this is and isn't. A 4B model is not as smart as Claude, and I'm not pretending it is. The claim is narrower and a lot more useful: the &lt;em&gt;same code finishes the loop&lt;/em&gt;. So I build and test locally, on my own hardware, for free, and swap one line to a frontier model when the task actually needs the horsepower.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the small-model loop usually dies — and what keeps it alive
&lt;/h2&gt;

&lt;p&gt;Two things do most of the work.&lt;/p&gt;

&lt;p&gt;First, context profiles. Small models have a small effective context and drown in verbose prompts. So the local tier gets leaner prompts and more aggressive compaction:&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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withContextProfile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;   &lt;span class="c1"&gt;// lean prompts, aggressive compaction&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Second — and this is the one that actually moved the needle — a healing pass on tool calls. Remember the &lt;code&gt;getServiceHealth&lt;/code&gt;-instead-of-&lt;code&gt;get_service_health&lt;/code&gt; problem from the top? A naive loop sees "invalid tool" and gives up. The healing pipeline fixes the obvious near-misses — tool names, param aliases, paths, types — &lt;em&gt;before&lt;/em&gt; the call runs, so "almost right" becomes "ran." That one pass is the whole difference between the 4B run in that GIF finishing and stalling.&lt;/p&gt;

&lt;p&gt;You don't turn any of this on. It's just what &lt;code&gt;.withTools()&lt;/code&gt; does.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I actually trust in production: a typed runtime
&lt;/h2&gt;

&lt;p&gt;The local-model thing is the fun demo. The reason I'd run this on something that matters is underneath it.&lt;/p&gt;

&lt;p&gt;It's built on &lt;a href="https://effect.website" rel="noopener noreferrer"&gt;Effect-TS&lt;/a&gt;, which usually makes people groan, so let me get ahead of it: &lt;strong&gt;you don't write Effect to use this.&lt;/strong&gt; The builder and hooks are plain async functions.&lt;/p&gt;

&lt;p&gt;What you get for free is a runtime that's typed end to end. A failed tool call or a model timeout is a typed value in an explicit error channel — not an exception you meet for the first time in prod at 2am. Retries and fallbacks compose. Structured output is schema-checked before it lands in your hands.&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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withHook&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;act&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;timing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;after&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toolResults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;last&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;toolName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;            &lt;span class="c1"&gt;// that's the whole hook contract. no Effect.&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;h2&gt;
  
  
  You can see what it's doing
&lt;/h2&gt;

&lt;p&gt;This is the thing I missed most everywhere else. Every run is a fixed 12-phase lifecycle — bootstrap, guardrail, cost-route, think, act, observe, verify, and so on — and every phase has &lt;code&gt;before&lt;/code&gt; / &lt;code&gt;after&lt;/code&gt; / &lt;code&gt;on-error&lt;/code&gt; hooks. I can watch and steer any step, locally, without shipping my traces off to someone's dashboard.&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ReactiveAgents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HarnessProfile&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;reactive-agents&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ReactiveAgents&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="nf"&gt;withProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;anthropic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;withModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;HarnessProfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;balanced&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;   &lt;span class="c1"&gt;// memory + reactive intelligence + verifier&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withTools&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withBudget&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;tokenLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;      &lt;span class="c1"&gt;// hard spend cap&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Memory, MCP tools, multi-agent, durable resume — opt-in layers on the same engine. Add the ones you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the process dies mid-run, it picks up where it left off
&lt;/h2&gt;

&lt;p&gt;Here's the other half of reliability, and honestly the feature I'd lead with for anything long-running: agents crash. The box reboots, the container gets rescheduled, a deploy rolls your process. Usually that means starting the entire run over — and re-paying for every tool call and token you already spent.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;.withDurableRuns()&lt;/code&gt;, every iteration is checkpointed to disk. Kill the process mid-run, and a fresh one picks up the exact run from its last checkpoint and finishes it. The tools that already ran don't run again.&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%2Fsvd6cmpix3o17ixanrt9.gif" 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%2Fsvd6cmpix3o17ixanrt9.gif" alt="An agent checkpointing each step, getting killed mid-run, then a fresh process reconstructing the run from its last checkpoint and finishing it" width="800" height="536"&gt;&lt;/a&gt;&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="c1"&gt;// Process A — works, checkpoints each step, then gets hard-killed.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;                       &lt;span class="c1"&gt;// .withDurableRuns({ dir })&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;runStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ...process dies mid-run... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Process B — a fresh start, same agent, same dir.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;runId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listRuns&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;running&lt;/span&gt;&lt;span class="dl"&gt;"&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="nx"&gt;runId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resumeRun&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;runId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;       &lt;span class="c1"&gt;// reconstructs + finishes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same checkpoint machinery is what makes human-in-the-loop durable too: a gated tool call pauses the run, saves it, and someone can approve or deny it from a completely different process to pick it back up.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you should &lt;em&gt;not&lt;/em&gt; use this
&lt;/h2&gt;

&lt;p&gt;Let me save you some time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One provider, a simple loop?&lt;/strong&gt; Use that vendor's Agent SDK. You don't need a harness, and I won't be offended.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want the biggest ecosystem and the most tutorials today?&lt;/strong&gt; That's LangChain or Mastra, not me. This is early.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need something that's been battle-tested across a thousand production deployments right now?&lt;/strong&gt; It isn't that yet — v0.12, MIT, ~6,500 tests. I'd rather say that out loud than have you find out three weeks in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're comparing, the docs have honest side-by-sides with LangGraph, Mastra, the Vercel AI SDK, and the vendor Agent SDKs.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bun add reactive-agents
&lt;span class="c"&gt;# or: npm install reactive-agents&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/tylerjrbuell/reactive-agents-ts" rel="noopener noreferrer"&gt;https://github.com/tylerjrbuell/reactive-agents-ts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://docs.reactiveagents.dev" rel="noopener noreferrer"&gt;https://docs.reactiveagents.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The exact demo above: &lt;a href="https://github.com/tylerjrbuell/reactive-agents-ts/blob/main/apps/examples/src/demos/local-vs-frontier.ts" rel="noopener noreferrer"&gt;&lt;code&gt;apps/examples/src/demos/local-vs-frontier.ts&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you run the local-model path, I'd love to know which model you tried and whether the healing held up — that's the bit I most want people to throw real workloads at. Issues and feedback welcome; I read all of them.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>ai</category>
      <category>llm</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building an Agentic Framework from scratch 🚀</title>
      <dc:creator>Tyler Buell</dc:creator>
      <pubDate>Fri, 16 Jan 2026 21:32:37 +0000</pubDate>
      <link>https://dev.to/tylerjrbuell/building-an-agentic-framework-42h5</link>
      <guid>https://dev.to/tylerjrbuell/building-an-agentic-framework-42h5</guid>
      <description>&lt;h2&gt;
  
  
  Building an Agentic Framework for Smart, Reactive AI Agents
&lt;/h2&gt;

&lt;p&gt;AI Agents are rapidly playing a more prominent role in modern software development, but building them well is surprisingly tricky. In this article, I’ll share &lt;strong&gt;the design and development journey behind Reactive Agents&lt;/strong&gt;, a framework I built to make &lt;strong&gt;reactive, adaptable AI agents easy to create&lt;/strong&gt; while giving developers &lt;strong&gt;control, observability, and flexibility&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Challenge: Why Build a New Framework?
&lt;/h2&gt;

&lt;p&gt;I was honestly curious what it would take to build agents that can think and reason using their own strategies similar to how we go about tasks. Agentic frameworks at the time had little control over how to build decent agents with less code, so I wanted to try my take at it.&lt;/p&gt;

&lt;p&gt;Most existing agent frameworks either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Treat agents as &lt;strong&gt;simple LLM + tool loops&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Require verbose or repetitive setup&lt;/li&gt;
&lt;li&gt;Limit flexibility in reasoning or strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From day one, I wanted something different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agents that can &lt;strong&gt;think, act, and pivot&lt;/strong&gt; mid-task&lt;/li&gt;
&lt;li&gt;Clear and &lt;strong&gt;type-safe APIs&lt;/strong&gt; that are easy to reason about&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composable strategies&lt;/strong&gt; to adapt to any agentic task&lt;/li&gt;
&lt;li&gt;Observable events so developers always know &lt;strong&gt;what the agent is doing and why&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was simple: &lt;strong&gt;make building smart, reactive AI agents intuitive, safe, and powerful&lt;/strong&gt;, without sacrificing flexibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  Core Principles of Reactive Agents
&lt;/h2&gt;

&lt;p&gt;When designing the framework, I focused on several key principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Reactive Decision-Making&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Agents respond to &lt;strong&gt;task inputs and intermediate results&lt;/strong&gt; rather than following a fixed plan.&lt;/li&gt;
&lt;li&gt;Built-in reflection allows them to &lt;strong&gt;pivot strategies&lt;/strong&gt; if outcomes differ from expectations.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Tool Integration and MCP Support&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Agents can execute &lt;strong&gt;custom Python tools&lt;/strong&gt; or leverage &lt;strong&gt;MCP servers&lt;/strong&gt; for modular workflows.&lt;/li&gt;
&lt;li&gt;This enables distributed, multi-tool pipelines without complex orchestration.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Observability and Transparency&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Every agent action emits &lt;strong&gt;observable events&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Developers can track reasoning, tool usage, and decision paths in real time.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Composability and Type Safety&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Reasoning strategies are &lt;strong&gt;modular&lt;/strong&gt;, easy to swap, extend, or combine.&lt;/li&gt;
&lt;li&gt;Type-safe APIs reduce runtime errors and make development predictable.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ease of Use&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;builder pattern&lt;/strong&gt; provides a clean, minimal boilerplate setup.&lt;/li&gt;
&lt;li&gt;Quick startup time and wide model support make experimentation fast and rewarding.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Designing the Reactive Loop
&lt;/h2&gt;

&lt;p&gt;At the heart of the framework is the &lt;strong&gt;reactive loop&lt;/strong&gt;, which guides how an agent processes tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Receive Task&lt;/strong&gt; → Agent gets input from the user or system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reasoning Layer&lt;/strong&gt; → Decide which tools or strategies to use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Execution&lt;/strong&gt; → Run custom or MCP-based tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observe Feedback&lt;/strong&gt; → Track events, results, and outputs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reflect &amp;amp; Adapt&lt;/strong&gt; → Update strategy if needed, then repeat&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This architecture ensures agents are &lt;strong&gt;not static&lt;/strong&gt;. They &lt;strong&gt;learn and adapt in-flight&lt;/strong&gt;, making them suitable for a wide range of agentic tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diagram Concept:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task Input → Reasoning → Tool Execution → Observation → Reflection → Next Action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Implementation Highlights
&lt;/h2&gt;

&lt;p&gt;While building Reactive Agents, a few design choices stood out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Builder Pattern:&lt;/strong&gt; Simple, readable agent creation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composable Strategies:&lt;/strong&gt; Swap reasoning modules without rewriting the agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observable Events:&lt;/strong&gt; Makes debugging and insight seamless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type-Safe APIs:&lt;/strong&gt; Catch errors early, improve developer confidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Integration:&lt;/strong&gt; Supports distributed agent architectures and modular workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These choices collectively differentiate the framework from simpler orchestration layers or monolithic agent implementations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: Minimal Reactive Agent
&lt;/h2&gt;

&lt;p&gt;Below is an &lt;strong&gt;accurate, documented-aligned example&lt;/strong&gt; showing a reactive agent using &lt;strong&gt;both a custom Python tool and an MCP tool&lt;/strong&gt;:&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;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;reactive_agents.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ReactAgentBuilder&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;reactive_agents.tools.decorators&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;

&lt;span class="c1"&gt;# Define a simple custom tool
&lt;/span&gt;&lt;span class="nd"&gt;@tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Greet a user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Use this tool to greet the user by their provided name&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;! Welcome to Reactive Agents.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;ReactAgentBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DemoAgent&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;span class="nf"&gt;with_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama:qwen3:4b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# Example model string
&lt;/span&gt;        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_tools&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brave-search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# Auto-detects MCP tools vs custom tools
&lt;/span&gt;        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_observable_events&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;              &lt;span class="c1"&gt;# Track events
&lt;/span&gt;        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;result&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;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Greet a new user and fetch latest news about AI.&lt;/span&gt;&lt;span class="sh"&gt;"&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;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Lessons Learned While Building the Framework
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Design for observability early&lt;/strong&gt; – It’s hard to debug complex agents without event tracking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make reasoning modular&lt;/strong&gt; – Composable strategies allow experimentation without breaking existing code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep APIs intuitive&lt;/strong&gt; – Developers should spend more time designing agents than wrestling with setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support multiple tools and providers&lt;/strong&gt; – Flexibility is essential for real-world agentic tasks.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Looking Forward
&lt;/h2&gt;

&lt;p&gt;Reactive Agents is &lt;strong&gt;alpha-stage&lt;/strong&gt;, but production-ready. APIs may evolve, but the &lt;strong&gt;core principles are stable&lt;/strong&gt;: reactive loops, composable reasoning, observability, and tool integration.&lt;/p&gt;

&lt;p&gt;I hope this framework inspires developers to &lt;strong&gt;explore agentic AI in new ways&lt;/strong&gt;, creating smarter applications that don’t just respond, but &lt;strong&gt;reason, act, and improve&lt;/strong&gt; dynamically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get Involved
&lt;/h2&gt;

&lt;p&gt;Try it, star the repo, or contribute:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/tylerjrbuell/reactive-agents" rel="noopener noreferrer"&gt;https://github.com/tylerjrbuell/reactive-agents&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>opensource</category>
      <category>automation</category>
    </item>
    <item>
      <title>Supercharge Your Productivity with Ollama + Open Web UI and Large Language Models</title>
      <dc:creator>Tyler Buell</dc:creator>
      <pubDate>Thu, 07 Mar 2024 19:45:40 +0000</pubDate>
      <link>https://dev.to/tylerjrbuell/supercharge-your-productivity-with-ollama-open-web-ui-and-large-language-models-51eo</link>
      <guid>https://dev.to/tylerjrbuell/supercharge-your-productivity-with-ollama-open-web-ui-and-large-language-models-51eo</guid>
      <description>&lt;p&gt;As a developer, productivity is crucial in today's fast-paced tech industry. One effective way to boost your productivity and tackle challenges efficiently is by utilizing large language models (LLMs). Most developers are probably familiar with LLMs such as OpenAI's GPT-3.5 and GPT-4, however, other alternatives exist that are private (no more sending your data to OpenAI), open source, and free of cost! In this article, we will explore how to harness the power of these tools to enhance your daily tasks and problem-solving abilities.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Understanding the Tools&lt;/strong&gt;:&lt;/u&gt; First, it's essential to familiarize yourself with &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;, a lightweight service that can be easily installed on all platforms and makes getting up and running with local LLMs a breeze. With Ollama, developers can run, customize, and even create their own models. The &lt;a href="https://docs.openwebui.com/" rel="noopener noreferrer"&gt;Open Web UI&lt;/a&gt; interface is a progressive web application designed specifically for interacting with Ollama models in real time. You can think of the Open Web UI like the Chat-GPT interface for your local models. The Open Web UI Interface is an extensible, feature-rich, and user-friendly tool that makes interacting with LLMs effortless. Open Web UI allows you to engage in conversations with multiple models simultaneously, harnessing their unique strengths for optimal responses. They can also integrate OpenAI API for even more versatile conversations.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Setting up the Environment&lt;/strong&gt;&lt;/u&gt;: To get started, install Ollama on your local machine or container using the install options for your platform of choice. Once Ollama is installed and running it's time to run the Open Web UI interface. There are many provided methods for installation, however, Docker is by far the easiest. Run the following command 👇 (assuming you already have Docker installed on your machine)&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;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:8080 &lt;span class="nt"&gt;--add-host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host.docker.internal:host-gateway &lt;span class="nt"&gt;-v&lt;/span&gt; open-webui:/app/backend/data &lt;span class="nt"&gt;--name&lt;/span&gt; open-webui &lt;span class="nt"&gt;--restart&lt;/span&gt; always ghcr.io/open-webui/open-webui:main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, visit the Open Web UI interface by opening your web browser and navigating to &lt;code&gt;http://localhost:8000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Create a local admin user at the login screen by clicking &lt;code&gt;sign up&lt;/code&gt; which will then allow you to log in to the interface.&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.amazonaws.com%2Fuploads%2Farticles%2Fwrnnxlc6xcix3q32b2ri.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.amazonaws.com%2Fuploads%2Farticles%2Fwrnnxlc6xcix3q32b2ri.png" alt="Open Web UI Sign Up" width="452" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before you can begin chatting, you must first download your first model. Go to the settings popup and under models, you can enter any model name to download from the &lt;a href="https://ollama.com/library" rel="noopener noreferrer"&gt;list of supported Ollama models&lt;/a&gt; (see screenshot)&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.amazonaws.com%2Fuploads%2Farticles%2Fzbr7313tyccaabo16e2p.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.amazonaws.com%2Fuploads%2Farticles%2Fzbr7313tyccaabo16e2p.png" alt="Downloading models with the Open Web UI" width="676" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Boosting Productivity&lt;/strong&gt;:&lt;/u&gt; Now that you have your tools prepped and ready, it's time to leverage the power of LLMs to take your daily workflows to the next level! Here are some examples of how you can use Ollama + Open Web UI to be a more productive developer:&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Coding Assistant&lt;/strong&gt;: The most obvious way to use these tools is to use code models such as &lt;code&gt;starcoder&lt;/code&gt; to help you with code suggestions, writing boilerplate or project organization tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Brainstorming Assistant&lt;/strong&gt;: Create a custom model in the Open Web UI with a specific prompt to be your &lt;code&gt;Rubber Ducky&lt;/code&gt; to bounce ideas off of and help you debug those pesky bugs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature Requirement Analyst&lt;/strong&gt;: Use the Open Web UI documents feature to upload feature requirement documents such as CSV or PDF files and use them in your chat conversations to easily probe into and summarize deep topics that you will need to write your features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev.to Article Assistant&lt;/strong&gt;: Add a URL into your chat conversations to let the LLM assist you in parsing real-time website data to give you ideas on your next article (kind of like I did with this one 😉)&lt;/p&gt;

&lt;p&gt;These are just &lt;em&gt;some&lt;/em&gt; examples of how to use these tools to make your daily workflows more productive but the sky is the limit!&lt;/p&gt;

&lt;p&gt;In conclusion, by incorporating Ollama's seamless local platform to run open-source large language models coupled with the feature-rich and user-friendly Open Web UI interface into your daily development tasks, you can significantly enhance your problem-solving abilities and increase your overall productivity. Give it a try today and join the growing community of developers who are already supercharging their coding experiences!&lt;/p&gt;

</description>
      <category>ollama</category>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
