# Оценка звонков

# Как устроена оценка звонков

*Для разработчиков. Состояние на 24.09.2026. Подробности — в README репозиториев `Buharestskie/amocrm_transcribe_service` и `Buharestskie/yandex_transcribe_service`.*

## Коротко

Все дашборды — МПП2, МОС и МПП1 — расшифровывают и оценивают звонки через один сервис: **amocrm\_transcribe\_service** (в конфигах дашбордов он называется «S2T apiscrm»). Он отдаёт запись в распознавание речи A5X, раскладывает реплики на менеджера и клиента и оценивает разговор языковой моделью A5X по промпту, который прислал дашборд. Критерии оценки живут не в сервисе, а в «Настройках» каждого дашборда.

## Путь звонка

1. **Звонок попадает в дашборд** из телефонии — Sipuni, МегаФон или своя PBX: вебхуком или синхронизацией истории.
2. **Дашборд решает, что оценивать**, по своим правилам: МПП2 — серия звонков после входа сделки в «Принимают решение», МОС — звонки по касаниям, рискам и рекомендациям, МПП1 — звонки охотников. Звонки одного клиента за день склеиваются в серию.
3. **Запрос в сервис** — `POST /internal/transcribe-analyze` на внутренний порт сервиса на `global` (адрес — в README): ссылки на записи, тип телефонии у каждой, промпт и адрес для ответа. Сервис сразу отвечает `202`.
4. **Распознавание** — запись целиком уходит в `s2t.a5x.pro`. Левый канал становится `SPEAKER_00`, правый — `SPEAKER_01`.
5. **Роли** — кто из них менеджер, сервис решает по типу телефонии, не по тексту (таблица ниже).
6. **Оценка** — сегменты уходят в `llm.a5x.pro` (модель `qwen36-35b-a3b`): промпт дашборда — системным сообщением, разговор — в виде `[секунда роль] текст`.
7. **Ответ** — сервис присылает дашборду обратный вызов: расшифровку, ответ модели (сырой и разобранный JSON) и расход — секунды аудио и токены. Дашборд сохраняет разбор и показывает его: МПП2 — на вкладке «Качество» и в виджете «Оценка разговоров» в карточке сделки, МОС — в касаниях, рисках и рекомендациях, МПП1 — в карточке звонка.

<table id="bkmrk-%D0%94%D0%B0%D1%88%D0%B1%D0%BE%D1%80%D0%B4%D0%9A%D1%83%D0%B4%D0%B0-%D0%BF%D1%80%D0%B8%D1%85%D0%BE%D0%B4%D0%B8%D1%82"><thead><tr><th>Дашборд</th><th>Куда приходит ответ</th><th>Где промпты</th></tr></thead><tbody><tr><td>МПП2</td><td>`/api/transcriptions/callback`</td><td>Настройки: две консультации, касания, тёплый пул</td></tr><tr><td>МОС</td><td>`/api/telephony/webhooks/transcribe`</td><td>Настройки: касания, риски, рекомендации</td></tr><tr><td>МПП1</td><td>`/api/v1/internal/transcribe/callback`</td><td>Настройки: гейт и QA-аудитор</td></tr></tbody></table>

## Каналы по телефониям

<table id="bkmrk-%D0%A2%D0%B5%D0%BB%D0%B5%D1%84%D0%BE%D0%BD%D0%B8%D1%8F%D0%9C%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80%D0%9A%D0%BB%D0%B8"><thead><tr><th>Телефония</th><th>Менеджер</th><th>Клиент</th></tr></thead><tbody><tr><td>Sipuni</td><td>правый канал</td><td>левый</td></tr><tr><td>МегаФон</td><td>левый</td><td>правый</td></tr><tr><td>Своя PBX</td><td>правый</td><td>левый</td></tr></tbody></table>

Запись должна быть стерео: моно-запись получает ошибку, роли не угадываются. Подключаете новую телефонию — сначала строка в этой таблице (`src/speaker_mapping.py`), иначе менеджер и клиент перепутаются во всех разборах.

## Резерв: Yandex

**yandex\_transcribe\_service** (тоже на `global`) — распознавание SpeechKit и оценка YandexGPT в два этапа (гейт, затем полный разбор). Раньше был основным, с 17.09.2026 рабочих запросов нет: остался кнопкой ручной перерасшифровки «через Yandex» в МПП2 и МПП1. Каталог Yandex Cloud при этом живой и платный.

Ещё два репозитория — `assembly_transcribation` (AssemblyAI) и `gemini_service` (Gemini) — нигде не развёрнуты.

## Если оценки не приходят

1. **Жив ли сервис**: с `global` — `curl -s localhost:8083/health`.
2. **Доходят ли запросы**: `docker logs --since 1h amocrm_transcribe_service-apiscrm-transcribe-1 | grep transcribe-analyze`.
3. **Ошибки** — в GlitchTip, проект сервиса, и в обратных вызовах с полем ошибки: их дашборд показывает у звонка.
4. **Сервис перезапускали?** Задачи в работе живут в памяти и при перезапуске теряются. МОС повторяет звонок без ответа через час (потом через 30 минут и 2 часа, всего четыре попытки), МПП1 — задачей раз в 20 минут.
5. **Ответ пришёл, а разбора нет** — модель ответила не JSON: смотреть сырой `analysis_text` в данных звонка и промпт в «Настройках».

## Что стоит денег

Каждый разбор — минуты распознавания A5X и токены модели. Ключ у распознавания и модели сейчас один: отзовут — встанут оба этапа. Правка промпта в «Настройках» действует только на новые звонки; старые заново не оцениваются.