Что можно сказать, решает слот-автомат, а не модель: в промпт попадают только раскрытые факты. Иначе LLM услужливо назовёт адрес, которого не спрашивали. Промпты лежат файлами — их правит тот, кто ведёт занятия. Отказ провайдера не роняет занятие: звонящий откатывается на заготовки. Молчащий звонящий хуже шаблонной фразы. Офлайн — таблица, а не локальная модель. Ветвление уже делает слот-автомат, поэтому таблица индексируется парой «событие × настроение» и выходит небольшой: для пожарного сценария 62 реплики, около 36 секунд генерации. Формулировки в ней от облачной модели, а задержка на занятии нулевая — локальная 3–4B дала бы формулировки хуже и за 2.5 секунды. Найдено на бесплатной модели OpenRouter: рассуждающие модели тратят сотни токенов на размышление и при малом бюджете возвращают пустой content с finish_reason=length. Пустой ответ теперь честный отказ, бюджет токенов поднят, рассуждение из ответа исключается. Живые запросы к LLM вынесены из общего прогона: они требуют сети, а рассуждающая модель отвечает десятками секунд.
15 lines
765 B
Python
15 lines
765 B
Python
import sys
|
||
from pathlib import Path
|
||
|
||
sys.path.insert(0, str(Path(__file__).parent))
|
||
|
||
# Голосовой контур грузит модели ~5 секунд на каждый старт приложения.
|
||
# Тесты каналов проверяют протокол, а не голос; голос — в test_voice_pipeline.py.
|
||
import os
|
||
|
||
os.environ.setdefault("VOICE_ENABLED", "false")
|
||
|
||
# И в сеть они не ходят: звонящий отвечает заготовками, иначе каждый тест
|
||
# ждал бы ответа провайдера и зависел от его настроения.
|
||
# Живые проверки LLM — в test_llm.py, он читает backend/.env.test.
|
||
os.environ.setdefault("LLM_API_KEY", "")
|