Перейти к основному содержимому

JSON-схема и виджеты SDUI

JSON-схема (expected_schema)

JSON-схема определяет структуру ответа, который LLM должна вернуть после анализа разговора. Схема используется для:

  • Инструктирования LLM о формате ответа
  • Валидации полученного результата
  • Маппинга полей на виджеты

Обязательные метаданные

Каждый ответ LLM должен содержать блок metadata со следующими полями:

ПолеТипОписаниеДопустимые значения
summarystringКраткое резюме разговораТекст до 500 символов
topicstringОсновная темаТекст до 200 символов
client_sentimentenumНастроение клиентаnegative, neutral, positive, aggressive
manager_toneenumТон менеджераnegative, neutral, positive, professional
resolution_statusenumРешён ли вопрос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"
}
]
}

Поля каждого элемента:

ПолеТипОписание
labelstringНазвание критерия
scorenumberОценка
maxnumberМаксимум шкалы
quotestringЦитата из разговора
descriptionstringОбоснование оценки
sentimentenumpositive, 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": { ... } },
...
]
}
warning

Блок metadata обязателен. Блок ui_components должен содержать минимум один виджет.