Открыть меню
Платформа Эра. Документация
Toggle preferences menu
Открыть персональное меню
Вы не представились системе
Your IP address will be publicly visible if you make any edits.

Установка сервисов голосового робота: различия между версиями

Материал из Платформа Эра. Документации
Новая страница: «= Установка и настройка робота Эра (SecondChain) = Пошаговая инструкция по развёртыванию голосового робота на проектном домене. __TOC__ == 0. Подготовка сервера == === Установка Docker === <syntaxhighlight lang="bash"> apt install ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ub...»
 
Нет описания правки
Строка 1: Строка 1:
= Установка и настройка робота Эра (SecondChain) =
= Установка и настройка голосового робота Эра (SecondChain) =


Пошаговая инструкция по развёртыванию голосового робота на проектном домене.
Пошаговая инструкция по развёртыванию голосового робота. Процесс разбит на четыре этапа:
 
# '''[[#Этап 1. Подготовка|Подготовка]]''' — Docker, PostgreSQL, настройки в системе телефонии.
# '''[[#Этап 2. Установка сервисов инференса (опционально)|Установка сервисов инференса]]''' — ASR, LLM, TTS. ''Опционально, только для развёртывания на собственном сервере с GPU.''
# '''[[#Этап 3. Настройка .env|Настройка .env]]''' — параметры подключения.
# '''[[#Этап 4. Запуск контейнера и создание робота|Запуск контейнера и создание робота]]''' — старт сервиса и конфигурация робота.


__TOC__
__TOC__


== 0. Подготовка сервера ==
= Этап 1. Подготовка =
 
Установка Docker, базы данных и настройка проброса заголовков и абонента в системе телефонии.


=== Установка Docker ===
== 1.1. Установка Docker ==


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 29: Строка 36:
</syntaxhighlight>
</syntaxhighlight>


== 1. Настройка проброса заголовка в B2B ==
== 1.2. Создать БД в PostgreSQL ==
 
Установить или взять существующий инстанс Postgres, создать нового пользователя и базу для робота.
 
Пример с Docker:
 
<syntaxhighlight lang="bash">
docker run -d \
  --name postgres \
  --network host \
  -e POSTGRES_USER=secondchain \
  -e POSTGRES_PASSWORD=changeme \
  -e POSTGRES_DB=secondchain \
  -v pgdata:/var/lib/postgresql/data \
  postgres:17
</syntaxhighlight>
 
== 1.3. Настройка проброса заголовка в B2B ==


Мастер-домен → приложение '''Настройки'''. В конфигурации, в нодах B2B добавить проброс заголовка <code>X-Robot-Session</code>:
Мастер-домен → приложение '''Настройки'''. В конфигурации, в нодах B2B добавить проброс заголовка <code>X-Robot-Session</code>:
Строка 39: Строка 63:
Активировать новую конфигурацию.
Активировать новую конфигурацию.


== 2. Создать абонента для робота ==
== 1.4. Создать абонента для робота ==


Проектный домен → приложение '''Настройки'''. Создать нового абонента, под которым будет регистрироваться робот.
Проектный домен → приложение '''Настройки'''. Создать нового абонента, под которым будет регистрироваться робот.


== 3. Создать канал интеграции для робота ==
== 1.5. Создать канал интеграции для робота ==


Проектный домен → приложение '''Настройки'''. Создать новый канал интеграции:
Проектный домен → приложение '''Настройки'''. Создать новый канал интеграции:
Строка 51: Строка 75:
* '''Режим активности''' — постоянный
* '''Режим активности''' — постоянный


{{Note|Сохранить локальный токен — он потребуется на шаге [[#7. Заполнить .env|заполнения .env]].}}
{{Note|Сохранить локальный токен — он потребуется на [[#Этап 3. Настройка .env|этапе настройки .env]].}}


== 4. Создать движок в приложении ИИ ==
== 1.6. Создать движок в приложении ИИ ==


Задать произвольные название и код. В поле '''Номер телефона''' указать внутренний номер абонента, созданного на шаге [[#2. Создать абонента для робота|2]].
Задать произвольные название и код. В поле '''Номер телефона''' указать внутренний номер абонента, созданного на шаге [[#1.4. Создать абонента для робота|1.4]].


'''Количество сессий''' по умолчанию = 8. Точное число зависит от оборудования, на котором размещаются сервисы робота.
'''Количество сессий''' по умолчанию = 8. Точное число зависит от оборудования, на котором размещаются сервисы робота.


== 5. Развернуть сервисы инференса (vLLM, LightTTS, T-one Triton) ==
= Этап 2. Установка сервисов инференса (опционально) =
 
{{Note|'''Опциональный этап.''' Выполняется только при развёртывании сервисов инференса на собственном сервере с GPU. Если ASR / LLM / TTS уже развёрнуты или используются внешние эндпоинты — перейдите к [[#Этап 3. Настройка .env|Этапу 3]].}}
 
Инструкция для '''Ubuntu Server 24.04'''. Стек: ASR (T-one/Triton) → LLM (Qwen3.5-35B-A3B на vLLM) → TTS (LightTTS + CosyVoice3).
 
Целевая машина — сервер с GPU: '''RTX PRO 5000 (48GB)''' или '''RTX PRO 6000 Blackwell (96GB)'''.
 
== 2.1. Предварительные требования ==
 
Убедиться, что установлены драйверы NVIDIA, Docker и NVIDIA Container Toolkit:


{{TODO|Раздел будет описан отдельно. Здесь размещаются контейнеры LLM-инференса (vLLM), синтеза речи (LightTTS) и ASR (T-one на Triton).}}
<syntaxhighlight lang="bash">
nvidia-smi                          # драйвер и GPU видны
docker --version                    # Docker установлен
docker run --rm --gpus all ubuntu nvidia-smi  # GPU проброшен в контейнер
</syntaxhighlight>


<!-- Плейсхолдер под отдельное описание:
Если последняя команда не отображает GPU, требуется установить NVIDIA Container Toolkit и перезапустить Docker.
== 5.1. vLLM ==
== 5.2. LightTTS ==
== 5.3. T-one Triton ==
-->


== 6. Создать БД в PostgreSQL ==
=== Бюджет VRAM ===


Установить или взять существующий инстанс Postgres, создать нового пользователя и базу для робота.
{| class="wikitable"
! Компонент !! VRAM
|-
| ASR (T-one/Triton) || 600–800 MB
|-
| LLM (Qwen3.5-35B-A3B) || 24–48 GB (зависит от числа сессий и длины контекста)
|-
| TTS (LightTTS/CosyVoice3) || 11 GB
|}
 
Суммарное потребление в пике — ~36–60 GB.
 
'''RTX PRO 6000 (96GB):''' объёма достаточно с большим запасом. Допустимо использование максимального числа сессий и длинного контекста.
 
'''RTX PRO 5000 (48GB):''' запас минимальный. Фиксированная сумма ASR (~0.8 GB) и TTS (11 GB) составляет ~12 GB, на LLM остаётся ~36 GB. Это покрывает только нижнюю границу диапазона LLM (24 GB). Требуется ограничение параметров <code>--max-num-seqs</code> и <code>--max-model-len</code> во избежание ошибки OOM. Значение <code>--gpu-memory-utilization 0.50</code> (~24 GB на карте 48GB) для данного сценария допустимо при условии, что ASR и TTS инициализированы до старта LLM.
 
== 2.2. Порядок запуска ==
 
Модели независимы. Рекомендуемый порядок развёртывания для упрощения диагностики: '''ASR → LLM → TTS'''.
 
== 2.3. ASR (T-one на Triton) ==
 
Сборка выполняется из исходных файлов в каталоге <code>/home/secondchain</code> через venv и скрипт сборки контейнера.
 
<syntaxhighlight lang="bash">
# Python 3.12 + venv
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install -y python3.12 python3.12-venv
 
# Корень проекта
cd /home/secondchain
 
# Установка зависимостей
./setup.sh
 
# Активация окружения
source venv/bin/activate
 
# Сборка и запуск контейнера T-one на Triton
./scripts/run_tone_triton.sh
</syntaxhighlight>
 
'''Проверка:''' после старта Triton слушает gRPC (стандартно 8001) и HTTP (стандартно 8000). Потребление VRAM — '''600–800 MB'''. Статус контейнера:
 
<syntaxhighlight lang="bash">
docker ps | grep -i tone
</syntaxhighlight>
 
{{Note|При отсутствии ответа со стороны ASR диагностику следует начинать с проверки портов gRPC и логов контейнера.}}
 
== 2.4. LLM (Qwen3.5-35B-A3B на vLLM) ==


Пример с Docker:
{{Note|'''Перед запуском:''' значение <code>/path/to/cache</code> необходимо заменить на фактический путь к кэшу моделей (например <code>~/vllm-cache</code>), иначе веса будут загружаться повторно при каждом старте.}}


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
docker run -d \
docker run -d \
   --name postgres \
   --name vllm-qwen35-moe \
   --network host \
  --gpus all \
   -e POSTGRES_USER=secondchain \
  --ipc=host \
   -e POSTGRES_PASSWORD=changeme \
  -v ~/vllm-cache:/root/.cache \
   -e POSTGRES_DB=secondchain \
  -p 16080:8000 \
   -v pgdata:/var/lib/postgresql/data \
  vllm/vllm-openai:cu130-nightly \
   postgres:17
  --model Qwen/Qwen3.5-35B-A3B-GPTQ-Int4 \
  --served-model-name qwen35-35b-a3b \
  --quantization moe_wna16 \
  --max-num-seqs 6 \
  --max-model-len 8192 \
  --kv-cache-memory 3221225472 \
  --gpu-memory-utilization 0.50 \
  --enable-prefix-caching \
   --host 0.0.0.0 --port 8000 \
  --reasoning-parser qwen3 \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_coder \
   --language-model-only
</syntaxhighlight>
 
'''Ключевые параметры:'''
 
* <code>--max-model-len 8192</code> — максимальное окно контекста в токенах.
* <code>--max-num-seqs 6</code> — максимум одновременно обрабатываемых запросов.
* <code>--gpu-memory-utilization 0.50</code> — 50% VRAM выделено под LLM.
* <code>--kv-cache-memory 3221225472</code> — 3 GiB под KV-кэш.
 
Минимальный объём VRAM для запуска — '''24 GB'''. Фактическое потребление — '''24–48 GB''' в зависимости от числа допустимых сессий (<code>--max-num-seqs</code>) и длины контекста (<code>--max-model-len</code>).
 
'''Проверка:''' после загрузки весов проверить OpenAI-совместимый эндпоинт на порту '''16080''':
 
<syntaxhighlight lang="bash">
docker logs -f vllm-qwen35-moe        # ожидать "Application startup complete"
 
curl http://localhost:16080/v1/models
 
curl http://localhost:16080/v1/chat/completions \
   -H "Content-Type: application/json" \
   -d '{
    "model": "qwen35-35b-a3b",
    "messages": [{"role": "user", "content": "Привет"}]
  }'
</syntaxhighlight>
 
== 2.5. TTS (LightTTS + CosyVoice3) ==
 
Сборка двухфазная: на первой фазе интерактивно подготавливается образ с TRT-движком и весами с последующим коммитом, на второй — выполняется запуск в режиме демона.
 
=== Фаза 1 — подготовка образа ===
 
<syntaxhighlight lang="bash">
docker pull lighttts/light-tts:latest
 
docker run -it --gpus all -p 8080:8080 --shm-size 4g --name lighttts \
   -v ~/lighttts-models:/data \
  lighttts/light-tts:latest /bin/bash
</syntaxhighlight>
 
Внутри контейнера:
 
<syntaxhighlight lang="bash">
git checkout main && git pull
pip install huggingface_hub
 
python -c "
from huggingface_hub import snapshot_download
snapshot_download('FunAudioLLM/Fun-CosyVoice3-0.5B-2512', local_dir='/data/Fun-CosyVoice3-0.5B')
"
 
# первый запуск собирает TRT-движок (float16)
python -m light_tts.server.api_server \
  --model_dir /data/Fun-CosyVoice3-0.5B \
  --data_type float16 \
   --load_trt True
 
exit
</syntaxhighlight>
 
=== Фаза 2 — коммит и запуск в режиме демона ===
 
<syntaxhighlight lang="bash">
docker commit lighttts lighttts/light-tts:ready
docker rm lighttts
 
docker run -d --gpus all -p 8080:8080 --shm-size 4g \
  --restart unless-stopped \
  --name lighttts \
  -v ~/lighttts-models:/data \
  lighttts/light-tts:ready \
  python -m light_tts.server.api_server \
    --model_dir /data/Fun-CosyVoice3-0.5B \
    --data_type float16 \
    --load_trt True
</syntaxhighlight>
 
'''Проверка:''' TTS слушает порт '''8080''', потребление VRAM — '''11 GB''':
 
<syntaxhighlight lang="bash">
docker ps | grep lighttts
docker logs -f lighttts          # ожидать готовности сервера
</syntaxhighlight>
 
== 2.6. Итоговая карта портов ==
 
{| class="wikitable"
! Сервис !! Контейнер !! Внешний порт
|-
| ASR (Triton HTTP) || <code>*tone*</code> || 8000
|-
| ASR (Triton gRPC) || <code>*tone*</code> || 8001
|-
| LLM (vLLM) || <code>vllm-qwen35-moe</code> || 16080
|-
| TTS (LightTTS) || <code>lighttts</code> || 8080
|}
 
== 2.7. Финальная проверка стека ==
 
<syntaxhighlight lang="bash">
docker ps        # все три контейнера (ASR / vLLM / TTS) в статусе Up
</syntaxhighlight>
</syntaxhighlight>


== 7. Заполнить .env ==
После проверки выполняется подключение пайплайна PjSIP → VAD → ASR → LLM → TTS с указанием эндпоинтов в конфигурации: ASR — <code>:8000/:8001</code>, LLM — <code>:16080</code>, TTS — <code>:8080</code>.
 
= Этап 3. Настройка .env =
 
{{TODO|Раздел будет описан отдельно.}}
 
Базовые параметры:


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
EXTERNAL_TEMPLATES_URL=https://[адрес инстанса эры]/rest/v1/model/ai/robot
EXTERNAL_TEMPLATES_URL=https://[адрес инстанса эры]/rest/v1/model/ai/robot
EXTERNAL_TEMPLATES_TOKEN=[локальный токен из шага 3]
EXTERNAL_TEMPLATES_TOKEN=[локальный токен из шага 1.5]
</syntaxhighlight>
</syntaxhighlight>


А также настройки Postgres и подключения SIP к учётной записи абонента из шага [[#2. Создать абонента для робота|2]].
А также настройки Postgres (из шага [[#1.2. Создать БД в PostgreSQL|1.2]]) и подключения SIP к учётной записи абонента (из шага [[#1.4. Создать абонента для робота|1.4]]).
 
<!-- Плейсхолдер под подробное описание .env -->
 
= Этап 4. Запуск контейнера и создание робота =


== 8. Загрузка образа и запуск контейнера ==
== 4.1. Загрузка образа и запуск контейнера ==


Скопировать на сервер архив с образом контейнера и файл <code>.env</code> в одну директорию.
Скопировать на сервер архив с образом контейнера и файл <code>.env</code> в одну директорию.
Строка 126: Строка 336:
{{Note|Первый запуск занимает больше времени, чем последующие.}}
{{Note|Первый запуск занимает больше времени, чем последующие.}}


== 9. Создать робота в приложении ИИ ==
== 4.2. Создать робота в приложении ИИ ==


=== 9.1. Загрузить голос ===
=== Загрузить голос ===


Необходим аудиофайл <code>.mp3</code> или <code>.wav</code> длительностью ~10 секунд, без лишних шумов и эхо. При загрузке указать точную транскрипцию произнесённого текста (со знаками препинания).
Необходим аудиофайл <code>.mp3</code> или <code>.wav</code> длительностью ~10 секунд, без лишних шумов и эхо. При загрузке указать точную транскрипцию произнесённого текста (со знаками препинания).
Строка 134: Строка 344:
Для быстрого старта можно импортировать демо-голос (импорт + загрузка файла).
Для быстрого старта можно импортировать демо-голос (импорт + загрузка файла).


=== 9.2. Создать инструменты ===
=== Создать инструменты ===


Базовые инструменты работы со звонком.
Базовые инструменты работы со звонком.


==== 9.2.1. drop_call ====
==== drop_call ====


{| class="wikitable"
{| class="wikitable"
Строка 156: Строка 366:
|}
|}


==== 9.2.2. transfer_call ====
==== transfer_call ====


{| class="wikitable"
{| class="wikitable"
Строка 176: Строка 386:
|}
|}


=== 9.3. Создать робота ===
=== Создать робота ===


Импортировать шаблон (<code>Роботы.json</code>). На вкладке '''Инструкции''' изучить рекомендуемый шаблон системного промпта, а также промпта пост-обработки звонка.
Импортировать шаблон (<code>Роботы.json</code>). На вкладке '''Инструкции''' изучить рекомендуемый шаблон системного промпта, а также промпта пост-обработки звонка.


== 10. Проверить создание пользователя ==
== 4.3. Проверить создание пользователя ==


После создания робота должен автоматически создаться пользователь <code>Робот_имяРобота</code>.
После создания робота должен автоматически создаться пользователь <code>Робот_имяРобота</code>.


== 11. Проверить и установить статус пользователя ==
== 4.4. Проверить и установить статус пользователя ==


Приложение '''Супервизор контакт-центра''' → раздел '''Операторы → Текущие статусы'''. Убрать фильтры, найти пользователя робота и убедиться, что у него установлен статус '''Готов'''. При необходимости установить этот статус.
Приложение '''Супервизор контакт-центра''' → раздел '''Операторы → Текущие статусы'''. Убрать фильтры, найти пользователя робота и убедиться, что у него установлен статус '''Готов'''. При необходимости установить этот статус.


== 12. Добавить робота в очередь ==
== 4.5. Добавить робота в очередь ==


Приложение '''Администратор контакт-центра''' → добавить робота как участника очереди. '''Тип участника''' = Робот. В остальном настройки идентичны.
Приложение '''Администратор контакт-центра''' → добавить робота как участника очереди. '''Тип участника''' = Робот. В остальном настройки идентичны.


== 13. Осуществить звонок ==
== 4.6. Осуществить звонок ==


Настройка завершена. Можно совершить звонок в очередь и протестировать работу робота.
Настройка завершена. Можно совершить звонок в очередь и протестировать работу робота.

Версия от 20:44, 6 июля 2026

Установка и настройка голосового робота Эра (SecondChain)

Пошаговая инструкция по развёртыванию голосового робота. Процесс разбит на четыре этапа:

  1. Подготовка — Docker, PostgreSQL, настройки в системе телефонии.
  2. Установка сервисов инференса — ASR, LLM, TTS. Опционально, только для развёртывания на собственном сервере с GPU.
  3. Настройка .env — параметры подключения.
  4. Запуск контейнера и создание робота — старт сервиса и конфигурация робота.

Этап 1. Подготовка

Установка Docker, базы данных и настройка проброса заголовков и абонента в системе телефонии.

1.1. Установка Docker

apt install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

1.2. Создать БД в PostgreSQL

Установить или взять существующий инстанс Postgres, создать нового пользователя и базу для робота.

Пример с Docker:

docker run -d \
  --name postgres \
  --network host \
  -e POSTGRES_USER=secondchain \
  -e POSTGRES_PASSWORD=changeme \
  -e POSTGRES_DB=secondchain \
  -v pgdata:/var/lib/postgresql/data \
  postgres:17

1.3. Настройка проброса заголовка в B2B

Мастер-домен → приложение Настройки. В конфигурации, в нодах B2B добавить проброс заголовка X-Robot-Session:

"fwd_headers": ["X-Robot-Session"],

Активировать новую конфигурацию.

1.4. Создать абонента для робота

Проектный домен → приложение Настройки. Создать нового абонента, под которым будет регистрироваться робот.

1.5. Создать канал интеграции для робота

Проектный домен → приложение Настройки. Создать новый канал интеграции:

  • Тип — Подписчик
  • Праваai_admin, ai_voicebot_admin
  • Режим активности — постоянный

Шаблон:Note

1.6. Создать движок в приложении ИИ

Задать произвольные название и код. В поле Номер телефона указать внутренний номер абонента, созданного на шаге 1.4.

Количество сессий по умолчанию = 8. Точное число зависит от оборудования, на котором размещаются сервисы робота.

Этап 2. Установка сервисов инференса (опционально)

Шаблон:Note

Инструкция для Ubuntu Server 24.04. Стек: ASR (T-one/Triton) → LLM (Qwen3.5-35B-A3B на vLLM) → TTS (LightTTS + CosyVoice3).

Целевая машина — сервер с GPU: RTX PRO 5000 (48GB) или RTX PRO 6000 Blackwell (96GB).

2.1. Предварительные требования

Убедиться, что установлены драйверы NVIDIA, Docker и NVIDIA Container Toolkit:

nvidia-smi                          # драйвер и GPU видны
docker --version                    # Docker установлен
docker run --rm --gpus all ubuntu nvidia-smi   # GPU проброшен в контейнер

Если последняя команда не отображает GPU, требуется установить NVIDIA Container Toolkit и перезапустить Docker.

Бюджет VRAM

Компонент VRAM
ASR (T-one/Triton) 600–800 MB
LLM (Qwen3.5-35B-A3B) 24–48 GB (зависит от числа сессий и длины контекста)
TTS (LightTTS/CosyVoice3) 11 GB

Суммарное потребление в пике — ~36–60 GB.

RTX PRO 6000 (96GB): объёма достаточно с большим запасом. Допустимо использование максимального числа сессий и длинного контекста.

RTX PRO 5000 (48GB): запас минимальный. Фиксированная сумма ASR (~0.8 GB) и TTS (11 GB) составляет ~12 GB, на LLM остаётся ~36 GB. Это покрывает только нижнюю границу диапазона LLM (24 GB). Требуется ограничение параметров --max-num-seqs и --max-model-len во избежание ошибки OOM. Значение --gpu-memory-utilization 0.50 (~24 GB на карте 48GB) для данного сценария допустимо при условии, что ASR и TTS инициализированы до старта LLM.

2.2. Порядок запуска

Модели независимы. Рекомендуемый порядок развёртывания для упрощения диагностики: ASR → LLM → TTS.

2.3. ASR (T-one на Triton)

Сборка выполняется из исходных файлов в каталоге /home/secondchain через venv и скрипт сборки контейнера.

# Python 3.12 + venv
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install -y python3.12 python3.12-venv

# Корень проекта
cd /home/secondchain

# Установка зависимостей
./setup.sh

# Активация окружения
source venv/bin/activate

# Сборка и запуск контейнера T-one на Triton
./scripts/run_tone_triton.sh

Проверка: после старта Triton слушает gRPC (стандартно 8001) и HTTP (стандартно 8000). Потребление VRAM — 600–800 MB. Статус контейнера:

docker ps | grep -i tone

Шаблон:Note

2.4. LLM (Qwen3.5-35B-A3B на vLLM)

Шаблон:Note

docker run -d \
  --name vllm-qwen35-moe \
  --gpus all \
  --ipc=host \
  -v ~/vllm-cache:/root/.cache \
  -p 16080:8000 \
  vllm/vllm-openai:cu130-nightly \
  --model Qwen/Qwen3.5-35B-A3B-GPTQ-Int4 \
  --served-model-name qwen35-35b-a3b \
  --quantization moe_wna16 \
  --max-num-seqs 6 \
  --max-model-len 8192 \
  --kv-cache-memory 3221225472 \
  --gpu-memory-utilization 0.50 \
  --enable-prefix-caching \
  --host 0.0.0.0 --port 8000 \
  --reasoning-parser qwen3 \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_coder \
  --language-model-only

Ключевые параметры:

  • --max-model-len 8192 — максимальное окно контекста в токенах.
  • --max-num-seqs 6 — максимум одновременно обрабатываемых запросов.
  • --gpu-memory-utilization 0.50 — 50% VRAM выделено под LLM.
  • --kv-cache-memory 3221225472 — 3 GiB под KV-кэш.

Минимальный объём VRAM для запуска — 24 GB. Фактическое потребление — 24–48 GB в зависимости от числа допустимых сессий (--max-num-seqs) и длины контекста (--max-model-len).

Проверка: после загрузки весов проверить OpenAI-совместимый эндпоинт на порту 16080:

docker logs -f vllm-qwen35-moe        # ожидать "Application startup complete"

curl http://localhost:16080/v1/models

curl http://localhost:16080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen35-35b-a3b",
    "messages": [{"role": "user", "content": "Привет"}]
  }'

2.5. TTS (LightTTS + CosyVoice3)

Сборка двухфазная: на первой фазе интерактивно подготавливается образ с TRT-движком и весами с последующим коммитом, на второй — выполняется запуск в режиме демона.

Фаза 1 — подготовка образа

docker pull lighttts/light-tts:latest

docker run -it --gpus all -p 8080:8080 --shm-size 4g --name lighttts \
  -v ~/lighttts-models:/data \
  lighttts/light-tts:latest /bin/bash

Внутри контейнера:

git checkout main && git pull
pip install huggingface_hub

python -c "
from huggingface_hub import snapshot_download
snapshot_download('FunAudioLLM/Fun-CosyVoice3-0.5B-2512', local_dir='/data/Fun-CosyVoice3-0.5B')
"

# первый запуск собирает TRT-движок (float16)
python -m light_tts.server.api_server \
  --model_dir /data/Fun-CosyVoice3-0.5B \
  --data_type float16 \
  --load_trt True

exit

Фаза 2 — коммит и запуск в режиме демона

docker commit lighttts lighttts/light-tts:ready
docker rm lighttts

docker run -d --gpus all -p 8080:8080 --shm-size 4g \
  --restart unless-stopped \
  --name lighttts \
  -v ~/lighttts-models:/data \
  lighttts/light-tts:ready \
  python -m light_tts.server.api_server \
    --model_dir /data/Fun-CosyVoice3-0.5B \
    --data_type float16 \
    --load_trt True

Проверка: TTS слушает порт 8080, потребление VRAM — 11 GB:

docker ps | grep lighttts
docker logs -f lighttts          # ожидать готовности сервера

2.6. Итоговая карта портов

Сервис Контейнер Внешний порт
ASR (Triton HTTP) *tone* 8000
ASR (Triton gRPC) *tone* 8001
LLM (vLLM) vllm-qwen35-moe 16080
TTS (LightTTS) lighttts 8080

2.7. Финальная проверка стека

docker ps        # все три контейнера (ASR / vLLM / TTS) в статусе Up

После проверки выполняется подключение пайплайна PjSIP → VAD → ASR → LLM → TTS с указанием эндпоинтов в конфигурации: ASR — :8000/:8001, LLM — :16080, TTS — :8080.

Этап 3. Настройка .env

Шаблон:TODO

Базовые параметры:

EXTERNAL_TEMPLATES_URL=https://[адрес инстанса эры]/rest/v1/model/ai/robot
EXTERNAL_TEMPLATES_TOKEN=[локальный токен из шага 1.5]

А также настройки Postgres (из шага 1.2) и подключения SIP к учётной записи абонента (из шага 1.4).


Этап 4. Запуск контейнера и создание робота

4.1. Загрузка образа и запуск контейнера

Скопировать на сервер архив с образом контейнера и файл .env в одну директорию.

docker load -i secondchain-1.0.3a-cpu.tar.gz
mkdir -p ./logs
docker run -d --name secondchain \
  --network host \
  --env-file .env \
  --restart unless-stopped \
  -v secondchain-data:/data \
  -v ./logs:/app/logs \
  secondchain:1.0.3a-cpu

docker logs secondchain -f

Когда сервис загрузится и проинициализируется, в консоли появится сообщение:

Registration: OK (code=200)    [pjsip.account]
[info     ] SIP client registered successfully [voip.sip]
[info     ] VoIP health monitor started    [src.api.app]
[info     ] SecondChain started successfully [src.api.app]
[info     ] Application startup complete.  [uvicorn.error]
[info     ] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

Шаблон:Note

4.2. Создать робота в приложении ИИ

Загрузить голос

Необходим аудиофайл .mp3 или .wav длительностью ~10 секунд, без лишних шумов и эхо. При загрузке указать точную транскрипцию произнесённого текста (со знаками препинания).

Для быстрого старта можно импортировать демо-голос (импорт + загрузка файла).

Создать инструменты

Базовые инструменты работы со звонком.

drop_call

Параметр Значение
Имя drop_call
Код drop_call
description Завершение звонка по инициативе робота
toolType callManagement
callAction drop
enabled Да

transfer_call

Параметр Значение
Имя transfer_call
Код transfer_call
description Перевод звонка на оператора
toolType callManagement
callAction transfer
transferDestination Короткий номер для перевода звонков (например, номер очереди)
enabled Да

Создать робота

Импортировать шаблон (Роботы.json). На вкладке Инструкции изучить рекомендуемый шаблон системного промпта, а также промпта пост-обработки звонка.

4.3. Проверить создание пользователя

После создания робота должен автоматически создаться пользователь Робот_имяРобота.

4.4. Проверить и установить статус пользователя

Приложение Супервизор контакт-центра → раздел Операторы → Текущие статусы. Убрать фильтры, найти пользователя робота и убедиться, что у него установлен статус Готов. При необходимости установить этот статус.

4.5. Добавить робота в очередь

Приложение Администратор контакт-центра → добавить робота как участника очереди. Тип участника = Робот. В остальном настройки идентичны.

4.6. Осуществить звонок

Настройка завершена. Можно совершить звонок в очередь и протестировать работу робота.

Содержание