{"id":33203,"date":"2026-04-20T14:57:18","date_gmt":"2026-04-20T12:57:18","guid":{"rendered":"https:\/\/www.angulararchitects.io\/?p=33203"},"modified":"2026-04-20T20:30:30","modified_gmt":"2026-04-20T18:30:30","slug":"implementing-ag-ui-with-angular","status":"publish","type":"post","link":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/","title":{"rendered":"Implementing AG-UI with Angular"},"content":{"rendered":"<div class=\"wp-post-series-box series-agentic wp-post-series-box--expandable\">\n\t\t\t<input id=\"collapsible-series-agentic69e79eb0dde43\" class=\"wp-post-series-box__toggle_checkbox\" type=\"checkbox\">\n\t\n\t<label\n\t\tclass=\"wp-post-series-box__label\"\n\t\t\t\t\tfor=\"collapsible-series-agentic69e79eb0dde43\"\n\t\t\ttabindex=\"0\"\n\t\t\t\t>\n\t\t<p class=\"wp-post-series-box__name wp-post-series-name\">\n\t\t\tThis is post 3 of 3 in the series <em>&ldquo;agentic&rdquo;<\/em>\t\t<\/p>\n\t\t\t<\/label>\n\n\t\t\t<div class=\"wp-post-series-box__posts\">\n\t\t\t<ol>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/understanding-ag-ui-the-standard-for-agentic-user-interfaces\/\">Understanding AG-UI: The Standard for Agentic User Interfaces<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><a href=\"https:\/\/www.angulararchitects.io\/en\/blog\/ag-ui-in-practice-the-sdk-for-typescript\/\">AG-UI in Practice: The SDK for TypeScript<\/a><\/li>\n\t\t\t\t\t\t\t\t\t<li><span class=\"wp-post-series-box__current\">Implementing AG-UI with Angular<\/span><\/li>\n\t\t\t\t\t\t\t<\/ol>\n\t\t<\/div>\n\t<\/div>\n<p><em>Using agents via AG-UI in Angular applications<\/em><\/p>\n<p>AG-UI defines communication between frontend and agent and its SDK provides a low-level implementation. However, for Angular applications it does not provide a fully idiomatic abstraction. If you want to integrate AI agents into Angular, you need a wrapper that fits naturally into components, signals, and templates.<\/p>\n<p>This is exactly where this article comes in. It shows how AG-UI can be used with a lean Angular-specific abstraction on top of the SDK so that agents, client-side tools, and widgets can be integrated cleanly into an Angular application.<\/p>\n<p>\ud83d\udcc2 <a href=\"https:\/\/github.com\/angular-architects\/flights42\/tree\/agentic\">Source Code<\/a> (see branch <code>agentic<\/code>)<\/p>\n<h2>Integrating AG-UI into Angular<\/h2>\n<p>The AG-UI SDK discussed earlier provides a solid foundation for integration in Angular. However, to enable convenient use without unnecessary boilerplate code, an additional abstraction layer is needed. The accompanying demo project contains such an abstraction in the <code>libs\/ag-ui-client<\/code> folder. To simplify imports, the <code>tsconfig.json<\/code> includes a path mapping called <code>@internal\/ag-ui-client<\/code> that points to it.<\/p>\n<p>The centerpiece of this implementation is an <code>agUiResource<\/code> used to communicate with the agent. It also provides a <code>WidgetContainer<\/code> component that displays components requested by the agent, such as the flight card shown earlier. Its API design is heavily inspired by the <a href=\"https:\/\/hashbrown.dev\/\">Hashbrown<\/a> framework, which offers Angular developers a highly idiomatic way of working with LLMs, but currently does not yet include AG-UI integration.<\/p>\n<p>This article treats that abstraction as a black box that should sooner or later be provided by a library. The source code can serve as a starting point for your own work.<\/p>\n<p>Thanks to AG-UI, the Angular example is independent of server-side technologies and models. To keep execution as simple as possible, the demo application includes an agent built with the extremely convenient TypeScript-based agent framework <a href=\"https:\/\/mastra.ai\/\">Mastra<\/a>. Since the AG-UI SDK provides an adapter for <code>Mastra<\/code>, agents built with it can easily be connected through AG-UI.<\/p>\n<p>The client was tested with both OpenAI's GPT 5 and Google's Gemini 3. Details on how to set up and start the demo can be found in the README.<\/p>\n<h2>Connecting Agents via <code>agUiResource<\/code> in Angular<\/h2>\n<p>The <code>agUiResource<\/code> provided by <code>@internal\/ag-ui-client<\/code> implements Angular's Resource API and can therefore be used in a similar way to the familiar <code>httpResource<\/code> or <code>rxResource<\/code>:<\/p>\n<pre><code class=\"language-ts\">import { agUiResource } from &#039;@internal\/ag-ui-client&#039;;\n\n[...]\n\nexport class TicketingComponent {\n  private readonly chat = agUiResource({\n    url: &#039;http:\/\/localhost:3001\/ag-ui\/ticketingAgent&#039;,\n    useServerMemory: true,\n    tools: [\n      findFlightsTool,\n      getLoadedFlightsTool,\n      toggleFlightSelectionTool,\n      getCurrentBasketTool,\n      displayFlightDetailTool,\n      createShowComponentsTool([flightWidgetComponent]),\n    ],\n  });\n}<\/code><\/pre>\n<p>The properties refer to the URL of the agent. With <code>useServerMemory<\/code>, the caller indicates whether the agent stores the chat history. If it does not, the client must repeat the entire chat history with every request.<\/p>\n<p>In the <code>tools<\/code> list, the consumer registers all client-side tools that the agent is allowed to request. One special tool is <code>showComponents<\/code>, which is created via a factory. This factory accepts the descriptions of possible components that the agent may embed when answering questions. In our case, only a flight card (<code>flightWidget<\/code>) is available.<\/p>\n<p><div style=\"\nmargin: 8px 0;\npadding: 22px;\nborder: 1px solid #e5e7eb;\nborder-radius: 14px;\nbackground: #f8fafc;\n\">NOTE<\/p>\n<h3 style=\"margin-top:0\">Agentic UI with Angular<\/h3>\n<p>Learn more about this topic in my eBook: Build scalable agentic UIs with Angular \u2014 using AG-UI, A2UI, and MCP Apps, open and free from vendor lock-in.<\/p>\n<p><a href=\"https:\/\/agentic-angular.com\/\"><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/agentic-book-md.png\" width=\"400\" alt=\"Cover of the eBook Agentic UI with Angular\" style=\"cursor:pointer !important\"><\/a><\/p>\n<p><a style=\"cursor:pointer !important\" href=\"https:\/\/agentic-angular.com\/\">Learn more about the eBook \u2192<\/a>\n<\/div>\n<\/p>\n<p>The individual tools can be described using the <code>defineAgUiTool<\/code> function:<\/p>\n<pre><code class=\"language-ts\">import { defineAgUiTool } from &#039;@internal\/ag-ui-client&#039;;\nimport { z } from &#039;zod&#039;;\n\n[...]\n\nexport const findFlightsTool = defineAgUiTool({\n  name: &#039;findFlights&#039;,\n  description: `Searches for flights and redirects the user to the result`,\n  schema: z.object({\n    from: z.string().describe(&#039;airport of departure&#039;),\n    to: z.string().describe(&#039;airport of destination&#039;),\n  }),\n  execute: async (args) =&gt; {\n    const store = inject(FlightStore);\n    const router = inject(Router);\n    store.updateFilter(args.from, args.to);\n    await router.navigate([&#039;\/ticketing\/booking\/flight-search&#039;]);\n  },\n});<\/code><\/pre>\n<p>Besides a name, a description, and parameter definitions based on <code>Zod<\/code>, the tool definition also includes an <code>execute<\/code> method. When the agent requests a tool, <code>agUiResource<\/code> executes that method.<\/p>\n<p>The <code>args<\/code> parameter object conforms to the TypeScript type inferred from the Zod schema. In our case, that is an object with the properties <code>from<\/code> and <code>to<\/code>. The implementation shown triggers a flight search by passing these search criteria to the <code>FlightStore<\/code> and then navigates the user to the results page.<\/p>\n<p>Tools that gather data, such as local state or user responses, can report that data back to the model via their return value. One example is <code>getLoadedFlightsTool<\/code>, which informs the agent about the flights currently displayed to the user by the application:<\/p>\n<pre><code class=\"language-ts\">export const getLoadedFlightsTool = defineAgUiTool({\n  name: &#039;getLoadedFlights&#039;,\n  description: `Returns the currently loaded\/displayed flights`,\n  execute: () =&gt; {\n    const store = inject(FlightStore);\n    return store.flightsValue().map(toFlightInfo);\n  },\n});<\/code><\/pre>\n<p>Defining components works similarly, but here the schema describes the offered inputs:<\/p>\n<pre><code class=\"language-ts\">import { defineAgUiComponent } from &#039;@internal\/ag-ui-client&#039;;\nimport { z } from &#039;zod&#039;;\n\nexport const flightWidgetComponent = defineAgUiComponent({\n  name: &#039;flightWidget&#039;,\n  description: `Displays a concrete flight as an interactive card.\nUse it when referring to one or more specific flights.`,\n  component: FlightWidget,\n  schema: z.object({\n    flight: flightSchema,\n    status: z.enum([&#039;booked&#039;, &#039;other&#039;]).describe(&#039;Status of the flight&#039;),\n  }),\n});<\/code><\/pre>\n<p>In this example, the <code>flight<\/code> property refers to another Zod schema:<\/p>\n<pre><code class=\"language-ts\">const flightSchema = z.object({\n  id: z.number().describe(&#039;The flight id&#039;),\n  from: z.string().describe(&#039;Departure city&#039;),\n  to: z.string().describe(&#039;Arrival city&#039;),\n  date: z.string().describe(&#039;Departure date in ISO format&#039;),\n  delay: z.number().describe(&#039;Delay in minutes&#039;),\n});<\/code><\/pre>\n<p>To send a request to the agent, the client uses the <code>sendMessage<\/code> method:<\/p>\n<pre><code class=\"language-ts\">this.chat.sendMessage({\n  role: &#039;user&#039;,\n  content: &#039;Did I book my flight to France?&#039;,\n});<\/code><\/pre>\n<p>At that point, the client only needs to display the response messages returned by the agent via AG-UI in the chat history.<\/p>\n<h2>Presenting the Chat History in Angular Templates<\/h2>\n<p>The entire chat history is stored in the <code>value<\/code> of <code>AgUiResource<\/code>. It is a signal containing an array of <code>AgUiChatMessages<\/code>:<\/p>\n<pre><code class=\"language-html\">@for (message of chat.value(); track message.id) {\n  @if (message.content) {\n    &lt;div&gt;{{ message.content }}&lt;\/div&gt;\n  }\n  @for (widget of message.widgets; track widget.id) {\n    &lt;app-widget-container [widget]=&quot;widget&quot; \/&gt;\n  }\n  @for (toolCall of message.toolCalls; track toolCall.id) {\n    &lt;div&gt;Tool Call: {{ toolCall.name }}&lt;\/div&gt;\n  }\n}<\/code><\/pre>\n<p>In addition to a textual response (<code>content<\/code>), the iterated messages also contain a list of components (<code>widgets<\/code>) and tools (<code>toolCalls<\/code>). The widgets are components registered for the <code>showComponents<\/code> tool and selected by the LLM. The <code>WidgetContainer<\/code> offered by <code>@internal\/ag-ui-client<\/code> can create these widgets dynamically and render them using the properties passed by the agent or the LLM.<\/p>\n<p>The <code>toolCalls<\/code> list provides information about the requested tools. Its entries can refer to both client-side and server-side tools and are displayed here for reasons of transparency. We do not need to take care of executing client-side tools ourselves, however, because <code>agUiResource<\/code> handles that task automatically.<\/p>\n<p>The streamed AG-UI messages can be inspected through the browser's developer tools:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/ag-ui-stream.png\" alt=\"Streamed AG-UI messages in the browser&#039;s developer tools\" \/><\/p>\n<p>On the one hand, this makes the protocol tangible; on the other, it helps with troubleshooting.<\/p>\n<h2>Summary<\/h2>\n<p>With a lean Angular abstraction such as <code>agUiResource<\/code>, AG-UI can be integrated idiomatically into components, tools, and templates. The client describes the available tools and widgets, sends user requests to the agent, and processes streamed responses directly as a signal-based chat history.<\/p>\n<h2>FAQ<\/h2>\n<h3>How Can AG-UI Be Integrated into Angular?<\/h3>\n<p>AG-UI is best integrated into Angular through a dedicated abstraction that encapsulates communication with the agent and fits cleanly into components, signals, and templates. In the example shown here, that role is fulfilled by an <code>agUiResource<\/code>.<\/p>\n<h3>What Is <code>agUiResource<\/code>?<\/h3>\n<p><code>agUiResource<\/code> is an Angular-specific wrapper around the AG-UI SDK. It connects the agent to the Angular application, executes client-side tools, and exposes the chat history together with widgets and tool calls as a resource. The entire application can be found in the linked project.<\/p>\n<h3>Why Does Angular Need Another Abstraction on Top of the SDK?<\/h3>\n<p>The AG-UI SDK is intentionally generic and low-level. An Angular-specific abstraction reduces boilerplate, aligns better with the Resource API, and makes integration into templates, stores, and routing easier.<\/p>\n<h3>How Do Tools and Widgets End Up in the Chat History?<\/h3>\n<p>Before a run starts, the client registers the available tools and components with the agent. When the agent later requests tool calls or widgets, <code>agUiResource<\/code> processes that information and exposes it to the template through the signal-based chat history.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is post 3 of 3 in the series &ldquo;agentic&rdquo; Understanding AG-UI: The Standard for Agentic User Interfaces AG-UI in Practice: The SDK for TypeScript Implementing AG-UI with Angular Using agents via AG-UI in Angular applications AG-UI defines communication between frontend and agent and its SDK provides a low-level implementation. However, for Angular applications it [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":33201,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_price":"","_stock":"","_tribe_ticket_header":"","_tribe_default_ticket_provider":"","_ticket_start_date":"","_ticket_end_date":"","_tribe_ticket_show_description":"","_tribe_ticket_show_not_going":false,"_tribe_ticket_use_global_stock":"","_tribe_ticket_global_stock_level":"","_global_stock_mode":"","_global_stock_cap":"","_tribe_rsvp_for_event":"","_tribe_ticket_going_count":"","_tribe_ticket_not_going_count":"","_tribe_tickets_list":"[]","_tribe_ticket_has_attendee_info_fields":false,"footnotes":""},"categories":[18],"tags":[],"class_list":["post-33203","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","post_series-agentic"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Implementing AG-UI with Angular - ANGULARarchitects<\/title>\n<meta name=\"description\" content=\"How can AG-UI be integrated into Angular applications? This article shows an Angular-specific abstraction on top of the SDK, `agUiResource`, client-side tools, and widgets in the chat history.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Implementing AG-UI with Angular - ANGULARarchitects\" \/>\n<meta property=\"og:description\" content=\"How can AG-UI be integrated into Angular applications? This article shows an Angular-specific abstraction on top of the SDK, `agUiResource`, client-side tools, and widgets in the chat history.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/\" \/>\n<meta property=\"og:site_name\" content=\"ANGULARarchitects\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-20T12:57:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-20T18:30:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/Kopie-von-Kopie-von-Kopie-von-Kopie-von-Kopie-von-Blue-White-and-Red-Modern-Digital-Marketing-Agency-Facebook-Ad-1200-x-628-px-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Manfred Steyer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/Kopie-von-Kopie-von-Kopie-von-Kopie-von-Kopie-von-Blue-White-and-Red-Modern-Digital-Marketing-Agency-Facebook-Ad-1200-x-628-px-1.png\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Manfred Steyer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/\"},\"author\":{\"name\":\"Manfred Steyer\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/f3de69c1e2bdb5ba04d8d2f5f998b81a\"},\"headline\":\"Implementing AG-UI with Angular\",\"datePublished\":\"2026-04-20T12:57:18+00:00\",\"dateModified\":\"2026-04-20T18:30:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/\"},\"wordCount\":1027,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/shutterstock_2567832395.jpg\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/\",\"name\":\"Implementing AG-UI with Angular - ANGULARarchitects\",\"isPartOf\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/shutterstock_2567832395.jpg\",\"datePublished\":\"2026-04-20T12:57:18+00:00\",\"dateModified\":\"2026-04-20T18:30:30+00:00\",\"description\":\"How can AG-UI be integrated into Angular applications? This article shows an Angular-specific abstraction on top of the SDK, `agUiResource`, client-side tools, and widgets in the chat history.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#primaryimage\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/shutterstock_2567832395.jpg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/shutterstock_2567832395.jpg\",\"width\":1000,\"height\":666},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.angulararchitects.io\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Implementing AG-UI with Angular\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#website\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"name\":\"ANGULARarchitects\",\"description\":\"AngularArchitects.io\",\"publisher\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#organization\",\"name\":\"ANGULARarchitects\",\"alternateName\":\"SOFTWAREarchitects\",\"url\":\"https:\/\/www.angulararchitects.io\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"contentUrl\":\"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg\",\"width\":644,\"height\":216,\"caption\":\"ANGULARarchitects\"},\"image\":{\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/github.com\/angular-architects\",\"https:\/\/www.linkedin.com\/company\/angular-architects\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/f3de69c1e2bdb5ba04d8d2f5f998b81a\",\"name\":\"Manfred Steyer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8778dfb353992fa3a0d909beee085a088891e5bfce65cdb3631801da527cf11b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8778dfb353992fa3a0d909beee085a088891e5bfce65cdb3631801da527cf11b?s=96&d=mm&r=g\",\"caption\":\"Manfred Steyer\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Implementing AG-UI with Angular - ANGULARarchitects","description":"How can AG-UI be integrated into Angular applications? This article shows an Angular-specific abstraction on top of the SDK, `agUiResource`, client-side tools, and widgets in the chat history.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/","og_locale":"en_US","og_type":"article","og_title":"Implementing AG-UI with Angular - ANGULARarchitects","og_description":"How can AG-UI be integrated into Angular applications? This article shows an Angular-specific abstraction on top of the SDK, `agUiResource`, client-side tools, and widgets in the chat history.","og_url":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/","og_site_name":"ANGULARarchitects","article_published_time":"2026-04-20T12:57:18+00:00","article_modified_time":"2026-04-20T18:30:30+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/Kopie-von-Kopie-von-Kopie-von-Kopie-von-Kopie-von-Blue-White-and-Red-Modern-Digital-Marketing-Agency-Facebook-Ad-1200-x-628-px-1.png","type":"image\/png"}],"author":"Manfred Steyer","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/Kopie-von-Kopie-von-Kopie-von-Kopie-von-Kopie-von-Blue-White-and-Red-Modern-Digital-Marketing-Agency-Facebook-Ad-1200-x-628-px-1.png","twitter_misc":{"Written by":"Manfred Steyer","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#article","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/"},"author":{"name":"Manfred Steyer","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/f3de69c1e2bdb5ba04d8d2f5f998b81a"},"headline":"Implementing AG-UI with Angular","datePublished":"2026-04-20T12:57:18+00:00","dateModified":"2026-04-20T18:30:30+00:00","mainEntityOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/"},"wordCount":1027,"commentCount":0,"publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/shutterstock_2567832395.jpg","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/","url":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/","name":"Implementing AG-UI with Angular - ANGULARarchitects","isPartOf":{"@id":"https:\/\/www.angulararchitects.io\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#primaryimage"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/shutterstock_2567832395.jpg","datePublished":"2026-04-20T12:57:18+00:00","dateModified":"2026-04-20T18:30:30+00:00","description":"How can AG-UI be integrated into Angular applications? This article shows an Angular-specific abstraction on top of the SDK, `agUiResource`, client-side tools, and widgets in the chat history.","breadcrumb":{"@id":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#primaryimage","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/shutterstock_2567832395.jpg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2026\/04\/shutterstock_2567832395.jpg","width":1000,"height":666},{"@type":"BreadcrumbList","@id":"https:\/\/www.angulararchitects.io\/en\/blog\/implementing-ag-ui-with-angular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.angulararchitects.io\/en\/"},{"@type":"ListItem","position":2,"name":"Implementing AG-UI with Angular"}]},{"@type":"WebSite","@id":"https:\/\/www.angulararchitects.io\/en\/#website","url":"https:\/\/www.angulararchitects.io\/en\/","name":"ANGULARarchitects","description":"AngularArchitects.io","publisher":{"@id":"https:\/\/www.angulararchitects.io\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.angulararchitects.io\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.angulararchitects.io\/en\/#organization","name":"ANGULARarchitects","alternateName":"SOFTWAREarchitects","url":"https:\/\/www.angulararchitects.io\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","contentUrl":"https:\/\/www.angulararchitects.io\/wp-content\/uploads\/2023\/07\/AA-Logo-RGB-horizontal-inside-knowledge-black.svg","width":644,"height":216,"caption":"ANGULARarchitects"},"image":{"@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/github.com\/angular-architects","https:\/\/www.linkedin.com\/company\/angular-architects\/"]},{"@type":"Person","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/f3de69c1e2bdb5ba04d8d2f5f998b81a","name":"Manfred Steyer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.angulararchitects.io\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8778dfb353992fa3a0d909beee085a088891e5bfce65cdb3631801da527cf11b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8778dfb353992fa3a0d909beee085a088891e5bfce65cdb3631801da527cf11b?s=96&d=mm&r=g","caption":"Manfred Steyer"}}]}},"_links":{"self":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/33203","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/comments?post=33203"}],"version-history":[{"count":5,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/33203\/revisions"}],"predecessor-version":[{"id":33233,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/posts\/33203\/revisions\/33233"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media\/33201"}],"wp:attachment":[{"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/media?parent=33203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/categories?post=33203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulararchitects.io\/en\/wp-json\/wp\/v2\/tags?post=33203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}