Files
AR 15 M4 4aac59313d feat(sprint8.5+8.6): чанкер v2 (иерархия H1/H2/H3) + регрессия 4 веток в UI
Sprint 8.5 — чанкер v2 (services/document_processor.py):
- markdown-it-py для md-входа: каждый H2 открывает свою секцию, H3 идёт в тело
- множественные H1 — штатный кейс (new_booking.md = 8 H1, шаги воронки + группы);
  H1 без H2 → секция heading=H1; преамбула H1 (тело до первого H2) игнорируется
- YAML frontmatter (--- ... ---) отрезается, в индекс не попадает
- breadcrumb «## {H2}» как первая строка каждого subchunk'а
- merge коротких хвостов и sentence-overlap — только внутри одной H2-секции
- excluded_section_headings в config.py
- 17 unit-тестов на stdlib unittest (tests/test_document_processor_v2.py),
  включая smoke по реальным general_info.md (тимпанометрия → правильная секция)
  и new_booking.md (защита от регрессии множественных H1)
- ТЗ: docs/CHUNKER_v2_TZ.md

Sprint 8.6 — регрессия остальных 4 веток (static/regression.html):
- 4 опции в селекторе режима: branch:price_question (40 кейсов),
  branch:medical_question (29), branch:escalate_human (14), branch:reschedule (16)
- бэкенд из 8b уже параметрический — правок в сервисе не потребовалось
- new_booking вне скоупа — state-machine, под него отдельный 8c (multi-turn)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 09:59:12 +05:00

23 lines
685 B
Python

from pydantic_settings import BaseSettings
class Settings(BaseSettings):
chroma_persist_dir: str = "./data/chroma"
sqlite_path: str = "./data/sqlite/app.db"
database_url: str = "sqlite+aiosqlite:///./data/sqlite/app.db"
embedding_model: str = "intfloat/multilingual-e5-large"
deepseek_api_key: str = ""
deepseek_model: str = "deepseek-chat"
deepseek_base_url: str = "https://api.deepseek.com"
log_level: str = "info"
max_chunk_size: int = 1200
min_chunk_size: int = 200
overlap_sentences: int = 2
excluded_section_headings: list[str] = []
model_config = {"env_file": ".env", "env_file_encoding": "utf-8"}
settings = Settings()