<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/monokai-sublime.min.css" integrity="sha512-ade8vHOXH67Cm9z/U2vBpckPD1Enhdxl3N05ChXyFx5xikfqggrK4RrEele+VWY/iaZyfk7Bhk6CyZvlh7+5JQ==" crossorigin="anonymous" referrerpolicy="no-referrer" />
🌾 ng-oatv0.6.0Angular UI library

Chat

AI chat panel with a markdown-aware, streaming-friendly message list and an auto-resizing composer. Bring your own backend.

Assistant

Ask me anything — this reply streams in with markdown formatting.

html
<ng-oat-chat [(messages)]="messages" (messageSent)="onSend($event)" (stopRequested)="onStop()">
  <strong chatHeader>Assistant</strong>
</ng-oat-chat>

Inputs

InputTypeDefaultDescription
messagesNgOatChatMessage[] (model)[]Two-way bindable message list
placeholderstring'Send a message…'Composer textarea placeholder
disabledbooleanfalseDisables the composer
autoScrollbooleantrueAuto-scroll to the newest message

Methods

MethodDescription
addMessage(message)Appends a message (user, assistant, or system) and returns its id
appendToMessage(id, token)Appends a streamed token to an existing message's content
setMessageStatus(id, status)Updates delivery status: 'pending' | 'streaming' | 'done' | 'error'

Streaming from a real backend

Use readTextStream() or readSseStream() from @letsprogram/ng-oat/chat to turn a fetch response body into an async iterable of text chunks, then feed it through streamChatText():

typescript
const response = await fetch('/api/chat', { method: 'POST', body: JSON.stringify(payload) });
const id = chat().addMessage({ role: 'assistant', content: '', status: 'streaming' });
await streamChatText(readTextStream(response.body!), (token) => chat().appendToMessage(id, token));
chat().setMessageStatus(id, 'done');