Звонящий не выдаёт данные сам: автомат держит раскрытые факты явно и отдаёт звонящему только их. Тест прогоняет длинную серию реплик и проверяет, что ни один нераскрытый факт не прозвучал. Главная находка — матчинг по порогу близости не работает. На multilingual-e5-small настоящие вопросы дают 0.79–0.95, а «Оставайтесь на линии» — до 0.89: диапазоны перекрываются, и любой порог либо выдаёт адрес на «успокойтесь», либо не слышит «где вы находитесь?». Решение — сравнение с ближайшим соседом: у пункта чек-листа несколько формулировок (examples), рядом общий список не-вопросов (checklists/common.yaml), и реплика засчитывается пункту, только если она ближе к нему, чем к любому не-вопросу. На отложенных фразах: 19 из 20 вопросов, 0 из 8 ложных срабатываний. Реплика режется только по границам предложений, со знаком: «?» для e5 — сильный признак вопроса, без него «Куда ехать» уходит к не-вопросам. Подсказка берёт неотработанный пункт из автомата. В живой сессии автомат начнёт слышать оператора, когда голосовой контур передаст ему stt.final. Ждёт ключа LLM: условие approach у скрытых фактов, звонящий своими словами, dialog/llm.py с кэшем.
43 lines
1.1 KiB
TOML
43 lines
1.1 KiB
TOML
[project]
|
||
name = "lct-backend"
|
||
version = "0.1.0"
|
||
description = "Учебный симулятор занятия для системы 112 — бэкенд"
|
||
requires-python = ">=3.11,<3.12"
|
||
dependencies = [
|
||
"fastapi>=0.115",
|
||
"uvicorn[standard]>=0.30",
|
||
"pydantic>=2.7",
|
||
"pydantic-settings>=2.3",
|
||
"sqlalchemy[asyncio]>=2.0",
|
||
"alembic>=1.13",
|
||
"asyncpg>=0.29",
|
||
"httpx>=0.27",
|
||
"pyyaml>=6.0",
|
||
"structlog>=24.1",
|
||
# Эмбеддинги для слот-автомата: матчинг вопроса к чек-листу. Нужны ядру,
|
||
# а не только голосу, поэтому не в группе voice.
|
||
"onnxruntime>=1.18",
|
||
"tokenizers>=0.19",
|
||
"numpy>=1.26",
|
||
]
|
||
|
||
[project.optional-dependencies]
|
||
# Тяжёлый слой моделей — ставится отдельно: uv sync --extra voice
|
||
voice = [
|
||
"onnx-asr>=0.6",
|
||
"torch>=2.2",
|
||
]
|
||
dev = [
|
||
"pytest>=8.2",
|
||
"pytest-asyncio>=0.23",
|
||
]
|
||
|
||
[build-system]
|
||
requires = ["hatchling"]
|
||
build-backend = "hatchling.build"
|
||
|
||
[tool.hatch.build.targets.wheel]
|
||
packages = ["app"]
|
||
|
||
[tool.pytest.ini_options]
|
||
asyncio_mode = "auto"
|