каркас: домен, генерация типов фронта, стенд и карточки задач
Контракт в коде: КИО по нормативу, 43 события WS по шести союзам направлений,
таймеры ГОСТ, таксономия E1–E6, шесть компетенций радара. make types гоняет
их через JSON Schema в generated.ts, тест ловит забытую регенерацию.
Стенд: docker compose postgres + backend, health отвечает, база досягаема
из контейнера бэкенда. Makefile не врёт — нереализованные цели падают
и называют карточку, которая их закроет.
frontend/.npmrc: под WSL2 npm install зависает на дефолтных 15 сокетах.
2026-09-15 19:35:03 +03:00
|
|
|
|
[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",
|
lct-07 (без LLM): слот-автомат, персона, звонящий на заготовках, make repl
Звонящий не выдаёт данные сам: автомат держит раскрытые факты явно и
отдаёт звонящему только их. Тест прогоняет длинную серию реплик и
проверяет, что ни один нераскрытый факт не прозвучал.
Главная находка — матчинг по порогу близости не работает. На
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 с кэшем.
2026-09-17 13:57:43 +03:00
|
|
|
|
# Эмбеддинги для слот-автомата: матчинг вопроса к чек-листу. Нужны ядру,
|
|
|
|
|
|
# а не только голосу, поэтому не в группе voice.
|
|
|
|
|
|
"onnxruntime>=1.18",
|
|
|
|
|
|
"tokenizers>=0.19",
|
|
|
|
|
|
"numpy>=1.26",
|
каркас: домен, генерация типов фронта, стенд и карточки задач
Контракт в коде: КИО по нормативу, 43 события WS по шести союзам направлений,
таймеры ГОСТ, таксономия E1–E6, шесть компетенций радара. make types гоняет
их через JSON Schema в generated.ts, тест ловит забытую регенерацию.
Стенд: docker compose postgres + backend, health отвечает, база досягаема
из контейнера бэкенда. Makefile не врёт — нереализованные цели падают
и называют карточку, которая их закроет.
frontend/.npmrc: под WSL2 npm install зависает на дефолтных 15 сокетах.
2026-09-15 19:35:03 +03:00
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
[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"
|