Support matrix¶
Every agent-framework integration and extra, its pinned range, and the nox session that
tests it. The tables between the markers are generated from pyproject.toml and
noxfile.py by tests/docs/test_support_matrix.py; the test fails when they drift.
flowchart LR
PY["pyproject.toml<br/>extras and pins"] --> T["test_support_matrix.py<br/>render()"]
NX["noxfile.py<br/>EXTRAS, PYTHONS, sessions"] --> T
IP["integrations/*.py<br/>version gates"] --> T
T -->|"must equal"| P["this page"]
Backends and runtimes (no agent framework needed)¶
Web apps, workers, queues, serverless functions, pipelines, notebooks, scripts and other languages need no agent framework. Each one, how it attaches and what tests it: Backends and runtimes.
Which versions are tested¶
| Rule | Detail |
|---|---|
| Python | every contract session runs on 3.11, 3.12 and 3.13 |
| Framework versions | nox installs the newest release inside the pinned range when the session runs; there is no lock file, so "tested" means "the newest in range at the last run" |
| pydantic | core runs the newest pydantic<3; core-floor runs pydantic==2.12.* |
| Shared environment | contract-all-compatible installs every extra in all together, runs pip check, then every contract test |
| Own environment | extras outside all conflict with another extra; each runs only in its own contract-<target> session |
| Checked at use | a bridge with a version gate raises IntegrationError for a framework release outside that range |
| Integration | Module | Extra | Pinned range | Environment | Contract session (Python 3.11, 3.12, 3.13) | Checked at use |
|---|---|---|---|---|---|---|
| OpenAI | openai |
none | none (plain dicts) | core only | contract-openai, contract-all-compatible |
none |
| Gemini | gemini |
gemini |
google-genai>=2.30,<3 |
in all |
contract-gemini, contract-all-compatible |
none |
| Anthropic | anthropic |
none | none (plain dicts) | core only | contract-anthropic, contract-all-compatible |
none |
| LangChain | langchain |
langchain |
langchain-core>=1.4,<2 |
in all |
contract-langchain, contract-all-compatible |
none |
| LangGraph | langgraph |
langgraph |
langgraph>=1.2.15,<2, langgraph-checkpoint>=4.3,<5 |
in all |
contract-langgraph, contract-all-compatible |
none |
| Google ADK | adk |
adk |
google-adk>=2.13,<3 |
own: opentelemetry<=1.44 | contract-adk |
2.13 to below 3.0 |
| MCP | mcp |
mcp |
mcp>=2.3,<3 |
in all |
contract-mcp, contract-all-compatible |
none |
| OpenAI Agents SDK | openai_agents |
openai-agents |
openai-agents>=0.24,<1 |
in all |
contract-openai_agents, contract-all-compatible |
0.24 to below 1.0 |
| Pydantic AI | pydantic_ai |
pydantic-ai |
pydantic-ai-slim>=2.60,<3 |
in all |
contract-pydantic_ai, contract-all-compatible |
none |
| LlamaIndex | llamaindex |
llamaindex |
llama-index-core>=0.14,<0.15 |
in all |
contract-llamaindex, contract-all-compatible |
none |
| CrewAI | crewai |
crewai |
crewai>=1.15,<2 |
own: mcp<2 | contract-crewai |
none |
| OpenAPI | openapi |
openapi |
httpx>=0.27,<1, pyyaml>=6,<7 |
in all |
contract-openapi, contract-all-compatible |
none |
| Microsoft Agent Framework | agent_framework |
agent-framework |
agent-framework-core>=1.23,<2 |
in all |
contract-agent_framework, contract-all-compatible |
1.23 to below 2.0 |
| Agno | agno |
agno |
agno>=3.1,<4 |
in all |
contract-agno, contract-all-compatible |
3.1 to below 4.0 |
| DSPy | dspy |
dspy |
dspy>=3.4,<4 |
own: LiteLLM | contract-dspy |
none |
| Strands Agents | strands |
strands |
strands-agents>=1.60,<2 |
own: mcp<2.2 | contract-strands |
none |
| Haystack | haystack |
haystack |
haystack-ai>=3.3,<4 |
in all |
contract-haystack, contract-all-compatible |
none |
| smolagents | smolagents |
smolagents |
smolagents>=1.24,<2 |
in all |
contract-smolagents, contract-all-compatible |
none |
| Claude Agent SDK | claude_agent |
claude-agent |
claude-agent-sdk>=0.2.150,<0.3, mcp>=2.3,<3 |
in all |
contract-claude_agent, contract-all-compatible |
0.2.150 to below 0.3.0 |
| AutoGen | autogen |
autogen |
autogen-core>=0.7.5,<0.8, autogen-agentchat>=0.7.5,<0.8 |
in all |
contract-autogen, contract-all-compatible |
none |
| Semantic Kernel | semantic_kernel |
semantic-kernel |
semantic-kernel>=1.44,<2 |
own: pydantic<2.14 | contract-semantic_kernel |
none |
| CAMEL-AI | camel |
camel |
camel-ai>=0.2.90,<0.3, mcp<2 |
own: needs mcp<2; pins pydantic<=2.12.0, while google-genai in all needs >=2.12.5 |
contract-camel |
0.2.90 to below 0.3.0 |
| AG2 | ag2 |
ag2 |
ag2>=1.2.2,<2 |
in all |
contract-ag2, contract-all-compatible |
1.2.2 to below 2.0 |
| A2A | a2a |
a2a |
a2a-sdk[http-server]>=1.3,<2 |
in all |
contract-a2a, contract-all-compatible |
none |
| AG-UI | ag_ui |
ag-ui |
ag-ui-protocol>=1.0,<2 |
in all |
contract-ag_ui, contract-all-compatible |
1.0 to below 2.0 |
| Extra | Pinned range | In all |
Installed by nox sessions |
|---|---|---|---|
openai |
openai>=3.41,<4 |
yes | docs-examples, models, contract-all-compatible |
gemini |
google-genai>=2.30,<3 |
yes | contract-gemini, models, contract-all-compatible |
anthropic |
anthropic>=2.3,<3 |
yes | docs-examples, models, contract-all-compatible |
redis |
redis>=8.1,<9 |
yes | models, contract-all-compatible |
otel |
opentelemetry-api>=1.39,<2 |
yes | models, contract-all-compatible |
langchain |
langchain-core>=1.4,<2 |
yes | contract-langchain, docs-examples, contract-all-compatible |
langgraph |
langgraph>=1.2.15,<2, langgraph-checkpoint>=4.3,<5 |
yes | contract-langgraph, docs-examples, contract-all-compatible |
adk |
google-adk>=2.13,<3 |
no | contract-adk |
mcp |
mcp>=2.3,<3 |
yes | contract-mcp, server, contract-all-compatible |
openai-agents |
openai-agents>=0.24,<1 |
yes | contract-openai_agents, contract-all-compatible |
pydantic-ai |
pydantic-ai-slim>=2.60,<3 |
yes | contract-pydantic_ai, contract-all-compatible |
llamaindex |
llama-index-core>=0.14,<0.15 |
yes | contract-llamaindex, contract-all-compatible |
crewai |
crewai>=1.15,<2 |
no | contract-crewai |
openapi |
httpx>=0.27,<1, pyyaml>=6,<7 |
yes | contract-openapi, typecheck, contract-all-compatible |
agent-framework |
agent-framework-core>=1.23,<2 |
yes | contract-agent_framework, contract-all-compatible |
agno |
agno>=3.1,<4 |
yes | contract-agno, contract-all-compatible |
dspy |
dspy>=3.4,<4 |
no | contract-dspy |
strands |
strands-agents>=1.60,<2 |
no | contract-strands |
haystack |
haystack-ai>=3.3,<4 |
yes | contract-haystack, contract-all-compatible |
smolagents |
smolagents>=1.24,<2 |
yes | contract-smolagents, contract-all-compatible |
claude-agent |
claude-agent-sdk>=0.2.150,<0.3, mcp>=2.3,<3 |
yes | contract-claude_agent, contract-all-compatible |
autogen |
autogen-core>=0.7.5,<0.8, autogen-agentchat>=0.7.5,<0.8 |
yes | contract-autogen, contract-all-compatible |
semantic-kernel |
semantic-kernel>=1.44,<2 |
no | contract-semantic_kernel |
camel |
camel-ai>=0.2.90,<0.3, mcp<2 |
no | contract-camel |
ag2 |
ag2>=1.2.2,<2 |
yes | contract-ag2, contract-all-compatible |
a2a |
a2a-sdk[http-server]>=1.3,<2 |
yes | contract-a2a, docs-examples, contract-all-compatible |
ag-ui |
ag-ui-protocol>=1.0,<2 |
yes | contract-ag_ui, contract-all-compatible |
sqlalchemy |
sqlalchemy[asyncio]>=2.0.30,<3 |
yes | contract-all-compatible |
dynamodb |
aioboto3>=13,<16 |
yes | contract-all-compatible |
temporal |
temporalio>=1.35,<2 |
no | contract-temporal |
dbos |
dbos>=3.4,<4 |
no | contract-dbos |
server |
starlette>=1.0,<2, uvicorn>=0.30,<1, h11>=0.16,<1, extra mcp |
yes | docs-examples, server, ts, contract-all-compatible |
server-wsgi |
a2wsgi>=1.10,<2, extra server |
yes | docs-examples, server, contract-all-compatible |
presidio |
presidio-analyzer>=2.2,<3, presidio-anonymizer>=2.2,<3 |
no | none |
nemo |
nemoguardrails>=0.24,<1 |
no | none |
mem0 |
mem0ai>=2.2,<3 |
no | none |
zep |
zep-cloud>=4.1,<5 |
no | none |
graphiti |
graphiti-core>=0.31,<1 |
no | none |
openai and anthropic render plain dicts, so their integrations need no extra; the
openai, gemini and anthropic extras power the model ports (OpenAIModel,
GeminiModel, AnthropicModel), tested in the models session.
Regenerate¶
Paste the output between the markers. Change a pin in pyproject.toml or a session in
noxfile.py first; the page follows.
Files¶
| File | Does |
|---|---|
tests/docs/test_support_matrix.py |
renders the tables from pyproject.toml and noxfile.py and compares them with this page |