Framework Adapters
These adapters wrap an agent framework’s own loop: the framework owns the model and the reasoning, and the adapter feeds it Band’s history and tools. Every adapter follows the shared adapter construction rules and takes the feature keywords; only adapter-specific settings are listed here.
LangGraphAdapter
Adapter for LangGraph agents.
Provide either llm for the simple pattern or graph_factory / graph for your own graph. With none of them, the constructor raises ValueError: Must provide either llm (simple pattern) or graph_factory/graph (advanced pattern). Emits TOOL_CALLS and USAGE. See LangGraph for a worked example.
PydanticAIAdapter
Adapter for Pydantic AI agents with type-safe tools.
Set exactly one of config.model and llm; otherwise the constructor raises ValueError: Set exactly one of config.model or llm. Emits TOOL_CALLS and USAGE. Since band-sdk 5.1.0 the adapter ends the Pydantic AI run after a successful band_no_reply call whose sibling tool calls also succeeded, instead of letting the model continue. See Pydantic AI for a worked example.
CrewAIAdapter
Adapter for CrewAI agents with role, goal, and backstory definitions.
Emits TOOL_CALLS. system_prompt is not a field; use backstory. See CrewAI for a worked example.
CrewAIFlowAdapter
Runs one local CrewAI Flow execution per inbound room message and rebuilds orchestration state from task events.
flow_factory is required and keyword-only; it returns a new Flow for each message. A flow_factory that is not callable raises BandConfigError: flow_factory must be callable. state_source defaults to a REST-backed source that reads the run’s task events.
Emits TOOL_CALLS. See CrewAI for a worked example.
GoogleADKAdapter
Adapter for Google Agent Development Kit agents.
Emits TOOL_CALLS and USAGE. See Google ADK for a worked example.
AgnoAdapter
Wraps an Agno agent you build. The adapter takes ownership of that instance.
AgnoAdapterConfig has no fields: the Agno agent owns the model and the prompt. agent is required and keyword-only. session_id_factory maps a room ID to the Agno session ID; the default uses the room ID. There is no additional_tools argument; give tools to the Agno agent. Emits TOOL_CALLS, THOUGHTS, and USAGE. See Agno for a worked example.
StrandsAdapter
Adapter for Strands Agents.
Set exactly one of config.model and llm; otherwise the constructor raises ValueError: Set exactly one of config.model or llm. For OpenAI models, pass a Strands OpenAIResponsesModel as llm. After a successful band_no_reply call the adapter stops the Strands event loop once the current tool batch is recorded. Emits TOOL_CALLS and USAGE. See Strands Agents for a worked example.
NooaAdapter
Runs a NOOA (NVIDIA Object Oriented Agents) agent class in Band rooms, one instance per room. A NOOA agent is a Python class: its docstring is the prompt, its fields are state, its methods are tools, and the model writes and runs Python against self to act. The adapter adds Band’s tools as async methods on self.room, not as JSON schemas. Added in band-sdk 5.1.0.
Band’s tools are called with keyword arguments, for example await self.room.band_send_message(content="..."). A custom tool from additional_tools takes its original Pydantic validation payload as one argument, await self.room.<name>(arguments={...}), keyed by each field’s validation alias. A failed call raises BandToolError with the reason.
NooaRoomAgent subclasses nooa.Agent, exposes room: RoomTools, and declares async def respond(self, message: str) -> None, the ellipsis-bodied method the model completes for each room message. The model is set on the class, not the config, for example class NoteTaker(NooaRoomAgent, llm=get_llm_client("anthropic/claude-sonnet-5-5")); NOOA routes models through LiteLLM and reads that provider’s key from the environment.
Emits TOOL_CALLS, THOUGHTS, and USAGE; THOUGHTS posts each model call’s raw reasoning_content, so narrow emit to keep reasoning out of the room. Install with band-sdk[nooa], which requires Python 3.12 or 3.13 on Linux or macOS. See NOOA for a worked example.
The model writes and runs Python inside the agent process. Run a NOOA agent in a container or VM, never on a machine whose files or credentials matter.
LettaAdapter
Adapter for Letta agents with persistent memory.
LettaAdapterConfig is a pydantic-settings model: every field can also be set through a LETTA_-prefixed environment variable, and a constructor argument always wins. provider_key also reads LETTA_API_KEY.
api_key is a deprecated constructor alias for provider_key that emits DeprecationWarning: api_key is deprecated on LettaAdapterConfig, use provider_key instead; passing both raises BandConfigError: Cannot pass both provider_key and api_key. mcp_server_url and mcp_server_name are deprecated fields folded into mcp with mode="external". Emits TOOL_CALLS, TASK_EVENTS, and USAGE.
Emit.TASK_EVENTS carries the room’s Letta agent_id, which the adapter reads back to resume the server-side agent. Narrowing emit to exclude it stops resumption, so every restart creates a new Letta agent instead of reattaching.
See Letta for a worked example.
ParlantAdapter
Adapter for the Parlant behavioral engine. By default ParlantAdapter owns the Parlant server: it reserves ports and boots p.Server when the Band agent starts, and tears it down when the agent stops.
Declare guidelines before startup with adapter.add_guideline(condition=..., action=..., tools=...), which mirrors parlant.sdk.Agent.create_guideline and attaches the adapter’s tools when tools is omitted. Parlant calls a tool only through a matched guideline or journey. Calling add_guideline() after the agent starts raises RuntimeError: add_guideline must be called before the agent starts; use the configure= callback or adapter.parlant_agent.create_guideline() for a running agent.
These combinations raise ValueError at construction: parlant_agent without server (parlant_agent requires the server it lives on; pass server= as well); server together with nlp_service or a non-empty server_options; and parlant_agent together with system_prompt or custom_section. Emits nothing; Capability.MEMORY is accepted but there are no Parlant memory tools. See Parlant for a worked example.