From eadd22bdc1f8a70f5131e59e7ac45149bce67e7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Fri, 19 Jun 2026 08:48:11 +0400 Subject: [PATCH] =?UTF-8?q?process.cfm:=20=D0=BE=D0=B4=D0=B8=D0=BD=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=20=D0=B2=D0=BC=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=BE=20N+1,=20skip=20already=20extracted,=20DELETE=20be?= =?UTF-8?q?fore=20INSERT,=20prompt=20fix=20(v1.0.49)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- History/session-11-process-cfm.md | 52 +++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 History/session-11-process-cfm.md diff --git a/History/session-11-process-cfm.md b/History/session-11-process-cfm.md new file mode 100644 index 0000000..62ae44a --- /dev/null +++ b/History/session-11-process-cfm.md @@ -0,0 +1,52 @@ +# Сессия 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