Отображение сообщений в чате с агентом
Диалоговый интерфейс GigaLab умеет отображать сложные элементы (карточки, ход рассуждений модели, саджесты) на основе их описания, которое передается в соответствующем сообщении.
Для этого в сообщение нужно добавить дополнительные поля additional_kwargs с описанием элементов.
Вы также можете изменять диалоговый интерфейс агента с помощью специальных функций SDK.
Функциональность работает в чате с агентом, после публикации в любом окружении: DEV, IFT или ПРОМ.
Поддерживается отображение сообщений заданных типов:
- пользователя — тип
human; - агента — тип
ai; - сообщение, сгенерированное в процессе работы функции GigaChat — тип
tool.
Также возможно отображение собственных типов, например, для отображения логов.
В этом разделе вы найдете примеры структур различных сообщений и элементов, и того, как они отображаются в чате с агентом.
Сообщения пользоват еля
Сообщение пользователя передается с типом human.
Пример сообщения в чате с агентом:
Пример кода для формирования сообщения:
import uuid
from langchain_core.messages import HumanMessage
def make_human_message(content: str) -> HumanMessage:
return HumanMessage(
id=str(uuid.uuid4()),
content=content,
additional_kwargs={},
)
JSON-схема данных, которые поступают на фронтенд:
{
"id": "<UUIDv4>",
"type": "human",
"content": "Вопрос пользователя"
}
Приложенные файлы
Если агент может работать с файлами, которые передал пользователь, они также будут отображаться в чате. Пример отображения сообщения пользователя с приложенными файлами:
Пример кода для формирования сообщения:
import uuid
from langchain_core.messages import HumanMessage
def make_human_with_files(content: str, files: list[dict]) -> HumanMessage:
# files: [{"id": "...", "filename": "...", "url": "..."}]
return HumanMessage(
id=str(uuid.uuid4()),
content=content,
additional_kwargs={"attached_files": files},
)
JSON-схема данных, которые поступают на фронтенд:
{
"id": "<UUIDv4>",
"type": "human",
"content": "Вопрос пользователя",
"additional_kwargs": {
"attached_files": [
{
"id": "<UUIDv4>",
"filename": "example.md",
"url": "<fileUploadUrl>"
}
]
}
}
Сообщения агента
GigaLab автоматически отрисовывает MDX-контент сгенерированный агентом и переданный в сообщении с типом ai.
Поддерживаются таблицы, картинки, ссылки, математические формулы и другое форматирование.
Пример кода для формирования сообщения:
from langchain_core.messages import AIMessage
def make_ai_message(content: str) -> AIMessage:
return AIMessage(content=content)
JSON-схема данных, которые поступают на фронтенд:
{
"id": "<UUIDv4>",
"type": "ai",
"content": "MDX контент"
}
Вы также можете отображать дополнительные элементы, например процесс размышления агента или возможные варианты запроса пользователя (саджесты).
Отображение размышлений
Если агент поддерживает размышления (thinking), то вы сможете отобразить шаги его рассуждений.
Для этого в сообщении с типом ai нужно передать специальный тег <thinking>.
В интерф ейсе это будет выглядеть так:
Пример кода для формирования сообщения:
from langchain_core.messages import AIMessage
def make_ai_thinking_message(text: str) -> AIMessage:
mdx_content = f"<thinking>\n{text}\n</thinking>"
return AIMessage(content=mdx_content)
JSON-схема данных, которые поступают на фронтенд:
{
"id": "<UUIDv4>",
"type": "ai",
"content": "<thinking>\nДля вывода текущего времени в Москве мне потребуется воспользоваться библиотекой datetime и pytz в Python. Я создам соответствующий скрипт и выполню его.\n</thinking>"
}
Отображение источников
В ответах агента можно отображать источники, списки ссылок и карточки.
Для этого нужно использовать соответствующие структуры, переданные в объекте additional_kwargs.
Отображение источников интерфейсе:
Для отображения источников используйте структуру additional_kwarg.shelves:
Пример кода для формирования сообщения:
from langchain_core.messages import AIMessage
from pydantic import BaseModel
from typing import List, Optional
class SearchDocument(BaseModel):
title: Optional[str] = None
url: Optional[str] = None
snippet: Optional[str] = None
source: Optional[str] = None # "tg", "facts", "news" и т.п.
class Shelf(BaseModel):
shelfName: str
documents: List[SearchDocument]
def make_ai_with_shelves(answer: str, shelves: List[Shelf]) -> AIMessage:
shelves_json = [shelf.model_dump() for shelf in shelves]
return AIMessage(
content=answer,
additional_kwargs={"shelves": shelves_json},
)
JSON-схема данных, которые поступают на фронтенд:
{
"id": "<UUIDv4>",
"type": "ai",
"content": "<Контент сообщения в формате MDX>",
"additional_kwargs": {
"shelves": [
{
"shelfName": "Telegram",
"documents": [
{
"title": "Бизнес.com",
"url": "<sourceUrl>",
"snippet": "...",
"source": "tg"
}
]
}
]
}
}
Отображение карточек
Карточки в интерфейсе:
Пример таких карточек можно найти в чате с агентом помощником туриста.
Для отображения карточек используйте структуру additional_kwargs.carousels.
Пример кода для формирования сообщения:
from langchain_core.messages import AIMessage
def make_ai_with_carousel(cards: list[dict]) -> AIMessage:
# cards: [{"title": "...", "image_urls": ["..."], "additional_data": {...}}, ...]
carousels = [
{
"type": "CARD",
"sub_type": "EXCURSION",
"priority": 2,
"data": cards,
}
]
return AIMessage(
content="Описание и рекомендации по найденным вариантам.",
additional_kwargs={"frontend_data": {"carousels": carousels, "sources": []}},
)
JSON-схема данных, которые поступают на фронтенд:
{
"id": "<UUIDv4>",
"type": "ai",
"content": "<Контент сообщения в формате MDX>",
"additional_kwargs": {
"frontend_data": {
"carousels": [
{
"type": "CARD",
"sub_type": "EXCURSION",
"priority": 2,
"data": [
{
"title": "Обзорная экскурсия г. Южно=Сахалинск",
"image_urls": ["<imageUrl>"],
"additional_data": {
"additional_attributes": [
"Городская экскурсия",
"3 часа"
],
"address": "Муниципальное образование городской округ «Город Южно-Сахалинск»",
"price": 7000,
"number_of_people": 1,
"url": "<cardUrl>",
"urls": [
{
"url": "<externalUrl>",
"type": "EXTERNAL_WEBSITE"
}
],
"priority": 0
}
}
]
}
],
"sources": []
}
}
}
Отображение ссылок
Ссылки в интерфейсе:
Для отображения ссылок используйте структуру additional_kwargs.artifacts
Пример кода для формирования сообщения:
from langchain_core.messages import AIMessage
def make_ai_with_artifacts(layout: str, artifact_links: list[dict]) -> AIMessage:
# artifact_links: [{"type": "pdf" | "docx" | "markdown", "link": "<url>"}]
return AIMessage(
content=layout,
additional_kwargs={"artifacts": artifact_links},
)
JSON-схема данных, которые поступают на фронтенд:
{
"id": "<UUIDv4>",
"type": "ai",
"content": "<Контент сообщения в формате MDX>",
"additional_kwargs": {
"artifacts": [
{
"type": "pdf",
"link": "<artifactDownloadUrl>"
},
{
"type": "docx",
"link": "<artifactDownloadUrl>"
},
{
"type": "markdown",
"link": "<artifactDownloadUrl>"
}
]
}
}
Сообщения функций
Сообщения, сгенерированные в результате работы функций можно отобразить с помощью типа tool:
Обычно, сообщения функций формируются средой исполнения при ответе инструмента.
Пример кода для формирования сообщения:
from langchain_core.messages import ToolMessage
import json
import uuid
def make_tool_message(result: dict, tool_call_id: str) -> ToolMessage:
return ToolMessage(
id=str(uuid.uuid4()),
tool_call_id=tool_call_id,
content=json.dumps(result, ensure_ascii=False),
)
JSON-схема данных, которые поступают на фронтенд:
{
"id": "<UUIDv4>",
"type": "tool",
"content": "{\"message\": \"Результат выполнения: ...\", \"is_exception\": false}",
"tool_call_id": "<UUIDv4>"
}
Добавление подсказок
Подсказки (suggests) — кнопки с вариантами продолжения диалога, которые появляются после ответа агента.
Подробный пример формирования и добавления подсказок в ответы агента.
Пример демонстрирует работу со структурированными данными.
Чтобы получить ответ единым блоком и корректно обработать его, перед вызовом модели отключается потоковая передача токенов llm.disable_streaming = True .
По умолчанию потоковая передача токенов включена.
Пример JSON-схемы подсказок:
{
"json_schema_extra": {
"examples": [
{
"should_suggest": True,
"suggests": [
{
"label": "Уточнить свежие новости по теме",
"prompt": "Используй DuckDuckGo и найди последние новости",
"position": 0,
}
],
},
{
"should_suggest": False,
"suggests": [],
},
]
}
}
Собственные сообщения
Интерфейс чата также может отображать произвольные сообщения event=custom.
Например, лог работы агента:
Пример кода для формирования сообщения:
from langgraph.types import StreamWriter
from agent_lab_sdk.schema import LogMessage
async def run_step(state, writer: StreamWriter):
writer(LogMessage("🔍 Запуск исследования для 'Привет'..."))
# ... полезная работа ...
writer(LogMessage("✅ Обработка завершена"))
return state
JSON-схема данных, которые поступают на фронтенд:
{
"type":"log",
"content":"🔍 Запуск исследования для 'Привет'..."
}