> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.band.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.band.ai/_mcp/server.

# Adapter Features

> Reference for band-sdk 6.0.1 adapter construction, the shared config and constructor options, the emit, capabilities, and tool filter keywords, and the SUPPORTED_EMIT and SUPPORTED_CAPABILITIES of every adapter.

Every built-in adapter is built from one typed config object plus keyword-only live objects, and every one accepts the same five feature keywords. This page owns those shared rules; the per-adapter pages list only adapter-specific settings.

## Adapter Construction

```python
XAdapter(
    config: XAdapterConfig | None = None,
    *,
    history_converter=...,   # adapters that take one
    additional_tools=...,    # adapters that take them
    ...,                     # live objects: clients, graphs, factories, callbacks
    **features: Unpack[FeatureKwargs],
)
```

`config` holds plain settings: model names, prompts, timeouts, and modes. Live objects stay keyword-only constructor arguments, so a config can always be loaded from YAML or JSON with `XAdapterConfig.model_validate(data)`. `config` is required only when no usable default exists: `A2AAdapter` needs `remote_url`, `ACPClientAdapter` needs `command`, and `SlackAdapter` needs `apps`.

Every `XAdapterConfig` is a frozen pydantic model. An unknown field raises `ValidationError` (`Extra inputs are not permitted`), so a removed field name fails at construction instead of being ignored.

> **Warning**
>
> Adapter constructors take no flat settings. `AnthropicAdapter(model="claude-sonnet-5-5")` raises `TypeError: SimpleAdapter._resolve_features() got an unexpected keyword argument 'model'`. Pass `AnthropicAdapter(AnthropicAdapterConfig(model="claude-sonnet-5-5"))`.

## Common Adapter Options

The prompt options `custom_section` and `system_prompt` are fields on the adapter's config object. `history_converter` and `additional_tools` are constructor arguments, and the `**features` keywords are constructor keywords.

The `**features` keywords are accepted by A2A, A2A gateway, ACPClient, Agno, Anthropic, ClaudeSDK, Codex, CopilotACP, CopilotSDK, CrewAI, CrewAI Flow, CursorACP, Gemini, GoogleADK, LangGraph, Letta, NOOA, OmpACP, OpenCode, Parlant, PydanticAI, Slack, and Strands. `BandACPServerAdapter` accepts the keywords but declares no emit kinds or capabilities, so a nonempty `emit` or `capabilities` raises `BandConfigError`.

| Option                         | Applies to                                                                                                                                                                         | Description                                                                                           |
| :----------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------- |
| `custom_section` (config)      | ACPClient, Anthropic, ClaudeSDK, Codex, CopilotACP, CopilotSDK, CrewAI, CursorACP, Gemini, GoogleADK, LangGraph, Letta, NOOA, OmpACP, OpenCode, Parlant, PydanticAI, Strands       | Additional instructions added to the adapter prompt                                                   |
| `system_prompt` (config)       | Anthropic, Codex, Gemini, GoogleADK, Parlant, PydanticAI, Strands                                                                                                                  | Full prompt override where supported                                                                  |
| `emit`                         | Any adapter taking `**features`                                                                                                                                                    | Narrow which event kinds the adapter reports into the room; see [Adapter Features](#adapter-features) |
| `capabilities`                 | Any adapter taking `**features`                                                                                                                                                    | Add platform tool groups to the schemas the model sees; see [Adapter Features](#adapter-features)     |
| `include_tools`                | Any adapter taking `**features`                                                                                                                                                    | Keep only these platform tools by name                                                                |
| `exclude_tools`                | Any adapter taking `**features`                                                                                                                                                    | Drop these platform tools by name                                                                     |
| `include_categories`           | Any adapter taking `**features`                                                                                                                                                    | Keep only platform tools in these categories: `chat`, `contacts`, `memory`, `files`                   |
| `history_converter` (argument) | Agno, Anthropic, ClaudeSDK, Codex, CopilotSDK, CrewAI, CrewAI Flow, Gemini, GoogleADK, LangGraph, Letta, NOOA, OpenCode, Parlant, PydanticAI, Strands                              | Convert Band room history into the framework-specific format                                          |
| `additional_tools` (argument)  | ACPClient, Anthropic, ClaudeSDK, Codex, CopilotACP, CopilotSDK, CrewAI, CrewAI Flow, CursorACP, Gemini, GoogleADK, LangGraph, NOOA, OmpACP, OpenCode, Parlant, PydanticAI, Strands | Add framework-compatible custom tools                                                                 |

`additional_tools` takes `CustomToolDef` pairs, `(InputModel, handler)`, where `InputModel` is a pydantic model describing the arguments; LangGraph also accepts LangChain tools, and Pydantic AI and Strands also accept plain callables. A custom tool declares what a successful call does to the turn with `declares_turn_effect`; see [Custom Tools and Turn Effects](/reference/sdk/platform-tools#custom-tools-and-turn-effects).

## Adapter Features

Adapters take their Band feature settings as direct keyword arguments, typed as `**features: Unpack[FeatureKwargs]`. There are five keys, all optional:

| Key                  | Type                                 | Default                         | Effect                                                                              |
| :------------------- | :----------------------------------- | :------------------------------ | :---------------------------------------------------------------------------------- |
| `emit`               | `Emit \| Iterable[Emit]`             | Everything the adapter supports | Event kinds reported into the room timeline                                         |
| `capabilities`       | `Capability \| Iterable[Capability]` | None                            | Platform tool groups added to the schemas the model sees                            |
| `include_tools`      | `Iterable[str]`                      | All                             | Keep only platform tools with these names                                           |
| `exclude_tools`      | `Iterable[str]`                      | None dropped                    | Drop platform tools with these names                                                |
| `include_categories` | `Iterable[str]`                      | All                             | Keep only platform tools in these categories: `chat`, `contacts`, `memory`, `files` |

```python
from band import Capability, Emit
from band.adapters import AnthropicAdapter, AnthropicAdapterConfig

config = AnthropicAdapterConfig(model="claude-sonnet-5-5")

# Report only token usage, and add the contact tools
adapter = AnthropicAdapter(
    config,
    emit={Emit.USAGE},
    capabilities={Capability.CONTACTS},
)

# Emit is flag-capable, so a union, a set, or a list all work
adapter = AnthropicAdapter(config, emit=Emit.TOOL_CALLS | Emit.USAGE)

# Silence the adapter completely
adapter = AnthropicAdapter(config, emit=())
```

`Emit` and `Capability` members:

| Value                 | Effect                                                                                                              |
| :-------------------- | :------------------------------------------------------------------------------------------------------------------ |
| `Emit.TOOL_CALLS`     | Emit `tool_call` and `tool_result` events into the room timeline                                                    |
| `Emit.TASK_EVENTS`    | Emit task lifecycle events                                                                                          |
| `Emit.THOUGHTS`       | Emit the agent's intermediate reasoning as `thought` events                                                         |
| `Emit.USAGE`          | Emit turn token-usage events                                                                                        |
| `Capability.CONTACTS` | Add the contact tools                                                                                               |
| `Capability.MEMORY`   | Add the memory tools                                                                                                |
| `Capability.TASKS`    | Add the seven task board tools                                                                                      |
| `Capability.FILES`    | Gates the room file tools, which this reference does not cover; see [Platform Tools](/reference/sdk/platform-tools) |

Combine members of one enum with `|`; mixing the two raises `TypeError: cannot combine Emit with Capability`. [Platform Tools](/reference/sdk/platform-tools) lists the tools in each group and what each group needs on the platform side.

> **Note**
>
> `emit` and `capabilities` default differently. Omitting `emit` resolves to every kind the adapter declares in `SUPPORTED_EMIT`, so events are on unless you narrow them; an explicit empty value such as `emit=()` silences the adapter. Omitting `capabilities` adds nothing, because each capability puts extra tool schemas in front of the model on every turn. The `capabilities` argument on the [schema accessors](/reference/sdk/platform-tools#agenttoolsprotocol) is a separate layer with its own default.

> **Warning**
>
> Passing an `Emit` or `Capability` member the adapter does not declare raises `BandConfigError` at construction, naming the unsupported values and the supported set, for example `A2AAdapter does not support emit kind(s): thoughts; supported: (none)`. The adapter is not built.

At startup, `Agent.start()` drops any capability the connected deployment does not serve. As of `band-sdk` 6.0.1 this applies only to `Capability.FILES`, which is dropped unless the agent's `/me` response reports the `ff_file_transfer` feature flag as on.

The three tool filters narrow the platform tool schemas, in strict precedence: `include_categories`, then `include_tools`, then `exclude_tools`. Each stage narrows the result of the previous one, so `include_categories=["chat"]` together with `include_tools=["band_store_memory"]` yields nothing, because `band_store_memory` is in the `memory` category. Unknown names in `include_tools` or `exclude_tools` are logged as a warning (`include_tools contains unknown names: ...`) and otherwise ignored.

> **Warning**
>
> `Emit.TASK_EVENTS` carries state on the Codex, Letta, and OpenCode adapters: each persists its session, thread, or agent resume mapping in task-event metadata gated by that flag. It is in the default `emit` set for all three, so leaving `emit` alone is safe. An explicit `emit=` replaces that default, so any set you pass must still include `Emit.TASK_EVENTS`, and `emit=()` stops resumption across restarts.

### What Each Adapter Supports

`SUPPORTED_EMIT` is also the default `emit`, so this table doubles as what the adapter reports when you pass no `emit`. An adapter with an empty emit set emits nothing and rejects every nonempty `emit` value.

| Adapter                | `SUPPORTED_EMIT`                        | `SUPPORTED_CAPABILITIES`               |
| :--------------------- | :-------------------------------------- | :------------------------------------- |
| `A2AAdapter`           | none                                    | none                                   |
| `A2AGatewayAdapter`    | none                                    | none                                   |
| `BandACPServerAdapter` | none                                    | none                                   |
| `ParlantAdapter`       | none                                    | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `CrewAIAdapter`        | `TOOL_CALLS`                            | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `CrewAIFlowAdapter`    | `TOOL_CALLS`                            | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `AnthropicAdapter`     | `TOOL_CALLS`, `USAGE`                   | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `GeminiAdapter`        | `TOOL_CALLS`, `USAGE`                   | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `GoogleADKAdapter`     | `TOOL_CALLS`, `USAGE`                   | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `LangGraphAdapter`     | `TOOL_CALLS`, `USAGE`                   | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `PydanticAIAdapter`    | `TOOL_CALLS`, `USAGE`                   | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `StrandsAdapter`       | `TOOL_CALLS`, `USAGE`                   | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `ACPClientAdapter`     | `TOOL_CALLS`, `THOUGHTS`, `TASK_EVENTS` | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `CopilotACPAdapter`    | `TOOL_CALLS`, `THOUGHTS`, `TASK_EVENTS` | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `CursorACPAdapter`     | `TOOL_CALLS`, `THOUGHTS`, `TASK_EVENTS` | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `OmpACPAdapter`        | `TOOL_CALLS`, `THOUGHTS`, `TASK_EVENTS` | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `AgnoAdapter`          | `TOOL_CALLS`, `THOUGHTS`, `USAGE`       | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `ClaudeSDKAdapter`     | `TOOL_CALLS`, `THOUGHTS`, `USAGE`       | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `CopilotSDKAdapter`    | `TOOL_CALLS`, `THOUGHTS`, `USAGE`       | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `NooaAdapter`          | `TOOL_CALLS`, `THOUGHTS`, `USAGE`       | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `LettaAdapter`         | `TOOL_CALLS`, `TASK_EVENTS`, `USAGE`    | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `OpencodeAdapter`      | `TOOL_CALLS`, `TASK_EVENTS`, `USAGE`    | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `CodexAdapter`         | all four                                | `CONTACTS`, `MEMORY`, `TASKS`, `FILES` |
| `SlackAdapter`         | the inner adapter's                     | the inner adapter's                    |

`BandACPServerAdapter` declares no emit kinds or capabilities, so there is nothing to narrow. On the ACP client adapters, `emit` controls which session updates reach the room: `TOOL_CALLS` posts `tool_call` and `tool_result` events (including the pair that records an approval request), `THOUGHTS` posts agent thoughts, and `TASK_EVENTS` posts plan updates. Agent text is not gated. The `task` event that records the room's session mapping is posted whatever `emit` says, so `session/load` resume survives `emit=()`.

`SlackAdapter` declares no sets of its own: it adopts and validates against the inner adapter's features, so read its row off the adapter you wrap. `ParlantAdapter` accepts `Capability.MEMORY` but offers no memory tools, so that capability adds nothing. `NooaAdapter` posts the model's raw `reasoning_content` as thoughts, so pass `emit` without `Emit.THOUGHTS` to keep reasoning out of the room.

## Adapter Summary

| Adapter                              | Purpose                                                                                         | Required or primary inputs                                                                                          | Reference                                                                |
| :----------------------------------- | :---------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------- |
| `LangGraphAdapter`                   | LangGraph agents, as a ReAct agent built from a chat model or your own graph                    | `llm`, with an optional `checkpointer`, or `graph_factory` / `graph`                                                | [Frameworks](/reference/sdk/adapters/frameworks#langgraphadapter)        |
| `PydanticAIAdapter`                  | Pydantic AI agents with type-safe tools                                                         | `PydanticAIAdapterConfig(model=...)` or `llm`                                                                       | [Frameworks](/reference/sdk/adapters/frameworks#pydanticaiadapter)       |
| `CrewAIAdapter`                      | CrewAI agents with role, goal, and backstory                                                    | Optional `CrewAIAdapterConfig` (`role`, `goal`, `backstory`)                                                        | [Frameworks](/reference/sdk/adapters/frameworks#crewaiadapter)           |
| `CrewAIFlowAdapter`                  | One CrewAI Flow run per inbound room message, with orchestration state rebuilt from task events | `flow_factory`                                                                                                      | [Frameworks](/reference/sdk/adapters/frameworks#crewaiflowadapter)       |
| `GoogleADKAdapter`                   | Google Agent Development Kit agents                                                             | Optional `GoogleADKAdapterConfig` (`model`)                                                                         | [Frameworks](/reference/sdk/adapters/frameworks#googleadkadapter)        |
| `AgnoAdapter`                        | An existing Agno agent                                                                          | `agent`                                                                                                             | [Frameworks](/reference/sdk/adapters/frameworks#agnoadapter)             |
| `StrandsAdapter`                     | Strands Agents with native tool support                                                         | `StrandsAdapterConfig(model=...)` or `llm`                                                                          | [Frameworks](/reference/sdk/adapters/frameworks#strandsadapter)          |
| `NooaAdapter`                        | NVIDIA Object Oriented Agents, with Band tools as methods on `self.room`                        | `agent`, a `NooaRoomAgent` subclass                                                                                 | [Frameworks](/reference/sdk/adapters/frameworks#nooaadapter)             |
| `LettaAdapter`                       | Letta agents with persistent memory                                                             | Optional `LettaAdapterConfig`                                                                                       | [Frameworks](/reference/sdk/adapters/frameworks#lettaadapter)            |
| `ParlantAdapter`                     | Parlant behavioral engine                                                                       | Optional `ParlantAdapterConfig` (`name`, `description`) and `nlp_service`; or your own `server` and `parlant_agent` | [Frameworks](/reference/sdk/adapters/frameworks#parlantadapter)          |
| `AnthropicAdapter`                   | Anthropic SDK with a manual tool loop                                                           | Optional `AnthropicAdapterConfig` (`model`, `provider_key`)                                                         | [Model SDKs](/reference/sdk/adapters/model-sdks#anthropicadapter)        |
| `GeminiAdapter`                      | Google Gen AI SDK with a manual tool loop                                                       | Optional `GeminiAdapterConfig` (`model`, `provider_key`)                                                            | [Model SDKs](/reference/sdk/adapters/model-sdks#geminiadapter)           |
| `ClaudeSDKAdapter`                   | Claude Agent SDK (Claude Code) with MCP tools and room approvals, one workspace per room        | Optional `ClaudeSDKAdapterConfig` (`model`, `permission_mode`, `cwd`)                                               | [Coding Agents](/reference/sdk/adapters/coding-agents#claudesdkadapter)  |
| `CodexAdapter`                       | OpenAI Codex app-server over JSON-RPC, one process per room                                     | Optional `CodexAdapterConfig`                                                                                       | [Coding Agents](/reference/sdk/adapters/coding-agents#codexadapter)      |
| `OpencodeAdapter`                    | OpenCode server sessions, one per room                                                          | Optional `OpencodeAdapterConfig`                                                                                    | [Coding Agents](/reference/sdk/adapters/coding-agents#opencodeadapter)   |
| `CopilotSDKAdapter`                  | GitHub Copilot SDK sessions, one per room                                                       | Optional `CopilotSDKAdapterConfig`                                                                                  | [Coding Agents](/reference/sdk/adapters/coding-agents#copilotsdkadapter) |
| `ACPClientAdapter`                   | Any external ACP agent process, one per room                                                    | `ACPClientAdapterConfig(command=...)`                                                                               | [Coding Agents](/reference/sdk/adapters/coding-agents#acpclientadapter)  |
| `CopilotACPAdapter`                  | GitHub Copilot CLI over ACP                                                                     | Optional `CopilotACPAdapterConfig`                                                                                  | [Coding Agents](/reference/sdk/adapters/coding-agents#acp-presets)       |
| `CursorACPAdapter`                   | Cursor's `agent acp` server over ACP                                                            | Optional `CursorACPAdapterConfig`                                                                                   | [Coding Agents](/reference/sdk/adapters/coding-agents#acp-presets)       |
| `OmpACPAdapter`                      | OMP's `omp acp` server over ACP                                                                 | Optional `OmpACPAdapterConfig`                                                                                      | [Coding Agents](/reference/sdk/adapters/coding-agents#acp-presets)       |
| `A2AAdapter`                         | A remote A2A agent as a Band participant                                                        | `A2AAdapterConfig(remote_url=...)`                                                                                  | [Protocols](/reference/sdk/adapters/protocols#a2aadapter)                |
| `A2AGatewayAdapter`                  | Band peers exposed as A2A HTTP endpoints                                                        | Optional `A2AGatewayAdapterConfig` (`gateway_url`, `port`)                                                          | [Protocols](/reference/sdk/adapters/protocols#a2agatewayadapter)         |
| `BandACPServerAdapter` / `ACPServer` | Editor-facing ACP server                                                                        | None; credentials come from the running `Agent`                                                                     | [Protocols](/reference/sdk/adapters/protocols#acp-server)                |
| `SlackAdapter`                       | A Band agent bridged into Slack threads                                                         | `SlackAdapterConfig(apps=...)` and `inner`                                                                          | [Protocols](/reference/sdk/adapters/protocols#slackadapter)              |