Two of the frameworks a bootstrapped founder actually reaches for shipped headline releases four days apart in late June: LlamaIndex Workflows 1.0 on June 22, 2026 — its first stable release — and CrewAI 1.15.0 on June 25. Both exist to solve the same complaint about high-level agent frameworks: the loop is a black box, and when it misbehaves you can't see or steer it. Both hand the control back to you. The question is which kind of control you want.
Here's the fastest way to tell them apart: CrewAI asks "who are my agents?" and LlamaIndex Workflows asks "what are my events?" Everything else follows from that.
CrewAI Flows: the org chart is the primitive#
CrewAI starts from agents. You define role-playing agents — a researcher, a writer, a reviewer — group them into crews, and let them collaborate. Flows are the layer that orchestrates across crews and plain functions: you decorate methods with @start, @listen, and @router, thread a shared state through them, and CrewAI handles execution order, branching, and persistence. Memory, knowledge, and RAG are built in; a crashed run can resume from its persisted state.
The June release moved authoring, not just features. 1.15.0 added a declarative FlowDefinition — a flow no longer has to be a decorated Python class. It can be loaded from a definition (with crew actions, inline crews, a single-agent action, and an each composite), which means the orchestration can live as config you version, diff, and hand to a teammate who doesn't write Python. It also aggregates token usage across every LLM call in a run — one number for what a whole flow cost. (We broke that release down in what CrewAI 1.15 changed.)
Choose CrewAI when the hard part is the team of agents. If your problem decomposes cleanly into roles that talk to each other, you get the collaboration model, the memory, and the retrieval without assembling them yourself.
LlamaIndex Workflows: the event is the primitive#
LlamaIndex Workflows throws out the org chart. There are no built-in agents — there's an event bus. You subclass Workflow, write methods decorated with @step, and each step declares which typed Event it consumes and which it emits. A step that accepts a StartEvent runs first; a step that returns a StopEvent ends the run. Steps pass a Context object (ctx) that shares state and can send_event() to fan work out to concurrent steps and collect the results back.
That's nearly the whole framework. It is deliberately minimal, which is the point: because a step is just a function that takes one event and returns another, you wrap any agent or model library inside it — a CrewAI crew, a raw Anthropic call, a retrieval pipeline. Workflows 1.0 also ships a TypeScript implementation, so the same event-driven model runs in a Node backend, not only in Python.
Choose LlamaIndex Workflows when the hard part is the control flow. If your problem is really a state machine — this event, then branch, then join, then stop — and you want to see and own every transition, Workflows gives you the wiring and stays out of the way. We put it head-to-head with the graph model in LlamaIndex Workflows vs LangGraph.
CrewAI hides the plumbing so you can think about agents; Workflows hides nothing so you can think about events. Neither is a downgrade — they're aimed at different hard parts.
The founder's decision, in one line#
If you can describe your system as a team ("a scraper agent feeds a summarizer agent feeds an editor"), CrewAI's crews will feel like the shape of the problem, and 1.15's config authoring means the flow can outlive whoever wrote it. If you can describe it as a machine ("on SearchDone, branch on confidence; on low confidence, re-query; else emit Answer"), Workflows' typed events will feel like the shape of the problem, and you keep the TypeScript option.
The tell is what breaks first in your prototype. If you keep fighting who does what and when they hand off, you want CrewAI. If you keep fighting what happened and what should fire next, you want Workflows. And because both speak MCP for tools and both let a step wrap the other, the wrong first guess is cheap to correct — you can nest one inside the other at exactly the seam that hurt.
Building on one of them? Our hands-on how to build an event-driven agent with LlamaIndex Workflows 1.0 takes the event-first path from an empty file to a running branch-and-join, and how to define a CrewAI flow in YAML takes the config-first path.



