<?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: Akash Sengar</title>
    <description>The latest articles on DEV Community by Akash Sengar (@a1996kash).</description>
    <link>https://dev.to/a1996kash</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%2F721197%2Fed2e5aa6-280b-4206-8fae-bed62673ca1e.jpeg</url>
      <title>DEV Community: Akash Sengar</title>
      <link>https://dev.to/a1996kash</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/a1996kash"/>
    <language>en</language>
    <item>
      <title>Agentium: Build Production-Grade AI Agents in TypeScript Without the Bloat</title>
      <dc:creator>Akash Sengar</dc:creator>
      <pubDate>Sun, 24 May 2026 07:14:38 +0000</pubDate>
      <link>https://dev.to/a1996kash/agentium-build-production-grade-ai-agents-in-typescript-without-the-bloat-7nb</link>
      <guid>https://dev.to/a1996kash/agentium-build-production-grade-ai-agents-in-typescript-without-the-bloat-7nb</guid>
      <description>&lt;p&gt;&lt;strong&gt;description: A deep dive into Agentium — a TypeScript-first AI agent framework with a layered architecture, built-in memory, tool calling, voice/browser agents, and benchmark results that beat LangChain on cost and tool calling speed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you've built anything with LangChain in Node.js, you've probably felt the friction — verbose setup, heavy abstractions, and enough boilerplate to make you question your life choices. &lt;strong&gt;Agentium&lt;/strong&gt; is a TypeScript-first agent framework that tries to fix all of that. It's lean, layered, and surprisingly fast out of the box.&lt;/p&gt;

&lt;p&gt;Let's go from zero to a streaming, tool-calling agent — and then dig into what's actually happening under the hood.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started in 3 Steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @agentium/core openai
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agentium supports OpenAI, Anthropic, Google, Ollama, and Vertex out of the box — just swap the provider package.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1: Your First Agent
&lt;/h3&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;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;openai&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;@agentium/core&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;new&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a helpful assistant.&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="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;What is TypeScript?&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;text&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 it. No chains, no pipelines, no ceremony.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Add Tools (With Type Safety)
&lt;/h3&gt;

&lt;p&gt;Agentium uses Zod schemas for tool parameters, so everything is fully typed:&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;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;defineTool&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;@agentium/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&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;zod&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;weatherTool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineTool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_weather&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Get current weather for a city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;City name&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="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`Weather in &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: 72°F, sunny`&lt;/span&gt;&lt;span class="p"&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;new&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;weather-bot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You help users check the weather.&lt;/span&gt;&lt;span class="dl"&gt;"&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;weatherTool&lt;/span&gt;&lt;span class="p"&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;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;What's the weather in Tokyo?&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;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent calls &lt;code&gt;get_weather&lt;/code&gt; automatically when needed — no wiring required.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Streaming Responses
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&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;chunk&lt;/span&gt; &lt;span class="k"&gt;of&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;stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tell me a joke&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&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="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&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;Streaming works for both text and tool-call chunks. Handle &lt;code&gt;chunk.type&lt;/code&gt; to branch as needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture: It's Actually Well Thought Out
&lt;/h2&gt;

&lt;p&gt;This is where Agentium gets interesting. It's a monorepo with four focused packages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@agentium/core&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Agents, tools, memory, voice, browser, MCP/A2A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@agentium/transport&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;REST API, Socket.IO, Voice/Browser gateways&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@agentium/queue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BullMQ background job processing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@agentium/browser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vision-based browser automation via Playwright&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use only what you need — each package is independently installable.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Layered Model
&lt;/h3&gt;

&lt;p&gt;Agentium's internals stack cleanly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SDK Layer&lt;/strong&gt; — &lt;code&gt;Agent&lt;/code&gt;, &lt;code&gt;Team&lt;/code&gt;, &lt;code&gt;Workflow&lt;/code&gt;, &lt;code&gt;VoiceAgent&lt;/code&gt;, &lt;code&gt;BrowserAgent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engine Layer&lt;/strong&gt; — LLM loop, tool executor, memory manager (sessions, summaries, user facts, profiles, entities)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety Layer&lt;/strong&gt; — Sandboxed subprocess execution, human-in-the-loop approval gates, guardrails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Abstraction&lt;/strong&gt; — Unified interface across OpenAI, Anthropic, Google, Ollama, Vertex&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocol Integration&lt;/strong&gt; — MCP client (consume external tools), A2A client (call remote agents)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure&lt;/strong&gt; — Pluggable storage: in-memory, SQLite, PostgreSQL, MongoDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registry &amp;amp; Auto-Discovery&lt;/strong&gt; — Every agent/team/workflow auto-registers on construction; transport layers pick them up dynamically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport (optional)&lt;/strong&gt; — Express REST, Socket.IO WebSocket, Voice Gateway, Browser Gateway&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Queue (optional)&lt;/strong&gt; — BullMQ workers for async processing
### How a Request Actually Flows&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's the complete path a text request takes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Input
    │
Agent.run() / Agent.stream()
    │
buildMessages (history + system instructions + memory context + skill instructions)
    │
LLM Loop (with automatic retry on 429/5xx)
    │
ModelProvider (OpenAI / Anthropic / Google / Ollama / Vertex)
    │
Tool Executor (if tool calls present)
  ├── Approval check (if requiresApproval is set)
  ├── Sandbox execution (if sandbox is enabled)
  ├── Local tools
  ├── MCP tools (external servers)
  └── A2A tools (remote agents)
    │
MemoryManager.appendMessages() → auto-summarize overflow
    │
MemoryManager.afterRun() → fire-and-forget extraction
  (user facts, profile, entities, learnings)
    │
Output to caller
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The memory extraction at the end — user facts, profile updates, entity relationships, learned patterns — all runs in the background and doesn't block your response.&lt;/p&gt;




&lt;h2&gt;
  
  
  Memory: Seven Levels Deep
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;MemoryManager&lt;/code&gt; is one of the most interesting parts. It supports seven distinct memory stores, all sharing a single &lt;code&gt;StorageDriver&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Store&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;What it captures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sessions&lt;/td&gt;
&lt;td&gt;Per-session&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Message history, auto-trimmed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summaries&lt;/td&gt;
&lt;td&gt;Per-session&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;LLM-generated summaries of overflowed messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User Facts&lt;/td&gt;
&lt;td&gt;Per-user, cross-session&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;"Prefers dark mode", "lives in Mumbai"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User Profile&lt;/td&gt;
&lt;td&gt;Per-user, cross-session&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Name, role, company, timezone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entity Memory&lt;/td&gt;
&lt;td&gt;Global/namespaced&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Companies, people, projects with relationships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision Log&lt;/td&gt;
&lt;td&gt;Per-agent&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Audit trail of decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learned Knowledge&lt;/td&gt;
&lt;td&gt;Global (vector-backed)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Reusable insights from past conversations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Enable what you need. All extraction is non-blocking.&lt;/p&gt;




&lt;h2&gt;
  
  
  Voice and Browser Agents
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Voice Agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Audio Input (WebSocket / Socket.IO)
    │
VoiceAgent.connect()
    │
RealtimeProvider (OpenAI Realtime / Google Live)
    │
Bidirectional audio stream ↔ Tool calls ↔ MemoryManager
    │
Audio Output → Client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sessions persist across reconnects. Memory extraction works on voice transcripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Browser Agent
&lt;/h3&gt;

&lt;p&gt;Agentium's browser automation is vision-based — it takes screenshots, passes them to a vision model, and decides what to click/type/scroll next. Key features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stealth mode&lt;/strong&gt; — patches &lt;code&gt;navigator.webdriver&lt;/code&gt;, WebGL, and plugins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Humanize mode&lt;/strong&gt; — random delays, mouse movement curves, typing variation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credential vault&lt;/strong&gt; — secrets are never sent to the LLM; only &lt;code&gt;{{placeholders}}&lt;/code&gt; appear in prompts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video recording&lt;/strong&gt; — native Playwright session recording&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Performance: The Numbers
&lt;/h2&gt;

&lt;p&gt;Benchmarks against LangChain (Node.js) and Agno (Python), using &lt;code&gt;gpt-4o-mini&lt;/code&gt;, 5 runs per scenario:&lt;/p&gt;

&lt;h3&gt;
  
  
  Startup Time
&lt;/h3&gt;

&lt;p&gt;Agentium: &lt;strong&gt;171ms&lt;/strong&gt; vs LangChain: 301ms vs Agno: 2730ms&lt;/p&gt;

&lt;h3&gt;
  
  
  Tool Calling
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Agentium&lt;/th&gt;
&lt;th&gt;LangChain&lt;/th&gt;
&lt;th&gt;Agno&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Avg Response&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1617ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1678ms&lt;/td&gt;
&lt;td&gt;3064ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt Tokens&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;167&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;167&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;173&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Tokens&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;196&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;196&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;202&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Multi-turn Memory
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Agentium&lt;/th&gt;
&lt;th&gt;LangChain&lt;/th&gt;
&lt;th&gt;Agno&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prompt Tokens&lt;/td&gt;
&lt;td&gt;189&lt;/td&gt;
&lt;td&gt;309&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;94&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost / Run&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.000046&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.000081&lt;/td&gt;
&lt;td&gt;$0.000054&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Agentium uses &lt;strong&gt;39% fewer prompt tokens&lt;/strong&gt; and costs &lt;strong&gt;43% less&lt;/strong&gt; than LangChain on multi-turn conversations. LangChain injects heavier system prompts and history formatting overhead.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Agentium Keeps Token Count Low
&lt;/h3&gt;

&lt;p&gt;A few concrete optimizations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Tool schema caching&lt;/strong&gt; — Zod-to-JSON Schema conversion happens once at construction, not on every LLM call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Minimal schema serialization&lt;/strong&gt; — Strips &lt;code&gt;$schema&lt;/code&gt;, &lt;code&gt;additionalProperties&lt;/code&gt;, and other verbose JSON Schema fields that add tokens without adding meaning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Token-based history trimming&lt;/strong&gt; — Set &lt;code&gt;maxContextTokens&lt;/code&gt; and oldest messages are automatically dropped to stay within 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;new&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;maxContextTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8000&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;&lt;strong&gt;4. Non-blocking memory extraction&lt;/strong&gt; — Fact extraction runs in the background, saving 500–1000ms per request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Smart context deduplication&lt;/strong&gt; — If you register &lt;code&gt;userMemory.asTool()&lt;/code&gt;, user facts are fetched on demand via tool call and &lt;em&gt;not&lt;/em&gt; pre-injected into the system prompt. Saves tokens when facts aren't always needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Automatic retry with backoff&lt;/strong&gt; — Configurable retry on 429/5xx so you're not writing that yourself:&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;new&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;reliable-bot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;maxRetries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;initialDelayMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;maxDelayMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30000&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;h2&gt;
  
  
  The Registry: Auto-Discovery Without Config
&lt;/h2&gt;

&lt;p&gt;One of the small-but-great quality-of-life features is the global &lt;code&gt;Registry&lt;/code&gt;. Every agent, team, and workflow registers itself on construction:&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;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;registry&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;@agentium/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bot&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o&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="nx"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// { agents: ["bot"], teams: [], workflows: [] }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The transport layer reads from this registry at request time. Spin up a new agent after the server starts? It's immediately available over HTTP and WebSocket — no restart, no rewiring.&lt;/p&gt;




&lt;h2&gt;
  
  
  Design Principles Worth Calling Out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero meta-framework dependency&lt;/strong&gt; — works with any Node.js server or headless script&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional peer dependencies&lt;/strong&gt; — only bundle the providers you actually use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pluggable everything&lt;/strong&gt; — storage, models, vector stores, transport are all swappable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety by default&lt;/strong&gt; — sandboxed subprocess execution and human-in-the-loop approval are opt-in per tool&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - &lt;strong&gt;Open protocol support&lt;/strong&gt; — MCP for tool integration, A2A for agent-to-agent interoperability (no vendor lock-in)
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Should You Use It?
&lt;/h2&gt;

&lt;p&gt;If you're building AI agents in Node.js/TypeScript and you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less boilerplate than LangChain&lt;/li&gt;
&lt;li&gt;Real multi-layer memory without building it yourself&lt;/li&gt;
&lt;li&gt;Voice and browser automation in the same framework&lt;/li&gt;
&lt;li&gt;Lower token costs at scale (multi-turn conversations especially)&lt;/li&gt;
&lt;li&gt;Production-grade retry, sandboxing, and approval flows
...then Agentium is worth a serious look.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The docs are at &lt;a href="https://docs.agentium.in" rel="noopener noreferrer"&gt;docs.agentium.in&lt;/a&gt; and the quickstart genuinely takes under five minutes.&lt;/p&gt;

&lt;p&gt;Github &lt;a href="//github.com/agentiumOs/agentium"&gt;github.com/agentiumOs/agentium&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you tried Agentium or another TypeScript agent framework? What's your experience been? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>node</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
