Hey Agno team,
I’m migrating a multi-agent application from Agno v1 to v2 and want to validate my architectural approach.
My Old Architecture (v1 limitation): I had a dual-access pattern where my UI layer accessed both agents AND tools directly:
-
Path 1: UI → Agent (for conversational analysis)
-
Path 2: UI → Tools directly (for instant data widgets)
This existed because I couldn’t access tool results during agent streaming—only the final text output. So to show structured data in widgets (charts, tables, metrics), my UI had to bypass the agent and call tools directly.
This meant utils and agents were at the same level, both imported by pages. Not clean layering.
My New Architecture (v2 migration): I’m moving to clean separation via Agent OS:
-
UI → HTTP/SSE → Agent OS Backend → Agents → Tools/MCPs
-
Agent OS manages persistent connections (MCPs don’t re-init per request)
-
Using
stream_events=Trueto expose ToolCallCompleted events with structured results -
UI receives events and renders “artifacts” (widgets) from tool data
Pages become thin clients, all business logic in server layer.
My Question: Is this the recommended pattern for apps that need BOTH conversational interaction AND real-time data visualization?
Specifically:
-
Should UI parse ToolCallCompleted events to extract structured data for widgets?
-
Is Agent OS the right place to centralize all agent/tool execution?
-
Any patterns/examples for “artifact-style” UIs where tool results auto-render as visual components alongside conversation?
-
Best practices for tools returning structured JSON vs formatted text? (agents handle both, but which is preferred)
My use case: Multi-agent SEO analytics app. Agents use tools for API calls and file operations. UI displays this data as charts/tables/previews in real-time during conversation—similar to Claude Desktop’s artifact panel.
Is this the right approach or am I overcomplicating it?
Thanks!