> ## Documentation Index
> Fetch the complete documentation index at: https://labs.prompthon.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Framework Comparison: API Directly, LlamaIndex, LangChain, LangGraph, and CrewAI

<div className="not-prose my-4 rounded-md border border-gray-200 bg-gray-50 p-2 text-sm dark:border-gray-800 dark:bg-gray-900/40">
  <div className="mb-2 px-1 text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400">Need help?</div>

  <div className="flex flex-wrap gap-2">
    <a className="inline-flex items-center gap-2 rounded-md border border-gray-200 bg-white px-3 py-1.5 font-medium text-gray-700 no-underline shadow-sm hover:border-gray-300 hover:bg-gray-50 dark:border-gray-800 dark:bg-gray-950/60 dark:text-gray-200 dark:hover:bg-gray-900" href="https://discord.gg/sDE2HhGTg4" target="_blank" rel="noreferrer">
      <Icon icon="discord" iconType="brands" size={14} />

      <span>Ask in Discord</span>
    </a>

    <a className="inline-flex items-center gap-2 rounded-md border border-gray-200 bg-white px-3 py-1.5 font-medium text-gray-700 no-underline shadow-sm hover:border-gray-300 hover:bg-gray-50 dark:border-gray-800 dark:bg-gray-950/60 dark:text-gray-200 dark:hover:bg-gray-900" href="https://github.com/Prompthon-IO/agent-systems-handbook/issues/new/choose" target="_blank" rel="noreferrer">
      <Icon icon="github" iconType="brands" size={14} />

      <span>Open a GitHub issue</span>
    </a>

    <a className="inline-flex items-center gap-2 rounded-md border border-gray-200 bg-white px-3 py-1.5 font-medium text-gray-700 no-underline shadow-sm hover:border-gray-300 hover:bg-gray-50 dark:border-gray-800 dark:bg-gray-950/60 dark:text-gray-200 dark:hover:bg-gray-900" href="https://github.com/Prompthon-IO/agent-systems-handbook/blob/main/SUPPORT.md" target="_blank" rel="noreferrer">
      <Icon icon="life-ring" size={14} />

      <span>Support guide</span>
    </a>
  </div>
</div>

## Summary

AI frameworks package repeatable LLM application work: prompts, tool calls,
retrieval, state, routing, retries, and observability. They exist because the
first demo is often simple, but the second and third feature quickly create
the same engineering problems again.

A practical default for beginners is: **start with the smallest thing that
solves the job, then adopt a framework when the project needs structure that
is no longer easy to maintain manually.**

## Why It Matters

A direct API call is enough when the task is a single prompt, a small script,
or a prototype where you can see every step. A framework starts to make sense
when the project needs:

* **memory** across turns or sessions
* **retrieval** from documents, databases, or private knowledge bases
* **tool use** such as search, database queries, calendar actions, or code
* **stateful control flow** with branches, loops, retries, or checkpoints
* **collaboration patterns** where several roles or agents divide the work
* **observability** so failures can be traced and improved

A common over-engineering pattern is adopting a framework before the project
needs one. That can turn a small learning project into dependency management,
new vocabulary, and more difficult debugging. The right question is not "which
framework is best?" It is:

> Which part of my current project is becoming repetitive, fragile, or hard to
> reason about?

## Mental Model

Think of framework choice like choosing between writing a script, using an app
starter kit, or using a workflow engine:

| Option | Everyday analogy | What it means |
| - | - | - |
| **No framework** | Writing a checklist by hand | You call the LLM API directly and write the prompt, state handling, tool calls, and error handling yourself. This is best when the workflow is small and visible. |
| **LlamaIndex** | A library catalog and reference desk | It helps ingest, index, search, and answer questions over documents. Use it when the main job is connecting an LLM to private data. |
| **LangChain** | An application starter kit for LLM apps | It gives reusable pieces for models, prompts, tools, agents, streaming, and integrations. Use it when you are building a broader LLM application with tools or multiple steps. |
| **LangGraph** | A workflow engine or state machine | It makes steps, branches, loops, checkpoints, and recovery explicit. Use it when control flow matters more than quick setup. |
| **CrewAI** | A small project team with assigned roles | It models agents as role-based collaborators with tasks. Use it when the problem naturally fits a planner/researcher/writer/reviewer style of division. |

```mermaid theme={null}
flowchart TD
  Start["What is the job?"] --> Q1{"One small prompt or script?"}
  Q1 -- Yes --> NoFW["No framework"]
  Q1 -- No --> Q2{"Mostly document search or QA?"}
  Q2 -- Yes --> LI["LlamaIndex"]
  Q2 -- No --> Q3{"Building a tool-using LLM app?"}
  Q3 -- Yes --> LC["LangChain"]
  Q3 -- No --> Q4{"Need branches, loops, checkpoints, or recovery?"}
  Q4 -- Yes --> LG["LangGraph"]
  Q4 -- No --> Q5{"Does the work map to named roles?"}
  Q5 -- Yes --> CA["CrewAI"]
  Q5 -- No --> NoFW
```

## Comparison Table

| Dimension | No framework | LlamaIndex | LangChain | LangGraph | CrewAI |
| - | - | - | - | - | - |
| **Purpose** | Direct LLM calls with manual control | Data ingestion, indexing, retrieval, and document QA | General LLM app and agent development | Stateful graph orchestration | Role-based multi-agent task execution |
| **Complexity** | Low | Low to moderate | Moderate | Moderate to high | Moderate |
| **Best use cases** | Learning, demos, one-off scripts, simple assistants | RAG, knowledge bases, document search, internal QA | Chatbots with tools, agent apps, reusable integrations | Long-running workflows, loops, checkpoints, human review, recovery | Research, writing, analysis, or operations tasks split across roles |
| **What it saves you from writing** | No framework layer; you implement the pieces directly | Loaders, indexes, retrievers, query flows | Model/tool/prompt wiring, agent harnesses, integrations | State transitions, branching, persistence, resumability | Role/task setup and delegation patterns |
| **When to avoid** | When state, retrieval, or tools are growing | When documents are not central | When a direct API call is enough | When the workflow is linear and short | When one agent or a plain workflow is enough |

## Scenario Walkthroughs

### Scenario 1: Simple chatbot

* **No framework**: store the message list, call the model, and return the
  answer. This is usually enough for a prototype.
* **LangChain**: becomes useful when the chatbot needs tool calls, structured
  outputs, streaming, tracing, or reusable prompt/model wiring.
* **Verdict**: start without a framework. Move to LangChain when the chatbot
  becomes an application rather than a single chat loop.

### Scenario 2: Document QA over internal PDFs

* **No framework**: parse files, chunk text, create embeddings, store vectors,
  retrieve relevant chunks, assemble context, and handle citations yourself.
* **LlamaIndex**: provides a focused path for loading documents, building an
  index, and querying over private data.
* **LangChain**: can also build retrieval flows, especially when retrieval is
  one part of a broader tool-using agent.
* **Verdict**: choose LlamaIndex when document retrieval is the core product;
  choose LangChain when retrieval is one tool inside a larger agent app.

### Scenario 3: Multi-step research workflow

* **LangGraph**: model the process as explicit nodes such as plan, search,
  synthesize, review, and revise. Use checkpoints when the workflow may need
  to pause, resume, or recover.
* **CrewAI**: model the process as roles such as planner, researcher, writer,
  and editor, each with a task.
* **Verdict**: choose CrewAI for a fast role-based prototype; choose LangGraph
  when execution control and state are the main risks.

## Useful Defaults

* Use **no framework** for the first working version unless retrieval, tools,
  or state already dominate the problem.
* Use **LlamaIndex** when the question is "how do I make this data searchable
  and answerable by an LLM?"
* Use **LangChain** when the question is "how do I build an LLM application
  that connects models, prompts, tools, and integrations?"
* Use **LangGraph** when the question is "how do I control and recover a
  multi-step process?"
* Use **CrewAI** when the question is "how do I divide this work across named
  agent roles?"
* If a task is deterministic, use a normal function or workflow. Add an agent
  only when it provides useful coordination, tool use, or decision-making.

## Citations

* [LangChain documentation](https://docs.langchain.com/oss/python/langchain/overview)
* [LlamaIndex documentation](https://developers.llamaindex.ai/python/framework/)
* [LangGraph documentation](https://docs.langchain.com/oss/python/langgraph/overview)
* [CrewAI documentation](https://docs.crewai.com/)
* Current official readings are listed in `external_readings`.

## Reading Extensions

* [Agent Frameworks](/ecosystem/agent-frameworks): intermediate-level comparison
  of conversation-first, graph-first, skill-first, and engineering-first
  frameworks.
* [Agent Runtime Building Blocks](/patterns/agent-runtime-building-blocks):
  the runtime primitives that frameworks wrap.
* [Ecosystem Overview](/ecosystem): the full ecosystem lane.

## Update Log

* 2026-06-02: Revised into a beginner decision guide with current official
  links, clearer mental models, and less API-specific guidance.
* 2026-05-04: Initial draft for beginner-oriented framework comparison.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.