Substructure vs. CrewAI for AI agents
Checked August 7, 2026
CrewAI is for pipelines: give each agent a role, a goal, and a backstory, hand out tasks, and a crew produces a deliverable. Substructure is for teammates: an agent people mention in a channel all day, that holds context in threads and asks a person before risky steps.
| Use CrewAI when | Use Substructure when |
|---|---|
| The job is research, draft, review, ship | The job is a conversation that continues |
| You want roles and manager delegation | You want Slack threads as sessions |
| You are a Python shop | Your code is Go, Ruby, or anything on HTTP |
What Substructure does that CrewAI does not
- Answers in Slack threads. In CrewAI, Slack is a platform trigger: a slash command starts a deployed crew.
- Saves every step by default. CrewAI's durability is opt-in: a
@persistdecorator on Flows, and checkpointing that is off by default and resumes when your code asks. - Asks a person over Slack. CrewAI's open-source human input is a blocking console prompt; approval over webhooks is paid.
- Runs your code in any language. CrewAI is Python 3.10 to 3.13, in process.
- Publishes a price. CrewAI's plans are 50 executions a month free, then a custom Enterprise quote.
Side by side
Building the agent
| CrewAI | Substructure | |
|---|---|---|
| The agent is | Classes and decorators in your app | A file in your repo |
| Language | Python 3.10 to 3.13 | Any language, over HTTP |
| Unit of work | A crew run that finishes | A session that continues |
| Many agents | Crews and manager delegation | Subagents, one line |
| Loop control | Flows, in your code | Every step, over the wire |
Running it
| CrewAI | Substructure | |
|---|---|---|
| Durability | Opt-in, off by default | The execution model |
| Resume | Your code asks for it | The engine does it |
| State store | Yours | The engine's |
Surfaces and price
| CrewAI | Substructure | |
|---|---|---|
| Slack | A slash command starts a crew | Threads are sessions |
| Human approval | Console, or the paid platform | An engine feature |
| Browser UI | An AG-UI adapter you host | AG-UI, native |
| Self-host | MIT core | The full product |
| Price | 50 runs free, then a quote | Flat, bring your own key |
What you write
crew.py
researcher = Agent(role="Researcher", goal="Find the cause", backstory="...")
task = Task(description="Investigate the alert", agent=researcher)
crew = Crew(agents=[researcher], tasks=[task])
crew.kickoff()subs.toml
[agent.oncall]
llm = "openrouter"
model = "moonshotai/kimi-k3"
system = "You are the on-call assistant."
mcp = [{ id = "sentry", tools = { read_only = true } }]
[agent.oncall.slack]
name = "Oncall"Add a worker URL to that file and the engine sends every decision to your
endpoint as JSON, one step at a time.
Where CrewAI is the better choice
- The easiest on-ramp to multi-agent thinking anywhere.
- Hierarchical crews, with manager delegation for free.
- Crew Studio, which turns a prompt into a working crew without code.
- A very large community, with templates and courses.
Questions
Can I still build a crew of specialists? Yes. Subagents are agents the model calls as tools.
Is my Python wasted? No. Your crew logic can live behind a worker that the engine calls.
Does it run batch jobs too? It can, but batch pipelines are what CrewAI is built for.
The quick start takes about five minutes.