In my experience, the vast majority of production LLM apps are simple Chains or Routers. Many developers are building complex, token-burning state machines for tasks that don’t require them, and then spend even more tokens debugging them.

This is a pragmatic guide to choosing the right orchestration pattern.

The spectrum of complexity

A pragmatic decision framework

Use a Chain when:

Use a Router when:

Use a Graph when:

Use an Agent when:

The real cost of complexity

More complexity means higher operational costs. Based on research, the trade-offs are clear:


Pattern Latency Cost Profile Debugging
Chain Low Baseline Easy
Router Low -85% (in some cases, by routing to cheaper models) Easy
Graph Moderate-High +Linear Hard
Agent / Multi-Agent Systems High (50s+) 3.7x+ Very Hard

The pragmatic migration path

Don’t start with complexity. Evolve based on need.

  1. Always start with a Chain. It’s simple, cheap, and easy to debug
  2. Add a Router when you notice cost or quality anomalies for certain requests that could be handled by different models or logic
  3. Move to a Graph only when your Chain or Router frequently fails on edge cases that require retries or validation loops
  4. Use an Agent only when the task is truly unpredictable

A simple test: If you can express the entire workflow using if/else and for loops, stick with a Chain or Router (at most a Graph). Only reach for an Agent when even the sequence of steps is unpredictable.


Don't add an agent because it's trendy. Add one only when your Chain, Router, or Graph has failed repeatedly.