Чат — это всё, что стоит между вашими пользователями и моделью. Создайте NuiChatSession с функцией respond, а остальное сделает <nui-chat>: выведет ответ потоком в формате Markdown, будет следовать за ним вниз по странице, пока пользователь не прокрутит вверх, и на время ответа превратит кнопку отправки в кнопку остановки.
respond возвращает текст, промис, async function* или Observable, поэтому подойдёт любой API. Кроме текста, ответ может содержать рассуждения модели, её вызовы инструментов (их рисуют ваши шаблоны) и использованные источники. nuiEventStream читает поток server-sent events, который отдаёт большинство API моделей.
Ничего не теряется: повторный ответ или изменённый вопрос становится новой версией рядом со старой, а диалог хранит все ветки. Скринридеры озвучивают ответ целиком, когда он готов, а не по словам.
Ассистент
Диалог начинается с подсказок. Ответы приходят потоком в Markdown: их можно остановить, повторить, оценить, а свой вопрос — изменить. attach принимает выбранные, вставленные или перетащенные файлы.
Рассуждения, инструменты и источники
Дельты добавляют в ответ рассуждения модели, вызовы инструментов и источники. nuiChatTool рисует инструмент погоды карточкой, а остальные сворачиваются вместе со входными и выходными данными.
Поток с сервера
nuiEventStream читает поток событий в стиле OpenAI, а NuiChatError показывает своё сообщение. all() сохраняет диалог со всеми версиями.