Track changes to Band SDKs including the Python SDK and MCP SDK.
Fixed
- Python SDK:
- Coding-Agent Approval Hangs — Codex, OpenCode, and Claude SDK coding-agent adapters no longer hang or misroute replies when an approval request is redelivered, superseded, evicted, or resolved late.
- OMP ACP First-Turn Hang — Fixed the OMP (Oh My Pi) ACP adapter going silent on its first turn when given a per-room workspace.
- OMP ACP Tool Approvals — Fixed OMP ACP silently denying every tool-call approval by default.
Added
- Python SDK:
- Cursor ACP Adapter — Connect a Cursor agent (
agent acp) to Band chat rooms over the Agent Client Protocol. - OMP ACP Adapter — Connect an Oh My Pi (
omp) coding agent to Band chat rooms over ACP, with fail-closed tool-call approvals. - Dynamic ACP Model/Reasoning Selection — ACP adapters, including Copilot, can now list and switch a provider’s advertised model and reasoning-effort options mid-session.
- Claude Agent SDK Response Effort —
ClaudeSDKAdaptercan set the response effort level forwarded to the Claude Agent SDK. - Per-Room Coding-Agent Isolation — Codex and ACP coding-agent adapters now run each chat room in its own workspace and subprocess, so concurrent rooms on one host never share process state.
- Reasoning-Cycle Watchdog — An opt-in cycle timeout lets an agent fail and retry a reasoning cycle that hangs, instead of leaving a message stuck “processing” forever.
- Cursor ACP Adapter — Connect a Cursor agent (
Changed
- Python SDK:
- Structured Adapter Failures — Adapter errors now report a structured provider/code/message shape instead of a free-text error event, giving agents and operators consistent detail across every framework adapter.
Fixed
- Python SDK:
- Chat Metadata Normalization — Fixed an error and silently dropped usage records caused by chat message metadata switching from a plain dict to a typed model.
- OpenCode Turn Reliability — Hardened OpenCode’s turn/approval lifecycle so abandoned approvals and MCP reconnects no longer corrupt a room’s delivery state.
- Peer Lookup Tool Description — Widened the peer-lookup tool’s description so agents reliably use it to answer “who else is available” questions, not only delegation.
Added
- Python SDK:
- Agent-Scoped Memory — Memories can now be scoped to just the storing agent (
scope="agent") instead of only a shared organization, fixing 422 errors when storing or listing memories for any agent whose owner has no organization. - File Transfer Tools — Agents can list, read, and send room files through three new platform tools, gated behind a
Capability.FILESnegotiation with the platform (on-prem deployments with the file-transfer flag enabled; not yet available on Band SaaS).
- Agent-Scoped Memory — Memories can now be scoped to just the storing agent (
Python SDK: Tool-Schema Methods Take a Single capabilities Set
AgentTools’s tool-schema methods and the MCP engine’s registration builders replace their separate include_memory/include_contacts booleans with one capabilities set.
Fixed
- Python SDK:
- Contact Event Text — Contact request and contact-added events with a missing sender name or handle now show a readable fallback (“Unknown sender”, “Unknown contact”, “no handle”) in the room instead of the literal text “None”.
Added
- Python SDK:
- Claude Desktop Agent — Run Claude Desktop as a Band agent:
band-mcp --scope agenthandles platform operations, andband-room-viewkeeps one room’s transcript open and synced while Desktop is running. - Env-Driven Logging & OpenTelemetry — Configure the SDK’s logging entirely from environment variables, with output ready to plug into an OpenTelemetry collector.
- Claude Desktop Agent — Run Claude Desktop as a Band agent:
Changed
- Band MCP:
- Breaking:
BAND_API_KEYNo Longer Accepted —band-mcpno longer accepts a single unscopedBAND_API_KEY. SetBAND_USER_KEY(human scope) and/orBAND_AGENT_KEY(agent scope) explicitly — there is no unscoped credential or prefix-inference fallback any more. Legacythnv_-prefixed keys are also no longer accepted; rotate to aband_u_/band_a_key before upgrading. This only affectsband-mcp’s own credential resolution — theband-sdklibrary’sBAND_API_KEY(agent runtime configuration) is unaffected.
- Breaking:
Fixed
- Python SDK:
- ACP Tool Event Format — ACP tool calls and results are now recorded in the SDK’s structured event format instead of plain text, so anything reading event history sees typed data instead of prose.
- Codex Reasoning/Plan Placeholders — Codex agents no longer post the literal text
(reasoning)or(plan)to a room when a reasoning or plan step has no summary. - Claude SDK Silent Failures — A Claude SDK turn that fails (for example, an expired login) or finishes without a reply now posts a room error instead of completing silently.
- Strands + OpenAI Rehydration — Fixed a 400 error when a Strands agent on an OpenAI-compatible model rehydrates history containing a tool call immediately followed by plain text.
- Copilot CLI (ACP) Reliability — The Copilot CLI (ACP) adapter now sees room participant and contact updates, uses consistent tool names in narration, supports the memory capability, and no longer races itself when two rooms start at once.
- Parlant Tool Descriptions — Parlant tool descriptions are now sourced the same way as every other adapter’s, fixing stale wording that no longer matched the platform’s tool names.
- CrewAI and Pydantic AI Tool Descriptions — Tool descriptions for the CrewAI and Pydantic AI adapters now match every other adapter’s; CrewAI’s
band_send_eventrequires an explicitmessage_typeinstead of silently defaulting to"thought", andband_lookup_peers’spage/page_sizereject values below 1 again. - Participant Descriptions in the Roster — An agent’s automatically-injected room roster now includes each participant’s description, so agents can route by role without an extra tool call.
- OneShotInvoker History & Roster — The one-shot invocation path now reads a room’s full history instead of stopping after the first page, and sends the participant roster on every call.
agent-client-protocolCompatibility — Fixed an import failure whenagent-client-protocolresolves to0.11.0or newer.- Parlant + Pydantic AI Install Conflict — Installing the
parlantextra together withpydantic-ai(orparlantalone, in some cases) no longer corrupts a shared import path; they now install into separate environments. - LocalMCPServer Docker Callback Binding — Fixed a DNS-rebinding-protection bug that rejected
host.docker.internalcallers with a 421 even when the embedded MCP server was explicitly bound to0.0.0.0for that documented Docker callback case.
Fixed
- TypeScript SDK:
- LangGraph Adapter Reliability — Fixes agents built on
createReactAgentgoing silent or losing conversation context across turns. - Participant Handle Formatting — Fixes a duplicate
@prefix that could appear when formatting participant handles.
- LangGraph Adapter Reliability — Fixes agents built on
Added
feature
improvement
breaking-change
python
Added
Python SDK
- Platform Connection Injection. Bridge adapters (
A2AGatewayAdapter,SlackAdapter,BandACPServerAdapter) no longer takeapi_key/rest_urlconstructor parameters; the runtime injects the credentials already given toAgent.create(). - Parlant Server Lifecycle.
ParlantAdaptercan now own the Parlant server end to end: it bootsp.Serverwhen the Band agent starts and tears it down when it stops. Declare guidelines up front withadapter.add_guideline(...); the Band platform tools attach by default. Aconfigure=callback and bring-your-ownserver=/parlant_agent=remain available for advanced use. - Codex/Letta/OpenCode Config from Environment.
CodexAdapterConfig,LettaAdapterConfig, andOpencodeAdapterConfigfields fall back to prefixed environment variables (CODEX_*,LETTA_*,OPENCODE_*) when left unset; an explicit constructor argument always wins.
Added
- Python SDK:
- Strands Agents Adapter — Connect an AWS Strands Agents-based agent to Band chat rooms: platform tools, custom tools, per-room context rehydration, and memory/contact capabilities all work out of the box.
- Docker Three-Agent Demo — New example showing a three-agent design-meeting workflow (architect/dev/PM) running in Docker.
band-python-kiton Docker Hub — The Docker Sandbox kit image is now also published to Docker Hub, alongside its existing GHCR image.
Changed
- Python SDK:
- OpenCode Adapter Reaches Full Conformance — The OpenCode adapter now meets the platform’s L0–L4 bar (participation, context fidelity, restart survival), with accompanying headless-mode reliability fixes.
Fixed
- Python SDK:
- ACP Copilot Docker Compose Example — The Compose deployment for the ACP/Copilot Docker example no longer fails to start (it referenced a removed console-script name).
- Parlant Adapter Port Collisions — Running two Parlant-based agents on the same machine no longer fails with a port-binding crash; each server now binds an ephemeral port by default.
Added
- Python SDK:
- Interrupt, Stop, and Resume Controls — Agents now honor
interrupt,stop, andplaysignals from the platform out-of-band, so a signal can abort a reasoning cycle already in flight.interruptcancels the turn in progress without re-delivering the message;stopalso holds new turns in that room untilplay, which resumes and catches up on anything that arrived meanwhile. Bridged and one-shot agents honor the same signals. - Typed REST Response Models — Contact, memory, and peer models (
AgentContact,AgentMemory,Peer, and theirList…Responseenvelopes) are now importable fromband.client.rest, so code consuming the REST client can be fully type-annotated.
- Interrupt, Stop, and Resume Controls — Agents now honor
Changed
- Python SDK:
- Pydantic AI 2.x — The
pydantic-aiextra now requirespydantic-ai-slim2.18 or newer (previously 1.56+). Retry exhaustion, token-usage reporting, history filtering, and custom tools behave as before. - Dependency Floors — The
langgraph,parlant, andpydantic-aiextras now requireopenai2.0 or newer, and thecrewaiextra pins CrewAI 1.15.5. - History Ends at the Triggering Message — For every adapter, the history assembled when an agent starts now stops immediately before the message that triggered the turn. Messages that arrived while the agent was offline are handled as their own turns instead of being replayed as context, so they are no longer answered twice or surfaced early.
- Memory Listing in the Test Fake —
FakeAgentTools.list_memoriesnow returns the samedata/metaresponse the real SDK returns, instead of amemories/metadatadict, so tests exercise the shape production code actually sees.
- Pydantic AI 2.x — The
Fixed
- Python SDK:
- ACP Context Recovery — When a remote ACP agent’s session cannot be restored — a container restart, a crash, or a freshly spawned process — the agent is now seeded with the Band room’s transcript instead of starting with no context.
- Duplicate First Reply Through the A2A Gateway — A peer added to a brand-new room now processes the first inbound message exactly once. Previously it could reply to a single question several times over.
- Docker Sandbox Kit Quickstart — Fresh kit workspaces on the default proxy-managed credential tier now connect. The bundled echo-agent starter pinned an SDK version predating the WebSocket
x-api-keyhandshake, so every new workspace failed to connect.
Action Required
- Projects installing the
pydantic-aiextra should review their own Pydantic AI usage against the 2.x release notes before upgrading. - Tests asserting on
FakeAgentTools.list_memoriesoutput should readdata/metainstead ofmemories/metadata.
Added
- Python SDK:
- Proxy-Managed Credential Custody for the Docker Sandbox Kit — Agents can now run inside a Docker Sandbox without the real Band or LLM keys ever entering the sandbox VM: the VM carries only the
proxy-managedsentinel while a trusted host-side proxy supplies the real credential on the outbound request. Two custody tiers are documented — credential injection (preferred) and a workspace env-file fallback that warns at launch — and the bundled echo-agent workspace now defaults to proxy-managed. Passing a real Band API key while in proxy-managed mode is rejected rather than quietly accepted.
- Proxy-Managed Credential Custody for the Docker Sandbox Kit — Agents can now run inside a Docker Sandbox without the real Band or LLM keys ever entering the sandbox VM: the VM carries only the