↩️ Назад

Категории

Как собрать AI-аналитику звонков с Mango Office — Пошаговый гайд

06.08.2026 | из категории: Нейросети

1 Введение — зачем это всё

Представьте: вы руководитель отдела продаж. Каждый день десятки звонков, сотни минут разговоров. Как понять, кто из менеджеров работает качественно, а кого пора отправлять на переобучение?

Раньше приходилось выборочно слушать записи — это занимало часы. Я решил автоматизировать процесс и собрал систему, которая:

Результат: Теперь после каждого звонка я вижу «Норм» или «Токсичен + причина», а также рейтинг менеджера от 1 до 5.

2 Архитектура решения

Mango Office Вебхук Скрипт-диспетчер
Скачать MP3 Yandex SpeechKit YandexGPT База данных
Веб-интерфейс Статистика

3 Чек-лист: что нужно для старта

Совет: VPS от 500–800 ₽/мес — отличный вариант для старта.

4 Шаг 1: Регистрация в Yandex Cloud

1 Создаём сервисный аккаунт ~5 минут
  1. Зайдите в console.cloud.yandex.ru
  2. Создайте каталог, запомните Folder ID
  3. Перейдите в «Сервисные аккаунты»«Создать»
  4. Назовите: speechkit-agent
  5. Назначьте роли: ai.speechkit-stt.user и ai.languageModels.user
  6. Создайте API-ключ и сохраните его
📌 Итог: У вас есть YANDEX_API_KEY и YANDEX_FOLDER_ID

5 Шаг 2: Настройка вебхука в Mango Office

2 Настраиваем отправку данных ~10 минут
  1. В личном кабинете Mango: «Настройки»«API»
  2. Проверьте, что есть API-токен
  3. В блоке «Вебхуки» добавьте событие «Конец звонка»
  4. Укажите URL: https://ваш_сервер:8000/webhook/mango
  5. Отметьте параметры: callId, recordUrl, callerNumber, duration
  6. Включите опцию: «Предоставлять возможность генерации и использования ссылок»
✅ Готово: Mango теперь отправляет вебхуки на ваш сервер.

6 Шаг 3: Тестовый логгер

3 Смотрим, что приходит ~5 минут

Создайте logger.py, чтобы проверить структуру вебхука:

from fastapi import FastAPI, Request
import json
import logging
from datetime import datetime

app = FastAPI()
logging.basicConfig(level=logging.INFO)

@app.post("/webhook/mango")
async def logger(request: Request):
    data = await request.json()
    logging.info(json.dumps(data, indent=2, ensure_ascii=False))
    with open("webhook_log.txt", "a", encoding="utf-8") as f:
        f.write(json.dumps(data, indent=2, ensure_ascii=False))
    return {"status": "ok"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
            

Запустите: python3 logger.py и сделайте тестовый звонок.

📋 Пример данных: {"webhookType":2,"callId":123,"recordUrl":"https://...","duration":300,...}

7 Шаг 4: Скрипт-диспетчер

4 Прокси для 1С и AI ~15 минут

Этот скрипт принимает вебхуки, запускает AI-анализ и пересылает копию в старую 1С.

from fastapi import FastAPI, Request
import httpx
import asyncio

app = FastAPI()
OLD_1C_URL = "https://37.230.154.96:88/logo_test/hs/MangoAPI/v1/"

async def run_ai(mango_data):
    print(f"🤖 AI: Анализирую звонок {mango_data.get('callId')}")
    # 🔥 Сюда вставляете вызов вашего AI-агента

@app.post("/webhook/mango")
async def dispatcher(request: Request):
    data = await request.json()
    if data.get('webhookType') == 2 and data.get('recordUrl'):
        asyncio.create_task(run_ai(data))
    async with httpx.AsyncClient() as client:
        await client.post(OLD_1C_URL, json=data, timeout=30.0)
    return {"status": "ok"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
            

Важно: замените OLD_1C_URL на свой адрес.

⚙️ Суть: Mango отправляет на диспетчер, диспетчер копирует в 1С и запускает AI.

8 Шаг 5: AI-агент

5 Распознавание + анализ ~20 минут

Полный код агента (agent.py):

import os
import requests
import json
import re
from dotenv import load_dotenv
load_dotenv()

YANDEX_API_KEY = os.getenv("YANDEX_API_KEY")
YANDEX_FOLDER_ID = os.getenv("YANDEX_FOLDER_ID")

def transcribe(audio_content):
    url = "https://stt.api.cloud.yandex.net/speech/v1/stt:recognize"
    headers = {"Authorization": f"Api-Key {YANDEX_API_KEY}", "Content-Type": "audio/ogg;codecs=opus"}
    resp = requests.post(url, headers=headers, data=audio_content, timeout=60)
    return resp.json().get("result") if resp.status_code == 200 else None

def analyze_gpt(transcript):
    url = "https://llm.api.cloud.yandex.net/foundationModels/v1/completion"
    prompt = """Ты эксперт по оценке сервиса. Верни ТОЛЬКО JSON:
    {"manager_rating": число 1-5, "verdict": "НОРМ" или "ТОКСИЧЕН", "verdict_reason": "причина", "emotional_tone": "positive/neutral/negative"}
    Диалог: """ + transcript
    payload = {
        "modelUri": f"gpt://{YANDEX_FOLDER_ID}/yandexgpt-lite",
        "completionOptions": {"temperature": 0.3, "maxTokens": 1000},
        "messages": [{"role": "user", "text": prompt}]
    }
    headers = {"Authorization": f"Api-Key {YANDEX_API_KEY}", "Content-Type": "application/json"}
    resp = requests.post(url, headers=headers, json=payload, timeout=60)
    if resp.status_code == 200:
        text = resp.json().get("result", {}).get("alternatives", [{}])[0].get("message", {}).get("text", "")
        match = re.search(r'\{.*\}', text, re.DOTALL)
        if match:
            return json.loads(match.group())
    return {"manager_rating":0,"verdict":"ОШИБКА","verdict_reason":"Ошибка анализа","emotional_tone":"unknown"}

def process_call(call_data):
    audio = requests.get(call_data["recordUrl"], timeout=30).content
    transcript = transcribe(audio)
    if not transcript:
        return None
    return analyze_gpt(transcript)
            

Файл .env:

YANDEX_API_KEY=ваш_ключ
YANDEX_FOLDER_ID=ваш_folder_id
DATABASE_URL=sqlite:///calls.db
            

9 Шаг 6: Веб-интерфейс

6 Панель для просмотра ~10 минут

Добавьте в main.py эндпоинты для API:

@app.get("/api/calls")
def get_calls():
    session = Session()
    calls = session.query(Call).order_by(Call.created_at.desc()).limit(100).all()
    return [{"call_id":c.call_id,"verdict":c.verdict,"manager_rating":c.manager_rating,"created_at":c.created_at.isoformat()} for c in calls]

@app.get("/api/statistics")
def stats():
    session = Session()
    total = session.query(Call).count()
    toxic = session.query(Call).filter_by(verdict="ТОКСИЧЕН").count()
    return {"total":total,"toxic":toxic,"norm":total-toxic,"toxic_percent":round(toxic/total*100,1) if total else 0}
            

Создайте index.html — он будет загружать данные через эти API и показывать таблицу.

📊 Результат: Таблица со звонками, рейтингами, вердиктами и тональностью.

10 Бюджет

УслугаСтоимостьПримечание
Mango Office0 ₽Уже оплачено
Yandex SpeechKit~1 200–2 400 ₽0,40–0,80 ₽/мин
YandexGPT~100–200 ₽За 100 звонков
Сервер VPS~500–800 ₽Базовый тариф
ИТОГО~1 800 – 3 400 ₽За 100 звонков
Экономия: Замена ручной прослушки экономит ~5 000–7 500 ₽/мес.

11 Итог

Что мы получили

Автоматизация анализа звонков
📊
Веб-панель с результатами
💰
Бюджет ~2000–3500 ₽/мес
🚀
Масштабируется на любые объёмы

Теперь вы в любой момент можете зайти в веб-интерфейс и увидеть, кто из менеджеров «токсичит», какой средний рейтинг и динамику качества по дням.

👍 Оцените статью
Всего голосов: 0



Категории:

Категории

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку

Посетителей сегодня: 0
о блоге | карта блога | 📡 Подписаться на RSS

© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA