<?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>Stop Trusting Your Agent Framework. Start Controlling It.</title>
      <dc:creator>Tyler Buell</dc:creator>
      <pubDate>Sat, 19 Sep 2026 20:23:03 +0000</pubDate>
      <link>https://dev.to/tylerjrbuell/stop-trusting-your-agent-framework-start-controlling-it-1mia</link>
      <guid>https://dev.to/tylerjrbuell/stop-trusting-your-agent-framework-start-controlling-it-1mia</guid>
      <description>&lt;p&gt;Most agent frameworks ask you to trust a black box. You hand it a model and a prompt, it hands back an answer, and everything in between, the reasoning, the tool selection, the context management, happens somewhere you can't see and can't touch. That works fine until it doesn't, and when it doesn't, you're debugging a system that was never designed to be debugged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tylerjrbuell/reactive-agents-ts" rel="noopener noreferrer"&gt;Reactive Agents&lt;/a&gt; started from a different premise: you shouldn't need to trust a bigger model to paper over a weak harness, or a proprietary runtime you can't see inside. It's an open source TypeScript framework, MIT licensed, now at v0.16, built on the idea that the engineering around the model is what makes an agent reliable, and that engineering should be visible and yours to shape, not hidden behind someone else's abstraction.&lt;/p&gt;

&lt;p&gt;This is a look at what that turned into.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nothing runs that you didn't ask for
&lt;/h2&gt;

&lt;p&gt;That founding idea shows up directly in how you build an agent.&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="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="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;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 &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;recent-deploys 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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every &lt;code&gt;.with()&lt;/code&gt; call turns on exactly one thing. No memory writes unless you called &lt;code&gt;.withMemory()&lt;/code&gt;. No guardrail scanning unless you asked for it. No hidden system prompt doing work you didn't sign up for. If you've ever inherited an agent built on a framework where you genuinely don't know what's happening inside a single &lt;code&gt;.invoke()&lt;/code&gt; call, that's the exact discomfort this API is designed to remove.&lt;/p&gt;

&lt;h2&gt;
  
  
  The insight that shaped everything else: a harness makes the model smarter and more reliable
&lt;/h2&gt;

&lt;p&gt;Here's the idea underneath most of the framework's design decisions: most of what makes an agent capable isn't the model, it's the engineering around it. Better prompts. Better context management. Better memory. Better recovery when something goes slightly wrong. That insight is easiest to see by watching it in action. Take the builder above and change one line:&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="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;// your laptop, $0&lt;/span&gt;
  &lt;span class="c1"&gt;// .withProvider("anthropic").withModel("claude-sonnet-4-6")  // frontier, same code&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both finish the same investigation: call both tools, notice the degraded error rate lines up with a deploy from twelve minutes ago, recommend a rollback. A 4B local model is obviously not as capable as Claude, and nobody working on this framework would tell you otherwise. What's different is narrower and more useful: the harness finishes the loop regardless of which model is behind it, so you can build and iterate for free against a small local model and reach for the frontier one only when a task actually needs the extra reasoning power.&lt;/p&gt;

&lt;p&gt;Two key things make that possible. Model-adaptive context profiles tune prompt density and compaction per model tier, since a small model drowns in the same verbose prompt a frontier model handles easily. And a healing pipeline sits in front of every tool call, catching the small ways smaller models get it almost right: a tool name off by a naming convention, a parameter sent under an alias, a malformed path. Instead of the loop dying on "invalid tool," the call gets repaired and runs. Underneath both, an FC-dialect probe picks native function-calling where a provider supports it and falls back to a tiered text-parsing driver where it doesn't, which is the actual reason a small open model and Claude can share one code path at all.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnpi4b1oah14166uijnht.gif" alt="The same agent investigating a service alert, calling two tools, and recommending a fix, completing on a local 4B Ollama model and on Claude, with only the provider/model line changed" width="800" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A visible lifecycle instead of a hidden loop
&lt;/h2&gt;

&lt;p&gt;Every agent run moves through a fixed, named sequence of phases, bootstrap, guardrail, cost-route, think, act, observe, verify, and on through termination, and every phase exposes hooks before and after it runs:&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 called:&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="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;That's the whole contract. The framework is built on &lt;a href="https://effect.website" rel="noopener noreferrer"&gt;Effect-TS&lt;/a&gt; underneath, which tends to make people wary, so it's worth saying plainly: you don't have to write Effect to use any of this. The builder and every hook you write are ordinary functions. What Effect buys you underneath is a runtime where a failed tool call or a provider timeout is a typed value in an explicit error channel instead of an exception you meet for the first time in production, and where retries, fallbacks, and timeouts compose instead of tangling into nested try/catch blocks.&lt;/p&gt;

&lt;p&gt;The same philosophy shows up in what the framework hands back when a run finishes. Every result includes a &lt;code&gt;receipt&lt;/code&gt;, a claim-to-evidence record backed by an append-only ledger of what actually happened during the run. Not "trust me," an actual object you can inspect or log:&lt;br&gt;
&lt;/p&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;"verdict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tool-grounded"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"heuristic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&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.91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"toolsUsed"&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="s2"&gt;"get_service_health"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_recent_deploys"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"toolCallStats"&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;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;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;"failed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&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;"deliverables"&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;"spec"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"produce the file ./report.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"produced"&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;If you asked for three files and only two got produced, &lt;code&gt;deliverables&lt;/code&gt; names the one that never landed instead of the agent narrating success anyway. There's a fabrication guard on by default that rejects invented empirical claims not backed by anything the tools actually observed, and a dedicated termination state, &lt;code&gt;terminatedBy: "abstained"&lt;/code&gt;, for when grounding is structurally impossible, so the agent says why it stopped instead of confidently making something up. You can even have the framework sign that receipt with Ed25519 so it can't be altered after the fact:&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;privateKeyJwk&lt;/span&gt; &lt;span class="p"&gt;}&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;generateReceiptKeyPair&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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withReceiptSigning&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;privateKeyJwk&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reliability that survives the real world, not just the demo
&lt;/h2&gt;

&lt;p&gt;Long-running agents die mid-task. Processes get rescheduled, containers restart, someone kills the wrong terminal. &lt;code&gt;.withDurableRuns()&lt;/code&gt; checkpoints every step to disk, so a fresh process can pick a run back up from its last checkpoint and finish it without re-running the tools that already completed:&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 dies.&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;/* the process gets killed here */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Process B: fresh process, same store.&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same checkpoint machinery backs durable human-in-the-loop approvals. Mark a tool as requiring approval, and when the agent tries to call it, the run pauses and persists an &lt;code&gt;awaiting-approval&lt;/code&gt; state instead of just blocking in memory:&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;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;deleteRecordsTool&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;withDurableRuns&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;dir&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withApprovalPolicy&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;delete-records&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;detach&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A person can approve or deny that action from a completely different process, hours later, and the run resumes exactly where it paused. That's a different guarantee than "the agent asks a question and waits," because "waits" usually means the run only survives as long as one process happens to stay alive.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsvd6cmpix3o17ixanrt9.gif" alt="An agent checkpointing each step to disk, 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;/p&gt;

&lt;h2&gt;
  
  
  Composable reasoning, not one hardcoded loop
&lt;/h2&gt;

&lt;p&gt;Reasoning was never meant to be a single fixed algorithm. Eight strategies live in the strategy registry today: ReAct, Blueprint (a plan-once-execute-in-parallel strategy), Reflexion, Plan-Execute, Tree-of-Thought, Adaptive (a meta-strategy that picks among the others), Direct, and an experimental Code-Action strategy. Swapping one in is a builder call:&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="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="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="na"&gt;defaultStrategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tree-of-thought&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;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;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A reactive controller also watches for stalls, loops, and context pressure mid-run and can trigger early-stop, compression, or a strategy switch on its own, which is the difference between an agent that spins for ten iterations repeating itself and one that notices and adjusts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory when you actually want it, not by default
&lt;/h2&gt;

&lt;p&gt;Memory is opt-in, off until you call &lt;code&gt;.withMemory()&lt;/code&gt;, a deliberate choice made after finding it wasn't earning its cost in every configuration:&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="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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withMemory&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;standard&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;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;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Turn it on and you get four layers, working, episodic, semantic (vector search plus full-text search), and procedural, backed by SQLite with background consolidation. A Living Skills system, SKILL.md-compatible and LLM-refined over time, lets an agent accumulate know-how across sessions without you hand-growing a prompt to hold it all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guardrails, identity, and knowing what it costs
&lt;/h2&gt;

&lt;p&gt;Letting an agent touch anything real means answering questions a demo never has to: can it be prompt-injected, does it leak PII, who is allowed to invoke it, what happens if it runs away and burns through your budget.&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="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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withGuardrails&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                          &lt;span class="c1"&gt;// injection, PII, toxicity&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, survives restarts&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;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent identity is backed by real Ed25519 certificates with role-based access and delegation chains, not a naming convention. On the cost side, a multi-factor complexity router can send each run to the cheapest model capable of handling it, and a semantic cache skips redundant LLM calls for similar queries. Verification runs on the output side of that same concern: semantic entropy checks, fact decomposition, and NLI-based hallucination detection catch a confident answer that isn't actually backed by anything, before it reaches a user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composing agents, not just calling one
&lt;/h2&gt;

&lt;p&gt;A single agent handles a lot, but some tasks are naturally a pipeline or a fan-out. Functional combinators let you build those without hand-rolling orchestration: &lt;code&gt;pipe()&lt;/code&gt; chains agents so one's output feeds the next's input, &lt;code&gt;parallel()&lt;/code&gt; runs several concurrently and collects the results, and &lt;code&gt;race()&lt;/code&gt; returns whichever finishes first. &lt;code&gt;agentFn()&lt;/code&gt; wraps a builder into a lazy, callable primitive so these compose cleanly:&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;agentFn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pipe&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;research&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agentFn&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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="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;withTools&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;summarize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agentFn&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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="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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;research&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;summarize&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="nf"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Find recent TypeScript runtime benchmarks and summarize them&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For agents that need to call each other across process or network boundaries, the A2A protocol implementation gives you Agent Cards, a JSON-RPC 2.0 server and client, SSE streaming, and agent-as-tool, so one agent can discover and delegate to another the same way it would call a regular tool. Sub-agents can also be spawned dynamically under a depth limit, for tasks where the shape of the work isn't known up front.&lt;/p&gt;

&lt;h2&gt;
  
  
  Talking to an agent, and watching it think
&lt;/h2&gt;

&lt;p&gt;Not every interaction is a single &lt;code&gt;run()&lt;/code&gt; call. &lt;code&gt;agent.chat()&lt;/code&gt; handles one-shot Q&amp;amp;A against an agent's prior run context, and &lt;code&gt;agent.session()&lt;/code&gt; gives you a proper multi-turn conversation with its own history:&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="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&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;session&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;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What did the investigation find?&lt;/span&gt;&lt;span class="dl"&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;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Now draft a Slack message about it&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For watching a run happen rather than just reading its output afterward, Cortex Studio is a local dev UI, started with &lt;code&gt;.withCortex()&lt;/code&gt; or &lt;code&gt;rax run --cortex&lt;/code&gt;, that shows a live agent canvas, an entropy signal, per-step token usage, and a full execution trace with an AI-generated debrief when a run finishes. It's the same event stream the framework publishes internally, just rendered, so there's nothing it can show you that isn't also available to your own code through the hooks and EventBus.&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%2Faaee7s2m602llrrjav00.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%2Faaee7s2m602llrrjav00.png" alt="Cortex Studio's live agent canvas showing cognitive state, entropy signal, and per-step token usage" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring an agent into everything around it
&lt;/h2&gt;

&lt;p&gt;An agent that only runs from a script isn't much use to most products, so the integration surface is real. &lt;code&gt;@reactive-agents/ui-core&lt;/code&gt; is a headless, framework-agnostic core with a versioned wire protocol and a resumable stream client, and &lt;code&gt;@reactive-agents/react&lt;/code&gt;, &lt;code&gt;vue&lt;/code&gt;, and &lt;code&gt;svelte&lt;/code&gt; build hooks and components on top of it. All of them consume &lt;code&gt;agent.runStream()&lt;/code&gt; through &lt;code&gt;AgentStream.toSSE()&lt;/code&gt;, so wiring an agent into a Next.js, SvelteKit, or Nuxt route is a one-line SSE endpoint rather than a bespoke streaming protocol.&lt;/p&gt;

&lt;p&gt;On the inbound side, a persistent gateway package handles adaptive heartbeats, cron scheduling, webhook ingestion with a GitHub adapter, and a composable policy engine for routing events to the right agent, which is what turns an agent from something you call into something that runs on its own. Tools aren't limited to hand-written functions either; MCP servers plug in through &lt;code&gt;.withMCP()&lt;/code&gt;, with container lifecycle handled for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this framework isn't the right call
&lt;/h2&gt;

&lt;p&gt;Worth being direct about this rather than glossing over it.&lt;/p&gt;

&lt;p&gt;If you're on one provider with a simple, mostly linear loop, use that vendor's own Agent SDK. You don't need a harness underneath you, and reaching for one here adds weight for no reason.&lt;/p&gt;

&lt;p&gt;If you want the largest ecosystem and the most tutorials on the internet right now, that's LangChain or Mastra, not this. Reactive Agents is younger and the community is smaller.&lt;/p&gt;

&lt;p&gt;If you need something proven across a large number of production deployments today, say so honestly: it's actively developed, with a real test suite (well over nine thousand tests) and a typed foundation throughout, but it's still v0.16. Better to say that up front than have someone find out three weeks into a migration.&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;/ul&gt;

&lt;p&gt;The point of building this in the open is that the harness is yours to reshape. If a phase doesn't behave the way your use case needs, the hook is right there. If none of the eight reasoning strategies fit, register your own. If you build something with it, or push a local model past what the healing pipeline can currently repair, that's genuinely useful to hear about. Issues and feedback welcome.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>typescript</category>
      <category>ai</category>
      <category>mcp</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>
