Two different abstractions
CrewAI thinks in terms of roles (agent personas) and tasks (units of work delegated to roles). A “crew” is a set of agents with delegation rules. It’s a high-level abstraction good for “I want N agents collaborating on a multi-step problem.”
Agentmatic (and LangGraph) thinks in terms of state graphs — explicit nodes, explicit edges, explicit state. The framework owns control flow; the LLM owns decisions.
When the abstraction matters
CrewAI’s role-based model is fast to get started (“write a researcher and a writer; let them collaborate”). It hides the control flow.
Agentmatic’s graph model is fast to debug at scale. You can inspect state at every step, branch from any checkpoint, and replay a failing run. The control flow is the API.
Concrete example
A multi-agent research workflow:
# CrewAI
crew = Crew(
agents=[researcher, writer, reviewer],
tasks=[research_task, write_task, review_task],
process=Process.sequential,
)
# Agentmatic — explicit graph, every transition checkpointed
graph = StateGraph(WorkflowState)
graph.add_node("research", researcher)
graph.add_node("write", writer)
graph.add_node("review", reviewer)
graph.add_conditional_edges("review", verify, {"ok": END, "revise": "write"})
The Agentmatic version is longer. It’s also testable (each transition is a pure function), checkpointable (resume mid-flow), and observable (every state diff is a span).
Performance
Both spend ~99% of wall time inside LLM calls, so framework speed matters in the same situations: high-graph-density workloads (Supervisor patterns, retry loops, Map fan-out). Agentmatic wins those — see /benchmarks.
They can be complementary
CrewAI is good for prototyping a multi-agent idea. Agentmatic is good for shipping it. The bridge is simple: wrap a CrewAI crew as an Agentmatic tool, or vice versa.