JSON-схема и виджеты SDUI
JSON-схема (expected_schema)
JSON-схема определяет структуру ответа, который LLM должна вернуть после анализа разговора. Схема используется для:
- Инструктирования LLM о формате ответа
- Валидации полученного результата
- Маппинга полей на виджеты
Обязательные метаданные
Каждый ответ LLM должен содержать блок metadata со следующими полями:
| Поле | Тип | Описание | Допустимые значения |
|---|---|---|---|
summary | string | Краткое резюме разговора | Текст до 500 символов |
topic | string | Основная тема | Текст до 200 символов |
client_sentiment | enum | Настроение клиента | negative, neutral, positive, aggressive |
manager_tone | enum | Тон менеджера | negative, neutral, positive, professional |
resolution_status | enum | Решён ли вопрос | resolved, unresolved, partially_resolved |
Пользовательские поля
Помимо обязательных метаданных, вы можете добавить любые поля в схему. Например: оценки по критериям, теги, рекомендации, цитаты и т.д.
Виджеты SDUI (ui_config)
SDUI (Server-Driven UI) — это система, которая определяет, как результаты анализа отображаются в интерфейсе. Конфигурация ui_config задаёт маппинг полей JSON-ответа на визуальные виджеты.
Доступные типы виджетов
quality_badge
Бейдж общего качества обслуживания.
{
"type": "quality_badge",
"data": {
"quality": "excellent",
"label": "Отличное качество обслуживания"
}
}
Допустимые значения quality: poor, fair, good, excellent.
scores
Числовые оценки по различным критериям. Максимальное значение для каждой оценки берётся из поля maximum в JSON-схеме соответствующего свойства. Виджет отображает оценку в формате value/max с пропорциональным заполнением прогресс-бара.
{
"type": "scores",
"title": "Оценки менеджера",
"data": {
"communication": {"value": 8, "max": 10},
"product_knowledge": {"value": 9, "max": 10},
"objection_handling": {"value": 7, "max": 10}
}
}
Чтобы задать максимум, отличный от 10 (по умолчанию), укажите maximum в JSON-схеме:
{
"properties": {
"communication": {"type": "integer", "minimum": 0, "maximum": 10},
"overall_quality": {"type": "integer", "minimum": 0, "maximum": 100}
}
}
score_card
Расширенная карточка оценки с цитатой из разговора и описанием. Используется, когда важно не только показать оценку, но и подкрепить её контекстом — конкретной репликой и объяснением.
{
"type": "score_card",
"title": "Оценки с обоснованием",
"items": [
{
"label": "Коммуникация",
"score": 8,
"max": 10,
"quote": "Я вас прекрасно понимаю, давайте разберёмся вместе",
"description": "Менеджер проявил эмпатию и использовал активное слушание",
"sentiment": "positive"
},
{
"label": "Работа с возражениями",
"score": 5,
"max": 10,
"quote": "Ну, это вы у руководства спросите",
"description": "Не отработал возражение, переадресовал вопрос",
"sentiment": "negative"
}
]
}
Поля каждого элемента:
| Поле | Тип | Описание |
|---|---|---|
label | string | Название критерия |
score | number | Оценка |
max | number | Максимум шкалы |
quote | string | Цитата из разговора |
description | string | Обоснование оценки |
sentiment | enum | positive, neutral, negative (опционально) |
sentiment
Настроение участников разговора.
{
"type": "sentiment",
"title": "Настроение участников",
"data": {
"client": "positive",
"manager": "professional"
}
}
key_points
Ключевые моменты разговора с маркерами.
{
"type": "key_points",
"title": "Ключевые моменты",
"items": [
{
"icon": "check",
"text": "Правильно идентифицировал потребность клиента",
"sentiment": "positive"
},
{
"icon": "warning",
"text": "Пропустил этап выявления возражений",
"sentiment": "warning"
}
]
}
Значения icon: check, warning, error.
Значения sentiment: positive, neutral, negative, warning.
timeline
Хронология событий разговора.
{
"type": "timeline",
"title": "Хронология разговора",
"events": [
{
"time": "00:23",
"speaker": "manager",
"event": "Приветствие и представление"
},
{
"time": "01:15",
"speaker": "client",
"event": "Описание проблемы с платежной системой"
}
]
}
recommendations
Рекомендации для менеджера.
{
"type": "recommendations",
"title": "Рекомендации для менеджера",
"priority": "high",
"items": [
"Изучить скрипт работы с возражениями",
"Практиковать активное слушание",
"Использовать открытые вопросы для выявления потребностей"
]
}
Значения priority: low, medium, high.
metrics
Произвольные числовые метрики.
{
"type": "metrics",
"title": "Ключевые метрики",
"items": [
{"label": "Длительность", "value": "15:23", "unit": "мин"},
{"label": "Перебиваний клиента", "value": 3, "sentiment": "warning"},
{"label": "Использовано скриптов", "value": 5, "total": 7, "sentiment": "neutral"}
]
}
tags
Облако тегов с цветовой кодировкой.
{
"type": "tags",
"title": "Теги",
"items": [
{"label": "Отказ", "color": "red"},
{"label": "Возражение: цена", "color": "orange"},
{"label": "Повторный звонок", "color": "blue"}
]
}
alert
Важное предупреждение.
{
"type": "alert",
"severity": "warning",
"message": "Клиент выразил недовольство. Рекомендуется перезвонить."
}
Значения severity: info, warning, error.
quote
Цитата из разговора.
{
"type": "quote",
"speaker": "client",
"text": "Я уже третий раз звоню по этому вопросу!",
"context": "Клиент выразил недовольство на 3-й минуте разговора",
"sentiment": "negative"
}
progress
Прогресс выполнения скрипта (чеклист).
{
"type": "progress",
"title": "Выполнение скрипта",
"items": [
{"step": "Приветствие", "completed": true},
{"step": "Выявление потребности", "completed": true},
{"step": "Презентация продукта", "completed": false},
{"step": "Работа с возражениями", "completed": false},
{"step": "Закрытие сделки", "completed": false}
]
}
comparison
Сравнение метрик с трендами.
{
"type": "comparison",
"title": "Сравнение с предыдущим звонком",
"items": [
{"metric": "Качество", "before": "fair", "after": "good", "trend": "up"},
{"metric": "Коммуникация", "before": 6, "after": 8, "trend": "up"}
]
}
Значения trend: up, down, stable.
Структура ответа LLM
Полный ответ LLM должен соответствовать следующей структуре:
{
"metadata": {
"summary": "Краткое резюме разговора",
"topic": "Основная тема",
"client_sentiment": "positive",
"manager_tone": "professional",
"resolution_status": "resolved"
},
"ui_components": [
{ "type": "quality_badge", "data": { ... } },
{ "type": "scores", "title": "...", "data": { ... } },
...
]
}
Блок metadata обязателен. Блок ui_components должен содержать минимум один виджет.