# Сессия 11 — process.cfm: один запрос вместо N+1 Дата: 2026-06-19 ## Проблема Сравнение на Lucee занимало 264.6с. Причина: 1. **Браузер делал N+1 HTTP-запросов** — по одному `fetch('/extractor.cfm')` на каждый допник + отдельный `fetch('/differ.cfm')`. Каждый экстрактор вызывал `cfhttp timeout=120` к LLM. 2. **Не было проверки на уже извлечённые** — каждый запуск заново гонял LLM для всех допников. 3. **Не было DELETE перед INSERT** — плодились дубликаты. 4. **DEFAULT_PROMPT различался** — в Python `{{` (двойные скобки), в Lucee `{` (одинарные). ## Решение ### process.cfm (новый) Один эндпоинт, аналог Python `/llm/process/`: - `GET /process.cfm?contract_id=X` - Сервер внутри обходит все допники: - Проверяет `spec_rows` → если есть, skip - textify → LLM → parse → DELETE + INSERT - Затем differ на свежих данных - `requesttimeout=600` - Все ключи JSON в UPPERCASE (как ждёт JS) ### index.cfm (JS) Вместо: ```javascript for (supplements) { await fetch('/extractor.cfm?...'); } await fetch('/differ.cfm?...'); ``` Стало: ```javascript await fetch('/process.cfm?contract_id=...'); // один ответ: {OK, EXTRACTED, ALL_CHANGES} ``` ### extractor.cfm DEFAULT_PROMPT: `{{"rows":[...]}}` вместо `{"rows":[...]}` — как в Python. ## Версия v1.0.47 → v1.0.49 ## Деплой git push origin master → Lucee k8s