Skip to content

Interfaces

A Pydantic AI agent is plain Python with no interface baked in: the same agent can run headless inside your backend, chat in a terminal, serve a web UI, power your own frontend, live inside an editor, answer to other agents, hold a spoken conversation, or work on a repository with nobody watching. Each surface has its own page:

SurfaceWhat it looks likeWhere
Your coderesult = await agent.run('...'), an ordinary awaitable in any Python function, with typed outputRunning agents
Terminalagent.to_cli_sync(), or clai -a mymodule:agent against any agent you can importCLI
Web chatA built-in browser chat for any agent: clai web or agent.to_web()Web Chat UI
Your frontendStream agent runs to your own UI over the AG-UI or Vercel AI protocols, including Vercel’s useChat React hooksUI Event Streams
EditorsServe an agent to Zed and other editors over the Agent Client ProtocolACP
Other agentsServe an agent to other agents over the Agent2Agent protocol, via the separate fasta2a packageA2A
VoiceThe same agent, tools, and observability over a live audio session; voice is just another frontendRealtime
GitHubRun an agent on issues, pull requests or a schedule, sandboxed on a runner, writing back through safe outputs; the one surface with nobody at the other endGitHub Agentic Workflows

Because interfaces are separate from the agent, features work across all of them: deferred tools and approval surface wherever the agent runs (approval prompts in the CLI, approval UI events in your frontend), the same deployed agent can serve the web UI for your team and the AG-UI stream for your product at once, and a realtime session can hand its history to a text run and back. Complete agents work everywhere too: clai -a pydantic_ai_harness.coder:coder_agent runs the Harness’s Coder in your terminal.