# 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

Бейдж общего качества обслуживания.

```json
{
  "type": "quality_badge",
  "data": {
    "quality": "excellent",
    "label": "Отличное качество обслуживания"
  }
}
```

Допустимые значения `quality`: `poor`, `fair`, `good`, `excellent`.

***

#### scores

Числовые оценки по различным критериям (шкала 0–10).

```json
{
  "type": "scores",
  "title": "Оценки менеджера",
  "data": {
    "communication": 8,
    "product_knowledge": 9,
    "objection_handling": 7
  }
}
```

***

#### sentiment

Настроение участников разговора.

```json
{
  "type": "sentiment",
  "title": "Настроение участников",
  "data": {
    "client": "positive",
    "manager": "professional"
  }
}
```

***

#### key\_points

Ключевые моменты разговора с маркерами.

```json
{
  "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

Хронология событий разговора.

```json
{
  "type": "timeline",
  "title": "Хронология разговора",
  "events": [
    {
      "time": "00:23",
      "speaker": "manager",
      "event": "Приветствие и представление"
    },
    {
      "time": "01:15",
      "speaker": "client",
      "event": "Описание проблемы с платежной системой"
    }
  ]
}
```

***

#### recommendations

Рекомендации для менеджера.

```json
{
  "type": "recommendations",
  "title": "Рекомендации для менеджера",
  "priority": "high",
  "items": [
    "Изучить скрипт работы с возражениями",
    "Практиковать активное слушание",
    "Использовать открытые вопросы для выявления потребностей"
  ]
}
```

Значения `priority`: `low`, `medium`, `high`.

***

#### metrics

Произвольные числовые метрики.

```json
{
  "type": "metrics",
  "title": "Ключевые метрики",
  "items": [
    {"label": "Длительность", "value": "15:23", "unit": "мин"},
    {"label": "Перебиваний клиента", "value": 3, "sentiment": "warning"},
    {"label": "Использовано скриптов", "value": 5, "total": 7, "sentiment": "neutral"}
  ]
}
```

***

#### tags

Облако тегов с цветовой кодировкой.

```json
{
  "type": "tags",
  "title": "Теги",
  "items": [
    {"label": "Отказ", "color": "red"},
    {"label": "Возражение: цена", "color": "orange"},
    {"label": "Повторный звонок", "color": "blue"}
  ]
}
```

***

#### alert

Важное предупреждение.

```json
{
  "type": "alert",
  "severity": "warning",
  "message": "Клиент выразил недовольство. Рекомендуется перезвонить."
}
```

Значения `severity`: `info`, `warning`, `error`.

***

#### quote

Цитата из разговора.

```json
{
  "type": "quote",
  "speaker": "client",
  "text": "Я уже третий раз звоню по этому вопросу!",
  "context": "Клиент выразил недовольство на 3-й минуте разговора",
  "sentiment": "negative"
}
```

***

#### progress

Прогресс выполнения скрипта (чеклист).

```json
{
  "type": "progress",
  "title": "Выполнение скрипта",
  "items": [
    {"step": "Приветствие", "completed": true},
    {"step": "Выявление потребности", "completed": true},
    {"step": "Презентация продукта", "completed": false},
    {"step": "Работа с возражениями", "completed": false},
    {"step": "Закрытие сделки", "completed": false}
  ]
}
```

***

#### comparison

Сравнение метрик с трендами.

```json
{
  "type": "comparison",
  "title": "Сравнение с предыдущим звонком",
  "items": [
    {"metric": "Качество", "before": "fair", "after": "good", "trend": "up"},
    {"metric": "Коммуникация", "before": 6, "after": 8, "trend": "up"}
  ]
}
```

Значения `trend`: `up`, `down`, `stable`.

***

## Структура ответа LLM

Полный ответ LLM должен соответствовать следующей структуре:

```json
{
  "metadata": {
    "summary": "Краткое резюме разговора",
    "topic": "Основная тема",
    "client_sentiment": "positive",
    "manager_tone": "professional",
    "resolution_status": "resolved"
  },
  "ui_components": [
    { "type": "quality_badge", "data": { ... } },
    { "type": "scores", "title": "...", "data": { ... } },
    ...
  ]
}
```

{% hint style="warning" %}
Блок `metadata` обязателен. Блок `ui_components` должен содержать минимум один виджет.
{% endhint %}
