A2UI Agent Integration: Wiring UI to Agents

Demonstrates attaching UI surfaces to agents and cross-namespace integration.

Key concepts:

  • Agent.ui(): attach declarative or LLM-guided UI

  • UI.auto(): LLM-guided mode

  • T.a2ui(): A2UI toolset in tool composition

  • G.a2ui(): guard for LLM-generated UI validation

  • P.ui_schema(): inject catalog schema into prompt

  • ui_form_agent(): pattern helper

Tip

What you’ll learn How to attach tools to an agent using the fluent API.

Source: 71_a2ui_agent_integration.py

from adk_fluent import Agent, T, UI
from adk_fluent._guards import G
from adk_fluent._prompt import P
from adk_fluent._ui import UISurface, _UIAutoSpec
from adk_fluent.patterns import ui_dashboard_agent, ui_form_agent

# --- 1. Agent.ui() with declarative surface ---
agent = (
    Agent("support", "gemini-2.5-flash")
    .instruct("Help users.")
    .ui(UI.form("ticket", fields={"issue": "longText", "priority": "text"}))
)
assert isinstance(agent._config["_ui_spec"], UISurface)

# --- 2. Agent.ui() with LLM-guided mode ---
creative = Agent("creative", "gemini-2.5-flash").instruct("Build UIs.").ui(UI.auto())
assert isinstance(creative._config["_ui_spec"], _UIAutoSpec)

# --- 3. Agent.ui() with component tree ---
form_agent = Agent("form", "gemini-2.5-flash").ui(
    UI.text("Sign Up") >> (UI.text_field("Email") | UI.text_field("Password")) >> UI.button("Submit")
)
assert form_agent._config["_ui_spec"] is not None

# --- 4. T.a2ui() tool composition ---
tc = T.a2ui()
assert tc._kind == "a2ui"

composed = T.google_search() | T.a2ui()
assert len(composed) >= 1

# --- 5. G.a2ui() guard ---
gc = G.a2ui(max_components=30)
assert gc is not None

composed_guard = G.pii() | G.a2ui()
assert composed_guard is not None

# --- 6. P.ui_schema() prompt injection ---
ps = P.ui_schema()
assert ps.name == "ui_schema"
assert len(ps.content) > 0

# Compose with other prompt sections
full_prompt = P.role("UI designer") + P.ui_schema() + P.task("Build a dashboard")
assert full_prompt is not None

# --- 7. .explain() includes UI info ---
info = agent._explain_json()
assert "ui" in info
assert info["ui"]["mode"] == "declarative"

# --- 8. Pattern helpers ---
intake = ui_form_agent(
    "intake",
    "gemini-2.5-flash",
    fields={"name": "text", "email": "email"},
    instruction="Collect user info.",
)
assert intake._config.get("_ui_spec") is not None
assert intake._config.get("instruction") == "Collect user info."

dash = ui_dashboard_agent(
    "metrics",
    "gemini-2.5-flash",
    cards=[{"title": "Users", "bind": "/users"}, {"title": "Revenue", "bind": "/revenue"}],
)
assert dash._config.get("_ui_spec") is not None

print("All A2UI agent integration assertions passed!")

See also

API reference: Agent