каркас: домен, генерация типов фронта, стенд и карточки задач
Контракт в коде: КИО по нормативу, 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
|
|
|
"""Настройки. Нормативы ГОСТ — в миллисекундах и из конфига, не из кода."""
|
|
|
|
|
|
|
|
|
|
from functools import lru_cache
|
|
|
|
|
|
2026-09-17 13:43:15 +03:00
|
|
|
from pydantic import AliasChoices, Field
|
каркас: домен, генерация типов фронта, стенд и карточки задач
Контракт в коде: КИО по нормативу, 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
|
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
|
|
|
|
|
|
|
from app.domain.timers import NORMATIVES, TimerCode
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
|
|
|
model_config = SettingsConfigDict(env_file=".env", extra="ignore")
|
|
|
|
|
|
|
|
|
|
# Данные
|
|
|
|
|
database_url: str = "postgresql+asyncpg://lct:lct@localhost:5432/lct"
|
|
|
|
|
|
|
|
|
|
# Голосовой контур
|
|
|
|
|
models_dir: str = "models"
|
|
|
|
|
stt_model: str = "gigaam-v3-rnnt"
|
|
|
|
|
endpointing_ms: int = 600
|
|
|
|
|
mic_sample_rate: int = 16_000
|
|
|
|
|
tts_sample_rate: int = 24_000
|
|
|
|
|
offline: bool = False
|
|
|
|
|
|
|
|
|
|
# LLM. Провайдер меняется значением, не кодом (docs/arch/STACK.md).
|
2026-09-17 13:43:15 +03:00
|
|
|
# Имена COMPAT_MODEL_* принимаются тоже — так их выставляет командный сниппет.
|
|
|
|
|
llm_provider: str = "openai_compatible"
|
|
|
|
|
llm_base_url: str = Field(
|
|
|
|
|
default="", validation_alias=AliasChoices("llm_base_url", "compat_model_url")
|
|
|
|
|
)
|
|
|
|
|
llm_api_key: str = Field(
|
|
|
|
|
default="", validation_alias=AliasChoices("llm_api_key", "compat_model_api_key"),
|
|
|
|
|
repr=False,
|
|
|
|
|
)
|
|
|
|
|
llm_model_caller: str = Field(
|
|
|
|
|
default="", validation_alias=AliasChoices("llm_model_caller", "compat_model_name")
|
|
|
|
|
)
|
|
|
|
|
llm_model_judge: str = Field(
|
|
|
|
|
default="", validation_alias=AliasChoices("llm_model_judge", "compat_model_name")
|
|
|
|
|
)
|
каркас: домен, генерация типов фронта, стенд и карточки задач
Контракт в коде: КИО по нормативу, 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
|
|
|
judge_temperature: float = 0.0
|
|
|
|
|
|
|
|
|
|
# Нормативы: переопределяют значения по умолчанию из domain/timers.py
|
|
|
|
|
timer_limits_ms: dict[TimerCode, int] = {}
|
|
|
|
|
|
|
|
|
|
def limit_ms(self, code: TimerCode) -> int:
|
|
|
|
|
return self.timer_limits_ms.get(code, NORMATIVES[code].limit_ms)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@lru_cache
|
|
|
|
|
def get_settings() -> Settings:
|
|
|
|
|
return Settings()
|