An ADR Template for Agent Framework Selection
Use this page when you must pick (or replace) an agent framework and want a commit-ready ADR.
Search across all documentation pages
Use this page when you must pick (or replace) an agent framework and want a commit-ready ADR.
It is a cheatsheet template: copy the Markdown skeleton, fill every section, and link config pins.
docs/adr/ADR-0XX-framework.md.# ADR-0XX: Agent framework selection for <product/surface>
- Status: proposed | accepted | deprecated | superseded
- Date: YYYY-MM-DD
- Owner: <team>
- Supersedes: <ADR-id or none>
- Superseded by: <ADR-id or none>
## Context
What agent(s) are we building, under what time and compliance constraints?
## Forces
- Team skills:
- Deadline:
- Orchestration needs (loop / graph / HITL / multi-agent):
- Dependency and security constraints:
- Multi-model or single-provider:
- Non-goals:
## Options considered
### Option A: <name>
- Pros:
- Cons:
- Fit score (1-5):
### Option B: <name>
- Pros:
- Cons:
- Fit score (1-5):
### Option C: <name> (include "thin custom runtime" when relevant)
- Pros:
- Cons:
- Fit score (1-5):
## Decision
We will use **<framework or custom>** because <one paragraph>.
## Portable assets (must remain framework-agnostic)
- Tools / plugins:
- JSON/Pydantic schemas:
- Prompt templates:
- Gold-set evals:
- Stop reason enums:
## Config pins (verify at build)
- Package versions:
- Default model role / gateway:
- Checkpoint / state store:
- Tracing backend:
## Consequences
### Positive
-
### Negative (accepted)
-
### Follow-up work
- [ ]
## Revisit when
- [ ] Trigger 1
- [ ] Trigger 2
- [ ] Calendar review: YYYY-MM-DD
## References
- Spike notes / PR:
- Eval results:
- Related ADRs:| Criterion | Weight (1-5) | Custom thin loop | LangGraph | CrewAI | MS Agent Framework | Pydantic AI / native SDK |
|---|---|---|---|---|---|---|
| Time-to-first production agent | ||||||
| Graph / join / resume needs | ||||||
| Multi-agent primitives | ||||||
| HITL / interrupt model | ||||||
| Typed tools and schemas | ||||||
| Observability integrations | ||||||
| Dependency / air-gap friendliness | ||||||
| Team skill fit | ||||||
| Lock-in risk if wrong | ||||||
| Escape hatch quality |
Score = sum(weight x fit). Highest score is a candidate, not an automatic winner if a single hard constraint (legal, resume, skill) vetoes it.
| Option | Best when | Weak when |
|---|---|---|
| Thin custom loop | One bounded tool agent; hard dependency limits | Durable multi-day graphs; multi-team platform needs |
| LangGraph | Graphs, checkpoints, streaming, LangChain ecosystem | You only need a 50-line loop and hate graph mental model |
| CrewAI | Role-oriented crews and demos that match the metaphor | You need strict host-owned control and minimal magic |
| Microsoft Agent Framework | Enterprise .NET/Python workflows, Microsoft-centric stack | Small polyglot teams outside that ecosystem |
| Pydantic AI | Schema-first Python services | Heavy multi-agent graph product without extra structure |
| OpenAI Agents SDK / native | Single-provider speed, handoffs, MCP | Strong multi-cloud / multi-vendor requirements day one |
| No/low-code orchestrator | Integration-heavy internal automation | Core product agents needing deep eval and code review |
Exact feature sets change - verify against current docs at decision time.
Decision: LangGraph for the claims workflow agent; thin loop remains for
the FAQ single-tool bot.
Why: Claims need human approval mid-graph and durable resume across deploys.
FAQ does not.
Portable: claims tools are pure functions + Pydantic models; gold set in /evals.
Revisit when: MS Agent Framework becomes the org standard, or LangGraph
upgrade cost exceeds two eng-weeks per quarter without benefit.| Anti-pattern | Fix |
|---|---|
| "We chose X because it is popular" | Tie to forces: resume, skill, compliance |
| No custom option considered | Include thin loop when scope is small |
| Decision mixes model vendor + framework | Split into two ADRs |
| No portable assets section | Extract tools before coding graphs |
| No revisit date | Add calendar + capability triggers |
| ADR lives only in a slide deck | Commit Markdown in git |
Prefer a small set of approved options via platform ADRs. Product ADRs choose among approved options unless they have a special constraint.
Yes if split by surface (for example UI SDK vs worker graphs) and portable tools stay shared. Document the split explicitly.
Often one to five days with a real tool and a tiny eval set. Longer spikes usually mean unclear forces.
Keep status proposed, list blockers, and do not ship production traffic on it. Consider custom or already-approved stacks as interim options.
Yes when upgrade changes control model, state format, or requires multi-week migration. Routine patches can stay in release notes.
Under config pins as roles plus a link to the model/provider ADR. Do not bury vendor-specific ids only inside framework examples.
Only as a time-boxed proposed ADR with an explicit deadline. Open-ended deferrals become accidental architecture.
Enough that a new hire understands the pain you accepted (ops load, lock-in, missing features) without reading the spike.
Optional short sketches are fine. Prefer links to the spike branch and to production config modules.
Single vs multi-agent, gateway vs direct, and framework-free vs framework-based pages in this site's architecture and choosing-framework sections.
Set status to superseded, point superseded by at the new id, and keep the old file forever for audit history.
Yes. Treat the no-code product as the "framework" option and still list portable assets and exit triggers.
Stack versions: Pins from the category manifest (verify at build): OpenRouter (~315+ models, July 2026 pricing/fees); LangGraph 1.0+; CrewAI 1.14+; Microsoft Agent Framework 1.0; Vercel AI SDK 6; Pydantic AI (latest); LlamaIndex (latest); OpenAI Agents SDK (latest + MCP); MCP (Linux Foundation governance); A2A (HTTP+SSE+JSON-RPC 2.0); Solana
@solana/web3.js+@solana/spl-token.
Reviewed by Chris St. John·Last updated Jul 16, 2026