<?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: angdem</title>
    <description>The latest articles on DEV Community by angdem (@angdem).</description>
    <link>https://dev.to/angdem</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3972368%2F1910d743-af9f-45c4-893e-6e26eb61766d.png</url>
      <title>DEV Community: angdem</title>
      <link>https://dev.to/angdem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/angdem"/>
    <language>en</language>
    <item>
      <title>AgentUnit: Shipping AI like Software</title>
      <dc:creator>angdem</dc:creator>
      <pubDate>Sun, 07 Jun 2026 10:29:24 +0000</pubDate>
      <link>https://dev.to/angdem/agentunit-shipping-ai-like-software-1e9c</link>
      <guid>https://dev.to/angdem/agentunit-shipping-ai-like-software-1e9c</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Not a framework. Not a runtime. A &lt;strong&gt;packaging standard&lt;/strong&gt; for AI Agents.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/agentunit-io/agentunit" rel="noopener noreferrer"&gt;https://github.com/agentunit-io/agentunit&lt;/a&gt;&lt;br&gt;
Longer story: &lt;a href="https://github.com/agentunit-io/agentunit/blob/main/blog/why-agentunit-exists.md" rel="noopener noreferrer"&gt;https://github.com/agentunit-io/agentunit/blob/main/blog/why-agentunit-exists.md&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Why this exists
&lt;/h2&gt;

&lt;p&gt;AI Agents today feel like &lt;strong&gt;scripts&lt;/strong&gt;: they work great locally, then hit a wall when you ask &lt;em&gt;who owns it / what version is running / how do we audit it / can we trust it in prod&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;We don't need more frameworks.&lt;br&gt;
We need &lt;strong&gt;packaging discipline&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identity&lt;/strong&gt; — who built it, what version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract&lt;/strong&gt; — what it receives, what it returns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance&lt;/strong&gt; — who is responsible, audit trail, human-approval boundary&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducibility&lt;/strong&gt; — ship as a Docker image, not a prompt folder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AgentUnit does exactly that: it turns an Agent into a &lt;strong&gt;Unit&lt;/strong&gt; via &lt;code&gt;agentunit.yaml&lt;/code&gt; + a small CLI called &lt;code&gt;au&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Think: &lt;strong&gt;the &lt;code&gt;rpm&lt;/code&gt; / &lt;code&gt;deb&lt;/code&gt; for AI Agents.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  4-step quick start
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Install&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/agentunit-io/agentunit.git

&lt;span class="c"&gt;# 2. Scaffold&lt;/span&gt;
au init prd-writer

&lt;span class="c"&gt;# 3. Validate &amp;amp; pack&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;prd-writer
au validate
au pack &lt;span class="nt"&gt;-t&lt;/span&gt; prd-writer:1.0.0

&lt;span class="c"&gt;# 4. Run (HTTP)&lt;/span&gt;
au run prd-writer:1.0.0 &lt;span class="nt"&gt;--serve&lt;/span&gt; &lt;span class="nt"&gt;--port&lt;/span&gt; 8091
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;One-shot mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"prompt":"Build a todo app"}'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; input.json
au run prd-writer:1.0.0 &lt;span class="nt"&gt;--input&lt;/span&gt; input.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optional browser Invoker UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;streamlit requests
streamlit run examples/invokers/streamlit_invoker.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;a href="http://localhost:8501" rel="noopener noreferrer"&gt;http://localhost:8501&lt;/a&gt;, point it at &lt;a href="http://localhost:8091" rel="noopener noreferrer"&gt;http://localhost:8091&lt;/a&gt;, and click &lt;strong&gt;Run&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Minimal &lt;code&gt;agentunit.yaml&lt;/code&gt; (the heartbeat of a Unit)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;agentunit.io/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AgentUnit&lt;/span&gt;

&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prd-writer&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0.0"&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Turns&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;requirement&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;notes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;into&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;structured&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;PRDs"&lt;/span&gt;

&lt;span class="na"&gt;contract&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
    &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;requirement_notes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;requirement_notes&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;outputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
    &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;prd_document&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;quality_score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;number&lt;/span&gt;

&lt;span class="na"&gt;governance&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;require_human_approval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;audit_enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;framework&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;generic-python"&lt;/span&gt;
  &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;app.py"&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai"&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o"&lt;/span&gt;

&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;base_image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python:3.11-slim"&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8091&lt;/span&gt;
  &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;MODEL_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full spec: &lt;a href="https://github.com/agentunit-io/agentunit/blob/main/spec/agentunit-spec-v0.1.md" rel="noopener noreferrer"&gt;https://github.com/agentunit-io/agentunit/blob/main/spec/agentunit-spec-v0.1.md&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Current state &amp;amp; roadmap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phase 0&lt;/strong&gt; — Standard + CLI (&lt;code&gt;init / validate / pack / run&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 1&lt;/strong&gt; — Spec stabilization, community adapters, discovery/registry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 2&lt;/strong&gt; — Governance &amp;amp; audit (accountability layer / approval gates)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Non-goals (important)
&lt;/h3&gt;

&lt;p&gt;We explicitly &lt;strong&gt;don't&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;replace LangChain / AutoGen / CrewAI&lt;/li&gt;
&lt;li&gt;provide a chat UI&lt;/li&gt;
&lt;li&gt;lock you into a cloud or model vendor&lt;/li&gt;
&lt;li&gt;do runtime orchestration&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The end state: AI-native companies
&lt;/h2&gt;

&lt;p&gt;For decades, we perfected &lt;em&gt;shipping software&lt;/em&gt;. We defined packages, versions, dependencies, and audit logs. We turned code into reliable business assets.&lt;/p&gt;

&lt;p&gt;Yet with AI, we went backward. Prompts, manual clicks, and black boxes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AgentUnit brings software engineering discipline back to AI.&lt;/strong&gt; An AI capability should be shipped exactly like a software package — versioned, tested, and governed.&lt;/p&gt;

&lt;p&gt;The future belongs to companies that don't just &lt;em&gt;use&lt;/em&gt; AI — but are &lt;em&gt;run on&lt;/em&gt; AI. Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Units own the "how"&lt;/strong&gt; — They execute tasks, follow contracts, and produce measurable outputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Humans own the "why"&lt;/strong&gt; — They set direction, own risk, and operate the decision gates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't smarter pets. It's reliable factories.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You've built an Agent and now wonder &lt;strong&gt;how to ship it like software&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You want a contract-first, Docker-native boundary around prompts/tools/models&lt;/li&gt;
&lt;li&gt;You care about &lt;em&gt;ownership, audit, and upgrade paths&lt;/em&gt;, not just demos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that sounds right:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Give it a star&lt;/strong&gt; on &lt;a href="https://github.com/agentunit-io/agentunit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try the Quick Start&lt;/strong&gt; (4 commands to run a PRD writer)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tell me&lt;/strong&gt; what your first Unit would be in the comments&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AgentUnit is Apache-2.0. Contributions welcome.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>docker</category>
      <category>platformengineering</category>
    </item>
  </channel>
</rss>
