<?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: Anis Meziani</title>
    <description>The latest articles on DEV Community by Anis Meziani (@anis_meziani_52aab42304a8).</description>
    <link>https://dev.to/anis_meziani_52aab42304a8</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%2F4135967%2F58e62ab6-2a83-4760-9e49-86da56d64406.jpg</url>
      <title>DEV Community: Anis Meziani</title>
      <link>https://dev.to/anis_meziani_52aab42304a8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anis_meziani_52aab42304a8"/>
    <language>en</language>
    <item>
      <title>Your agent framework stops at the demo. This open-source stack ships to production.</title>
      <dc:creator>Anis Meziani</dc:creator>
      <pubDate>Thu, 24 Sep 2026 12:47:05 +0000</pubDate>
      <link>https://dev.to/anis_meziani_52aab42304a8/your-agent-framework-stops-at-the-demo-this-open-source-stack-ships-to-production-3ogd</link>
      <guid>https://dev.to/anis_meziani_52aab42304a8/your-agent-framework-stops-at-the-demo-this-open-source-stack-ships-to-production-3ogd</guid>
      <description>&lt;p&gt;Building an AI agent is easy. Building the system around it is where things get complicated.&lt;/p&gt;

&lt;p&gt;You can create an agent in a few lines of Python. Then you need an API, persistence, authentication, tool integrations, RAG, scheduling, observability, a UI, deployment, and a way to operate the whole thing. That's the gap I wanted to explore when I started digging into &lt;strong&gt;apowerb&lt;/strong&gt;, an open-source AI agent framework from &lt;a href="https://thaink2.com/opensource" rel="noopener noreferrer"&gt;thaink²&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Rather than treating it as another agent SDK, I wanted to answer a more specific question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What does an AI agent runtime actually need to provide once the prototype becomes a real system?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article walks through apowerb's architecture, its runtime model, RAG engine, Text-to-SQL support, event-driven execution, deployment model, and how it compares with other popular approaches.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/apowerb" rel="noopener noreferrer"&gt;
        apowerb
      &lt;/a&gt; / &lt;a href="https://github.com/apowerb/apowerb" rel="noopener noreferrer"&gt;
        apowerb
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The open-source agentic framework to build, orchestrate, and operate production AI agents.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://avatars.githubusercontent.com/u/310538280?v=4&amp;amp;s=160"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F310538280%3Fv%3D4%26s%3D160" alt="apowerb" width="96"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;apowerb&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The open-source agentic framework to build, orchestrate, and operate production AI agents.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.apowerb.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9014b743451f629bc6e4c04d4b5fd22692b8125ff1a5c33887b8c0d595132517/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f63732d61706f776572622e636f6d2d626c75653f7374796c653d666f722d7468652d6261646765266c6f676f3d676f6f676c65646f6373266c6f676f436f6c6f723d7768697465" alt="Documentation"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/apowerb/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/71d1c76871165790453b092cd0f184ed292095ade843fc09078b2aef40c6ad34/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f61706f776572623f7374796c653d666f722d7468652d6261646765266c6f676f3d70797069266c6f676f436f6c6f723d7768697465" alt="PyPI version"&gt;&lt;/a&gt;
&lt;a href="https://www.python.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1e74fc08f1a75dc2e7a0eb363fa03dcb61526713d4db09a26cc69b2b2aed7c91/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e3132253230253743253230332e31332d3337373641423f7374796c653d666f722d7468652d6261646765266c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465" alt="Python"&gt;&lt;/a&gt;
&lt;a href="https://github.com/apowerb/apowerb/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a3d333d06a532e5af9f54d6e4ad56a6fba2a409b48db3772e4e6f916c937c7dc/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4170616368655f322e302d677265656e2e7376673f7374796c653d666f722d7468652d6261646765" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://discord.com/channels/1470717940075597896" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/42cd6f8292eeae7e37e3ae51309cfda1f276f91139ffb31868a10a1cfac911d5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6d6d756e6974792d446973636f72642d3538363546323f7374796c653d666f722d7468652d6261646765266c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465" alt="Discord"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;a href="https://docs.apowerb.com/" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt; •
  &lt;a href="https://docs.apowerb.com/quickstart" rel="nofollow noopener noreferrer"&gt;Quickstart&lt;/a&gt; •
  &lt;a href="https://docs.apowerb.com/api-reference/introduction" rel="nofollow noopener noreferrer"&gt;API Reference&lt;/a&gt; •
  &lt;a href="https://docs.apowerb.com/deployment/dockercompose" rel="nofollow noopener noreferrer"&gt;Deployment&lt;/a&gt; •
  &lt;a href="https://thaink2.com" rel="nofollow noopener noreferrer"&gt;thaink2&lt;/a&gt;
&lt;/p&gt;


&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;This repository is the &lt;strong&gt;open-source core&lt;/strong&gt;. Some capabilities named in the product —
billing, the consumption analysis screen, prospection, identity-provider sign-in
multi-factor authentication, agent evaluation, the supervision screen, organisation
management — ship as separate commercial bricks and are &lt;strong&gt;absent here&lt;/strong&gt;. Where the
core holds a hook for one, it is documented as such. A &lt;code&gt;404&lt;/code&gt; on those routes means
"not in this edition", not "object not found".&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;administration panel is part of this edition&lt;/strong&gt;: users, groups, permissions, MFA
enforcement. Only the management of &lt;em&gt;organisations&lt;/em&gt; is sold separately — deciding which
tenant a person belongs to governs other people's reach, rather than serving whoever runs
the install.&lt;/p&gt;
&lt;p&gt;Full documentation: &lt;a href="https://docs.apowerb.com" rel="nofollow noopener noreferrer"&gt;docs.apowerb.com&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Three commands, a database included, and &lt;strong&gt;nothing to fill in&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/apowerb/apowerb" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  What is apowerb, exactly?
&lt;/h2&gt;

&lt;p&gt;Most agent frameworks start from a library. You import the framework, define an agent, give it tools, connect an LLM, and build your application. That model is useful, but it leaves a lot of infrastructure outside the framework: API layer, persistence, authentication, UI, deployment, scheduling, event handling, observability, RAG, integrations.&lt;/p&gt;

&lt;p&gt;apowerb takes a different approach. Instead of treating the agent as an object embedded inside an application, it treats the agent as something that can be &lt;strong&gt;defined, stored, materialized and operated by a runtime&lt;/strong&gt;. The stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; : REST APIs and Server-Sent Events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typer&lt;/strong&gt; : the CLI (&lt;code&gt;apowerb serve&lt;/code&gt;, &lt;code&gt;apowerb agents list&lt;/code&gt;, …)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; : the web UI (build agents, give them tools/knowledge, run and inspect them)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; : agent and configuration state&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google ADK&lt;/strong&gt; : the execution engine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiteLLM&lt;/strong&gt; : the model routing layer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose / Helm&lt;/strong&gt; : deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is closer to an application runtime than to a standalone Python library.&lt;/p&gt;




&lt;h2&gt;
  
  
  The architecture in one picture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────┐
│                     Clients / UI                        │
│    Next.js UI  •  Typer CLI  •  REST API  •  SSE         │
└──────────────────────────┬─────────────────────────────┘
                           │
                           ▼
┌────────────────────────────────────────────────────────┐
│                 FastAPI Orchestrator                    │
│   Agent materialization   •   Webhooks (Pub/Sub)        │
│   Cron / event scheduling •   SSE output stream         │
└──────────────────────────┬─────────────────────────────┘
                           │
                           ▼
┌────────────────────────────────────────────────────────┐
│              Execution Engine Google ADK              │
│   Base • Sequential • Parallel • Loop                   │
│   Hierarchical sub-agents  •  Human-in-the-loop         │
└─────────────┬───────────────────────────┬──────────────┘
              │                           │
              ▼                           ▼
┌─────────────────────────┐    ┌─────────────────────────┐
│   LiteLLM Model Router  │    │     Tools &amp;amp; Services     │
│ OpenAI • Anthropic      │    │ M365 • Google • SQL      │
│ Gemini • Mistral • local│    │ RAG • Webhooks           │
└─────────────────────────┘    └─────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four orchestration patterns are built into the runtime:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;base&lt;/strong&gt; : single-turn conversational agents with tool execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sequential&lt;/strong&gt; : deterministic step-by-step pipelines passing context downstream&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;parallel&lt;/strong&gt; : concurrent branches aggregated for synthesis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;loop&lt;/strong&gt; : evaluator/optimizer cycles that iterate until a target condition or stop token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hierarchical sub-agents let a coordinator delegate work to specialized agents. The interesting part, though, isn't the list of patterns, it's what happens &lt;em&gt;before&lt;/em&gt; execution.&lt;/p&gt;




&lt;h2&gt;
  
  
  The interesting choice: agents as runtime objects
&lt;/h2&gt;

&lt;p&gt;In a typical application, an agent is defined directly in Python and the application owns that definition:&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="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SomeAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[...],&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;apowerb takes another route. Agent definitions, tools, skills and their configuration live in PostgreSQL. At startup, the backend uses those definitions to &lt;strong&gt;materialize executable Python modules&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;Agent definition ─► PostgreSQL ─► Materialization ─► Python module ─► Google ADK
                                                                        ├─► Tools
                                                                        ├─► RAG
                                                                        └─► LLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That changes the operational model. The application isn't rebuilt every time the agent catalogue changes; the runtime loads definitions from the database and turns them into executable agents. For an organisation managing many agents, that's a meaningful distinction, the agent becomes closer to a &lt;strong&gt;runtime-managed resource&lt;/strong&gt; than a static piece of application code. It's the detail I found most interesting in the project.&lt;/p&gt;




&lt;h2&gt;
  
  
  Model access through LiteLLM
&lt;/h2&gt;

&lt;p&gt;The execution layer is deliberately separated from model access. apowerb uses &lt;strong&gt;LiteLLM&lt;/strong&gt; as the routing layer, so the runtime can work with multiple providers without coupling an agent's tools to one vendor. The documented stack includes Anthropic, OpenAI, Mistral, Gemini, OVHcloud, Groq, and local Ollama/vLLM deployments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent ─► Google ADK ─► LiteLLM ─┬─► OpenAI
                                ├─► Anthropic
                                └─► Local (Ollama / vLLM)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tools and orchestration logic don't need to know which provider ultimately executes the model call, useful for teams that want to swap or benchmark models.&lt;/p&gt;




&lt;h2&gt;
  
  
  RAG is part of the stack
&lt;/h2&gt;

&lt;p&gt;RAG isn't treated as an external SaaS dependency. apowerb includes &lt;strong&gt;th2rag&lt;/strong&gt;, a standalone FastAPI service for ingestion and retrieval:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Document ─► Conversion (Docling) ─► Chunking ─► Embeddings ─► LanceDB ─► Retrieval ─► Generation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The current implementation uses &lt;strong&gt;Docling&lt;/strong&gt; for document conversion, its &lt;strong&gt;HybridChunker&lt;/strong&gt; for semantic chunking, &lt;strong&gt;sentence-transformers/gtr-t5-large&lt;/strong&gt; for embeddings, &lt;strong&gt;LanceDB&lt;/strong&gt; as the vector store, a LanceDB retriever for similarity search, and &lt;strong&gt;Mistral AI&lt;/strong&gt; for generation. Each stage sits behind a base class (&lt;code&gt;BaseEmbedding&lt;/code&gt;, &lt;code&gt;BaseGenerator&lt;/code&gt;, …), so swapping the embedding model or the LLM is a matter of subclassing, not surgery.&lt;/p&gt;

&lt;p&gt;The service can index local files, URLs, database query results and S3 objects, into knowledge bases associated with individual agents rather than one global index. That makes RAG a runtime capability instead of something each application assembles separately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Native Text-to-SQL
&lt;/h2&gt;

&lt;p&gt;An agent can connect to PostgreSQL or MySQL, introspect the schema, generate SQL from a natural-language question, execute it and return the result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Which customers generated the most revenue last quarter?"
        │
        ▼
   Agent / LLM ─► Schema context ─► SQL generation ─► Query ─► Results ─► NL response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interesting part isn't that an LLM can write SQL, it's that the connection, schema introspection, generation and execution all happen &lt;em&gt;inside the agent runtime&lt;/em&gt;. Text-to-SQL becomes another runtime capability rather than an integration every application builds from scratch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Event-driven agents
&lt;/h2&gt;

&lt;p&gt;Most agent demos are request/response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP request ─► Agent ─► Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;apowerb can also work in the opposite direction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;External event ─► Webhook ─► Agent ─► Tools / RAG / LLM ─► Action / Result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The current implementation includes email-triggered agents. Gmail uses Google Cloud Pub/Sub push notifications; Outlook uses Microsoft Graph change subscriptions with &lt;code&gt;clientState&lt;/code&gt; validation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Email arrives ─► Provider notification ─► apowerb webhook ─► Fetch message ─► Run agent ─► Log result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Subscription renewal is handled in the background: Gmail watches expire after seven days, Outlook after three, and the runtime periodically renews anything approaching expiration. Combined with cron-style scheduled runs and SSE streaming (token-by-token output, RAG ingestion progress, notifications), this moves the runtime beyond chatbots, the agent becomes a component in an event-driven system.&lt;/p&gt;




&lt;h2&gt;
  
  
  The open-source boundary
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;core stack is Apache 2.0&lt;/strong&gt; ; the framework plus supporting services like the RAG engine, ETL components, observability and web UI. The project follows an open-core model: some commercial extensions (billing, MFA, identity-provider SSO, agent evaluation, supervision, organisation management) are maintained separately.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;TH2_EXTENSIONS&lt;/code&gt; environment variable declares which commercial bricks to load; if a brick isn't installed or enabled, the core doesn't depend on it. Routes belonging to an absent brick return a clean &lt;code&gt;404&lt;/code&gt;. The useful distinction: &lt;strong&gt;the open-source runtime remains fully usable without the commercial extensions&lt;/strong&gt;, the core isn't an artificially limited demo.&lt;/p&gt;




&lt;h2&gt;
  
  
  It's more than one repository
&lt;/h2&gt;

&lt;p&gt;A common pattern in AI tooling is "open-source framework + several proprietary services around it." Here, much more of the surrounding infrastructure is exposed. The thaink² GitHub org holds 10 repositories, all Apache 2.0:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repository&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apowerb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FastAPI backend, CLI and ADK runtime&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apowerb-ui&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Visual agent builder and monitoring&lt;/td&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;th2rag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RAG, parsing, embeddings, vector search&lt;/td&gt;
&lt;td&gt;LanceDB / Docling / Mistral&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;th2etl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ETL pipelines&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;th2pulse&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Observability and logs&lt;/td&gt;
&lt;td&gt;OpenTelemetry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;th2forecast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Time-series forecasting&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apowerb-hosting&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Docker Compose / Kubernetes / Helm&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apowerb-docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Documentation&lt;/td&gt;
&lt;td&gt;Mintlify / MDX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent-hub&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Community agent templates&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can read and run the RAG engine, the scheduler and the telemetry pipeline, there's no hidden proprietary service doing the heavy lifting behind an API.&lt;/p&gt;




&lt;h2&gt;
  
  
  Run the full stack
&lt;/h2&gt;

&lt;p&gt;The fastest way to understand the project is to run it. The hosting repository provides a Docker Compose setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/apowerb/apowerb-hosting.git
&lt;span class="nb"&gt;cd &lt;/span&gt;apowerb-hosting

&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
./scripts/generate-secrets.sh

docker compose &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-f&lt;/span&gt; docker-compose/docker-compose.yml &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env-file&lt;/span&gt; .env &lt;span class="se"&gt;\&lt;/span&gt;
  up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The UI comes up on &lt;code&gt;http://localhost:3000&lt;/code&gt;, the API on &lt;code&gt;:8000&lt;/code&gt;, and PostgreSQL runs inside the stack. You still provide an LLM API key, through the UI, or via &lt;code&gt;DEFAULT_LLM_MODEL&lt;/code&gt; / &lt;code&gt;DEFAULT_LLM_API_KEY&lt;/code&gt;. If you only want the Python package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv add apowerb   &lt;span class="c"&gt;# or: pip install apowerb&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two entry points, two purposes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apowerb package   ─► embed the runtime in your application
apowerb-hosting   ─► run the complete platform
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How it compares
&lt;/h2&gt;

&lt;p&gt;Comparisons between agent frameworks are easy to get wrong because they solve different problems. The useful question isn't &lt;em&gt;"which framework is best?"&lt;/em&gt; but &lt;em&gt;"which layer does each project expect you to own?"&lt;/em&gt; Below, "built-in" means the capability is part of the platform rather than something you assemble around it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;apowerb&lt;/th&gt;
&lt;th&gt;LangGraph&lt;/th&gt;
&lt;th&gt;CrewAI&lt;/th&gt;
&lt;th&gt;n8n + LLM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Multi-model&lt;/td&gt;
&lt;td&gt;LiteLLM&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in RAG&lt;/td&gt;
&lt;td&gt;th2rag&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email webhooks&lt;/td&gt;
&lt;td&gt;Gmail + Outlook&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native Text-to-SQL&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Via tools&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Included UI&lt;/td&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helm deployment&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main approach&lt;/td&gt;
&lt;td&gt;Runtime / platform&lt;/td&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;Framework&lt;/td&gt;
&lt;td&gt;Workflow automation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The distinction isn't one checkbox, it's the architecture. &lt;strong&gt;LangGraph&lt;/strong&gt; and &lt;strong&gt;CrewAI&lt;/strong&gt; are frameworks you embed into an application. &lt;strong&gt;n8n&lt;/strong&gt; comes from workflow automation, where an LLM is one node in a larger graph. &lt;strong&gt;apowerb&lt;/strong&gt; provides the runtime &lt;em&gt;around&lt;/em&gt; the agent: API, persistence, UI, integrations, scheduling, RAG and deployment. Different design choices, not just different implementations of the same product.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I found interesting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Agents are treated as managed runtime resources.&lt;/strong&gt; The database-backed definition and materialization model is the most distinctive architectural choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. RAG isn't an external dependency.&lt;/strong&gt; The project ships its own RAG service instead of requiring every deployment to assemble one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Event-driven execution is first-class.&lt;/strong&gt; Gmail, Outlook, schedules and SSE make "proactive" agents implementable, not just request/response chatbots.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trade-offs
&lt;/h2&gt;

&lt;p&gt;Not everything is settled. The release cadence is high, so the API isn't frozen, expect to track changes if you build on it now. Schema is created by &lt;code&gt;ensure_*&lt;/code&gt; functions at startup rather than Alembic, which is fine today but means no reversible migrations. And the external community is still small; most contribution looks internal so far, so you'd be an early adopter.&lt;/p&gt;

&lt;p&gt;None of that is a dealbreaker, it's the normal shape of a young project that's visibly running in production.&lt;/p&gt;




&lt;h2&gt;
  
  
  Worth a clone if…
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;you want RAG, tool auth, an API and a UI to already exist so you can build the actual agent;&lt;/li&gt;
&lt;li&gt;you're a data team and Text-to-SQL over your warehouse plus scheduled runs maps to your use case;&lt;/li&gt;
&lt;li&gt;you need everything self-hosted and auditable, your models, your data, Apache 2.0;&lt;/li&gt;
&lt;li&gt;you're benchmarking agent frameworks and want to see where the "runtime, not library" line falls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three experiments that take minutes each: point an agent at a Postgres and query it in English; drop a folder of PDFs into a knowledge base and ask questions; set a Gmail trigger that summarizes and routes incoming mail.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Core: &lt;a href="https://github.com/apowerb/apowerb" rel="noopener noreferrer"&gt;github.com/apowerb/apowerb&lt;/a&gt;  Apache-2.0&lt;/li&gt;
&lt;li&gt;Web site: &lt;a href="https://thaink2.com/opensource" rel="noopener noreferrer"&gt;thaink2.com/opensource&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Deployment: &lt;a href="https://github.com/apowerb/apowerb-hosting" rel="noopener noreferrer"&gt;apowerb/apowerb-hosting&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://docs.apowerb.com/" rel="noopener noreferrer"&gt;docs.apowerb.com&lt;/a&gt;  &lt;a href="https://docs.apowerb.com/quickstart" rel="noopener noreferrer"&gt;quickstart&lt;/a&gt;, &lt;a href="https://docs.apowerb.com/api-reference/introduction" rel="noopener noreferrer"&gt;API reference&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it, I'd be curious what you build  drop a note in the comments.&lt;/p&gt;

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