Monospace · AgentsNº 003 · Playbook Edition

Seven Frameworks,
One Category Error

LangChain, LangGraph, Claude Agent SDK, OpenAI Agents SDK, Flue, Pydantic AI, and NVIDIA's NeMo Agent Toolkit — compared through a hybrid self-hosting lens, with the marketing stripped off.

THE LAYER MAP
7 frameworks + 1 fleet layer · Python / TypeScriptBenched — 4 probes · validity window June 2026
The Premise02

Ask "which agent framework?" and you've already made the mistake.

The seven contenders aren't the same kind of thing. Some are integration glue. Some are orchestration graphs. A couple are full autonomous harnesses, and NVIDIA's NeMo Agent Toolkit sits off to the side of all of them. The study works through one deliberately concrete lens: a hybrid setup where your own GPU inference and cloud APIs both have to work.

7frameworks compared
4architectural layers
12decision axes scored
1line to swap your backend
Comparing them on features is comparing an engine, a chassis, a race teamSeven Frameworks, One Category Error
The Machine03

Sort every contender onto a layer — then compare.

Fleet layerSandcastle · runs many agents above the harnesses · pre-1.0
Full harnessClaude Agent SDK · Flue · turnkey autonomous loop · pre-1.0
OrchestrationLangGraph · OpenAI Agents SDK · Pydantic AI · past 1.0 ✓
Integration glueLangChain · wiring, adapters, and tool plumbing
The deciding facta self-hosted NIM speaks the OpenAI protocol — any framework taking a custom base_url swaps in one line
NVIDIA's NeMo Agent Toolkit sits off to the side of the stackSeven Frameworks, One Category Error
The Bench04 · Why the plays are believable

Four probes anyone can re-run in an afternoon.

No live GPU inference, no durability tests, no long-horizon quality claims — those need hardware and credentials we didn't have, and the study says so. What we did run is cheap and decisive: build the portability agent three ways, measure four supply chains, and crack open the one package that wouldn't sit the test.

3/3frameworks passed the swap
4 × 12layers × decision axes
7 → 271deps, Sandcastle → Flue
248 MBbinary inside one SDK
June 2026validity window
Every measurement here is re-runnable without a GPUSeven Frameworks, One Category Error
Play 01Verified An Afternoon

Keep your exit one base_url away.

The scenario → the move

You want cloud APIs today and your own GPUs tomorrow, without rewriting the agent in between. Build the same ~32-line tool-calling agent, point it at an OpenAI-compatible endpoint, and prove the exit is a config change — not a migration.

client = OpenAI(
  base_url="https://your-nim/v1"  # ← the only line that moves
)
The receipt

We built the identical ~32-line tool-calling agent in LangGraph, the OpenAI Agents SDK, and Pydantic AI; each passed against an OpenAI-compatible endpoint with a one-line base-URL swap.

Boundary — passing means the wire protocol carries you, not that the frameworks' features are equal.

The OpenAI wire protocol — not any framework — is the standardSeven Frameworks, One Category Error
Play 02Verified An Afternoon

Sort contenders by layer before comparing features.

The scenario → the move

A "which framework?" debate that never converges, because the candidates are not the same kind of thing. Place each one on its layer — integration glue, orchestration graph, full harness, fleet layer — before you score a single feature, and most of the argument evaporates.

glue → orchestration → harness → fleet
# put each contender on a rung first
The receipt

The study mapped all seven onto four layers and scored twelve decision axes; the maturity check cut exactly along layer lines — orchestration is past 1.0 with stability commitments, every harness and vendor SDK is not.

Boundary — layer tells you the kind of thing; it won't rank two tools on the same rung.

Most "which framework?" arguments dissolve once each is placedSeven Frameworks, One Category Error
Play 03Verified An Afternoon

Weigh the supply chain before the demo.

The scenario → the move

Two frameworks look equivalent until you install them and one brings 271 friends. Dependency count and install size are risk numbers you can get in minutes — pull them before the feature demo, not after, and they separate the field more sharply than any landing page.

uv pip install <framework>
uv pip list | wc -l   # deps · then du -sh
The receipt

Measured on our bench: Sandcastle 7 packages in 15 MB · LangChain 34 in 95 MB · Flue 271 in 210 MB · pydantic-ai's full bundle 147 in 406 MB.

Boundary — install weight is a risk signal, not a quality verdict; small can still be underpowered.

Seven packages against 271 is a number your security team can act onSeven Frameworks, One Category Error
Play 04Verified An Afternoon

Probe the lock-in before you're in it.

The scenario → the move

A turnkey harness feels like the fast path — until self-hosting becomes a requirement in a contract. Find out which layer genuinely cannot point at your own endpoint before you standardize on it, by opening the package and reading what it actually wraps.

pip show claude-agent-sdk
# then look inside: what model paths does it allow?
The receipt

We cracked open the Claude Agent SDK package and found a 248 MB compiled Claude Code binary whose supported model paths are Anthropic, Bedrock, and Vertex — the one contender that cannot take the base-URL test.

Boundary — sealed is also why it's the most battle-tested loop; lock-in concentrates where capability is densest.

The one that couldn't sit the test told us more than a feature matrixSeven Frameworks, One Category Error
The Fine Print09

A comparison, not an audit — and it says so.

Full report: comparison study in the archiveSeven Frameworks, One Category Error
The Ledger10 · The forwardable summary

Four plays, every one an afternoon.

PlayTierEffortReceipt
01 Keep your exit one base_url awayVerifiedAN AFTERNOON32-line agent in 3 frameworks · one-line base-URL swap
02 Sort contenders by layer firstVerifiedAN AFTERNOON7 → 4 layers · 12 axes · maturity cut along layer lines
03 Weigh the supply chain before the demoVerifiedAN AFTERNOON7 pkg/15 MB → 271 pkg/210 MB across the field
04 Probe the lock-in before you're in itVerifiedAN AFTERNOONClaude Agent SDK: 248 MB binary · Anthropic/Bedrock/Vertex only
Tiers: Verified — we ran it on the bench, no GPU requiredSeven Frameworks, One Category Error
The Kicker11

Best for choosing a stack layer by layer.

If you run one play tonight, build the 32-line portability probe against your own stack. Point it at an OpenAI-compatible endpoint, swap the base_url, and run it. Now you know for certain whether your exit is a config change or a rewrite — instead of guessing from a docs page.

client = OpenAI(base_url="https://your-nim-endpoint/v1")
# build it in LangGraph, OpenAI Agents SDK, or Pydantic AI — all passed
MONOSPACE · monospacemag.comField-tested reviews of trending repositories
← → / space · F fullscreen