showcase/shell-docs/src/content/reference/angular/components/CopilotChatAssistantMessage.mdx
CopilotChatAssistantMessage renders one assistant message. It shows the message content through a markdown renderer, renders attached tool calls, and shows a toolbar with copy, thumbs up/down, read-aloud, and regenerate actions.
The toolbar appears only when the message has non-empty text content. The copy button always renders; the thumbs up and thumbs down buttons render when you provide a custom slot for them or when a thumbs handler is available from a surrounding CopilotChatView. The read-aloud and regenerate buttons render only when you provide a custom slot for them.
The component is standalone and uses OnPush change detection. Reactive inputs are Angular signals.
Import the component class and use its copilot-chat-assistant-message selector. The message input is required.
import { Component, signal } from "@angular/core";
import { CopilotChatAssistantMessage } from "@copilotkit/angular";
import type { AssistantMessage } from "@ag-ui/client";
@Component({
selector: "app-assistant",
standalone: true,
imports: [CopilotChatAssistantMessage],
template: `
<copilot-chat-assistant-message [message]="message()" />
`,
})
export class AssistantComponent {
message = signal<AssistantMessage>({
id: "1",
role: "assistant",
content: "Hello, how can I help?",
});
}
The current release applies markdownRendererClass, toolbarClass, and copyButtonClass to their default parts.
Each of these replaces the corresponding default sub-component with a component class of your own. Content-projection templates (see below) take precedence over these.
<PropertyReference name="markdownRendererComponent" type="Type<any>"> Replaces the default markdown renderer. </PropertyReference> <PropertyReference name="toolbarComponent" type="Type<any>"> Replaces the default toolbar. </PropertyReference> <PropertyReference name="copyButtonComponent" type="Type<any>"> Replaces the default copy button. </PropertyReference> <PropertyReference name="thumbsUpButtonComponent" type="Type<any>"> Replaces the default thumbs-up button. </PropertyReference> <PropertyReference name="thumbsDownButtonComponent" type="Type<any>"> Replaces the default thumbs-down button. </PropertyReference> <PropertyReference name="readAloudButtonComponent" type="Type<any>"> Replaces the default read-aloud button. </PropertyReference> <PropertyReference name="regenerateButtonComponent" type="Type<any>"> Replaces the default regenerate button. </PropertyReference> <PropertyReference name="toolCallsViewComponent" type="Type<any>"> Replaces the default tool calls view. </PropertyReference>You can override any piece of the message by projecting a named template. A projected template takes precedence over the matching *Component input. Each template receives a typed context object.
| Template name | Context type | Replaces |
|---|---|---|
markdownRenderer | AssistantMessageMarkdownRendererContext ({ content: string }) | The markdown content renderer |
toolbar | AssistantMessageToolbarContext ({ children?: any }) | The whole toolbar |
copyButton | AssistantMessageCopyButtonContext ({ content?: string }) | The copy button |
thumbsUpButton | ThumbsUpButtonContext (empty; click via outputs) | The thumbs-up button |
thumbsDownButton | ThumbsDownButtonContext (empty; click via outputs) | The thumbs-down button |
readAloudButton | ReadAloudButtonContext (empty; click via outputs) | The read-aloud button |
regenerateButton | RegenerateButtonContext (empty; click via outputs) | The regenerate button |
toolCallsView | any | The tool calls view |
<copilot-chat-assistant-message [message]="message()">
<ng-template #markdownRenderer let-content="content">
<article class="my-markdown">{{ content }}</article>
</ng-template>
</copilot-chat-assistant-message>