AgentDeck 6.0 is here: serve one deck over HTTP, AG-UI or the terminal.See what's new
AgentDeckv6.0.6
Meet AgentDeck

What's new in 6.0

Your application is agents, tools and workflows. How the outside reaches them is a binding you add in one line, and the runtime never learns which one is talking.

What changed

One Deck, many bindings, one call:

deck.serve(Native.http("/api"), AGUI.http("/agui"), Terminal.stdio(), port=8000)

Each binding is a protocol, channel or surface reaching the same runs, events and controls. The v1 HTTP wire is gone and deck.serve is the new front door:

breakbefore (v5)after (v6.0.0)
v1 routes gonePOST /agents/{name}/chatPOST /runs, then GET /runs/{run_id}/events
agentdeck-serve gone; deck.serve(...) is the new front dooragentdeck-servedeck.serve(Native.http("/api"), port=8000)
Deck.asgi() needs a bindingDeck.from_project().asgi()Deck.from_project().asgi(Native.http())
the error taxonomy moved off the root packagefrom agentdeck import ConfigErrorfrom agentdeck.errors import ConfigError
InputError replaces raw TypeError/ValueError for caller inputexcept (TypeError, ValueError)except InputError
InterruptReason drops "approval"pending.reason == "approval"pending.reason == "human"; refusal comes from payload["options"], which Run.answer already enforces

agentdeck chat is unchanged. Full detail: migration guide.

What you have now

  • Native.http(): AgentDeck's own HTTP/SSE protocol, the lossless wire.
  • Terminal.stdio(): one session per process, what agentdeck chat runs.
  • AGUI.http(): the AG-UI protocol. A pinned endpoint takes any AG-UI client (Assistant UI, CopilotKit) with zero AgentDeck-specific code; reaching the whole catalog costs one extension field, forwardedProps.agentdeck.target. HITL included.

The SPI is frozen at v1: a binding you write today keeps working.

What's on the roadmap

Not shipped yet: nothing below is available in 6.0.0.

bindingtracked at
A2A.http()#552
WhatsApp.http()#553
@agentdeck/client#551
A2UI.http(), ACP.stdio(), MCP.stdio()/MCP.http(), .agentdeck/bindings config and CLI flagsroadmap

Where the bindings sit among everything else that is coming: the roadmap.

The complete setup, once it lands

One Deck, five bindings, one event stream:

                                           one Deck
                                               │
         ┬──────────────────┬──────────────────┼──────────────────┬──────────────────┬
         │                  │                  │                  │                  │
   Native.http()       AGUI.http()     Terminal.stdio()      A2A.http()       WhatsApp.http()
      shipped            shipped            shipped         roadmap #552       roadmap #553
from agentdeck import Deck
from agentdeck.bindings import AGUI, Native, Terminal

# from agentdeck.bindings import A2A, WhatsApp  # roadmap: #552, #553

deck = Deck.from_project()
deck.serve(
    Native.http("/api"),
    AGUI.http("/agui"),
    Terminal.stdio(),
    # A2A.http("/a2a"),             # roadmap: #552
    # WhatsApp.http("/whatsapp"),   # roadmap: #553
    port=8000,
)

A run started from WhatsApp is visible in Assistant UI over AG-UI, answerable from the terminal, and callable by another agent over A2A. namespace= on a binding scopes it to one tenant. One event stream, one set of controls, regardless of which binding started the run.

What it opens

Write one application. Reach it from a chat UI, a messaging network, an IDE, another agent, an MCP client, or a script, with no per-surface code. Add a surface by adding a line. Write a binding for anything with a wire, out of tree, against a frozen SPI.