The five components behind every production agent, the two key architectures, and a stack you can mostly self-host in 2026 — MIT or Apache-2.0 licensed unless flagged otherwise.
A chatbot waits for input and replies. An agent is given a goal.
Single agent: one model, many tools. It's an OK stack for most v1 builds.
Picks the next action, plans the sequence, recovers from its own errors. Optimise for task accuracy first, then cost and latency.
Short-term: the context of the current run. Long-term: user preferences and past decisions, usually in a vector store. MongoDB Atlas and Redis are both swapped below — one for licensing, one for a cleaner permissive fork.
APIs, databases, email, CRMs. A model without tools can only talk about the work. Tools let it do the work. Zapier and Make dropped — both closed, metered SaaS with no self-host path.
Your SOPs rewritten as prompts: tight scope, explicit edge cases, defined fallback paths for every failure mode.
Wires model, memory and tools into one loop. Routes work between agents when the system grows past one. CrewAI is MIT-licensed and actively maintained, so it stays. AutoGen is out — Microsoft put it in maintenance mode in October 2025 and pointed everyone to its successor.
Boundaries are a feature, not a constraint.
Autonomy is earned, never assumed.
Perplexity's PII-TRACE research (1 Sep 2026) tested 12 detectors on long, multi-turn conversations and found the real failure mode isn't missing PII entirely — it's missing the second or third mention of the same identifier later in a run. That's exactly the shape of an agent workflow: a customer's email or phone number gets picked up in turn one, then re-quoted across several tool calls and memory writes. A generic safety filter checks each message in isolation and lets the repeats through.
The practical open-source version of that gate today is Microsoft Presidio (MIT) — it's the same tool Perplexity's own pipeline uses to rescan synthetic data for leaked PII, and it already runs the identical "screen before it leaves the boundary" pattern locally. Wire it in as a pre-processing step ahead of every tool call and memory write, not just at the chat input.