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

AG-UI

AGUI.http() projects a whole Deck, or one pinned target, into the AG-UI protocol. threadId is the session; runId is a binding-owned interaction id, never Run.id, since one AgentDeck Run can outlive several AG-UI interactions across suspension and resume.

Install

pip install "agentdeck-sdk[agui]"

agui pulls in the official ag-ui-protocol models and encoder, plus starlette.

Serve

from agentdeck import Deck
from agentdeck.bindings import AGUI

deck = Deck.from_project()
deck.serve(AGUI.http("/agui"), port=8000)

target=None routes per request, off forwardedProps.agentdeck.target. AGUI.http("/support", target="Support") pins the endpoint instead: plain AG-UI to any client, and a request naming a different target is rejected rather than silently overridden. A pinned name that does not exist in the deck is validated when you call deck.serve() or deck.asgi(), not on the first request.

What works now

  • Text and reasoning stream live, from any agent or workflow target.
  • Backend tools and sessions work like any other Deck run.
  • HITL: ctx.ask() becomes RunFinishedInterruptOutcome; the client resumes with a ResumeEntry naming that interruptId.
  • Multimodal input: image and audio inline or by URL; document and video by URL only.
  • control.cancel: a client disconnect or abort cancels the run.

Gaps

Each row is a stable AG-UI feature waiting on a generic AgentDeck primitive, never faked inside the binding. Full reasoning: the AG-UI design doc.

AG-UI featuremissing primitive
parentRunId, transcript edit, regenerationsession or run branching
non-empty contexta generic run-scoped semantic context
frontend toolsrun-scoped tools supplied at start
shared state (STATE_SNAPSHOT/STATE_DELTA)a real shared application-state contract
steeringmid-run input
more than one outstanding interruptrun.answer(interrupt_id, value)
tool-output streamingricher tool progress and result events
inline document/video bytesa content block for bytes held inline, not by reference
BinaryInputContenta generic binary content block

External clients

Assistant UI, CopilotKit, or the official HttpAgent point at a pinned endpoint with zero AgentDeck-specific code. Reaching the whole catalog instead costs one extension field, forwardedProps.agentdeck.target; either way AgentDeck never learns which client is asking.

Limits

  • No built-in authentication, the same posture as Native.http(): front it yourself.
  • namespace= is tenancy routing, not authentication.
  • threadId is session identity, never authorization.