# Архитектура contracts-flask ## Компоненты ``` Браузер │ ▼ check.kube5s.ru (nginx) │ ├── /, /static/*, /templates/* │ → Managed Flask (contractor.pythonk8s.services.ngcloud.ru) │ Отдаёт HTML + JS. JS в браузере делает API-запросы. │ └── /api/*, /upload, /llm-ops, /process-v2, /convert-doc, /unzip-upload → ВМ :8777 (convert_server.py) Python http.server → PostgreSQL (contracts_check) → LLM (api.aillm.ru, gpt-oss-120b) ``` ## Пайплайн ``` 1. Загрузка JS (FormData) → /upload → parse.py (pdfplumber/python-docx) → elements_json → documents (БД) 2. Классификация JS → /api/classify-batch → classify.py (LLM) → doc_type, own_number, parent_number, counterparty, doc_date 3. Группировка JS → /api/groups → grouping.py (детерминированная) → группы по контрактам (нормализация номеров) 4. Сравнение JS → /process-v2 (SSE) → process.py → llm.py (LLM) → ops (ADD/UPDATE/DELETE/UNRESOLVED) → spec_events + spec_current (event sourcing) 5. Чат JS → /chat → Flask → /api/spec-current (ВМ) → контекст строк → LLM → ответ ``` ## Вход/Выход | Этап | Вход | Выход | |------|------|-------| | Загрузка | .docx/.pdf/.doc/.zip (FormData) | elements_json в БД | | Классификация | elements_json | doc_type, номер, дата, контрагент | | Группировка | classified documents | группы по contract_number | | Сравнение | группа документов + spec_current | ops: ADD/UPDATE/DELETE/UNRESOLVED | | Чат | вопрос + spec_current | текст ответа | ## БД - PostgreSQL `contracts_check` (изолирована от прода `baza`) - Таблицы: documents, contracts, supplements, spec_current, spec_events, prompts, upload_chunks ## LLM - gpt-oss-120b через api.aillm.ru (бесплатно) - Используется: классификация, извлечение, сравнение, чат ## Изоляция от прода | | Lucee (прод) | Flask (тест) | |---|---|---| | Домен | contracts.kube5s.ru | check.kube5s.ru | | ВМ порт | 8766 | 8777 | | БД | baza | contracts_check | | Код ВМ | ~/contracts/ | ~/contracts-check/ | | Репо ВМ | contractor/deploy/ | contracts-flask/deploy/ |