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 whenUse Substructure when
The job is research, draft, review, shipThe job is a conversation that continues
You want roles and manager delegationYou want Slack threads as sessions
You are a Python shopYour 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 @persist decorator 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

CrewAISubstructure
The agent isClasses and decorators in your appA file in your repo
LanguagePython 3.10 to 3.13Any language, over HTTP
Unit of workA crew run that finishesA session that continues
Many agentsCrews and manager delegationSubagents, one line
Loop controlFlows, in your codeEvery step, over the wire

Running it

CrewAISubstructure
DurabilityOpt-in, off by defaultThe execution model
ResumeYour code asks for itThe engine does it
State storeYoursThe engine's

Surfaces and price

CrewAISubstructure
SlackA slash command starts a crewThreads are sessions
Human approvalConsole, or the paid platformAn engine feature
Browser UIAn AG-UI adapter you hostAG-UI, native
Self-hostMIT coreThe full product
Price50 runs free, then a quoteFlat, 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.