diff --git a/History/2026-08-27-classify-stuck-at-68.md b/History/2026-08-27-classify-stuck-at-68.md new file mode 100644 index 0000000..5480862 --- /dev/null +++ b/History/2026-08-27-classify-stuck-at-68.md @@ -0,0 +1,57 @@ +# Классификация застряла на 68/84: диагностика 2026-08-27 + +## Наблюдение + +На экране классификация остаётся на `68/84`, хотя контейнер продолжает работать. +Проверка через ВМ: + +```text +GET /api/batch-progress?batch=acbdffe5-e3ec-43f4-ab61-84861cac35bd +{"counts":{"classified":68,"garbage":16},"ok":true,"total":84} +``` + +Повторный запрос вернул то же значение. Kubernetes показывает pod +`pythonk8s-574b5cf9b4-z4wxz` в состоянии `Running`, `Ready 1/1`, `RESTARTS 0`. +Событий Kubernetes нет. На ВМ `contracts.service` активен, `convert_server.py` +запущен в одном экземпляре. + +## Причина в коде + +`site/routes/api_bp.py` возвращает раздельные счётчики `classified`, `failed` и +`garbage`, а `total` равен числу всех документов батча. + +`site/static/app.js` в `runClassify()` считает завершённые документы так: + +```javascript +var done = (d.counts.classified || 0) + (d.counts.failed || 0); +``` + +`garbage` в эту сумму не включён. Для текущего батча: + +```text +done = 68 classified + 0 failed = 68 +total = 84 +garbage = 16 +фактически завершено = 68 + 0 + 16 = 84 +``` + +Поэтому условие `done >= total` никогда не выполняется, polling не +останавливается, а кнопка остаётся на `68/84`. Это ошибка фронтендового +подсчёта прогресса, а не зависание Kubernetes или LLM на 68-м файле. + +## Исправление + +В `site/static/app.js` к числу завершённых документов добавлен конечный статус +`garbage`: + +```javascript +var done = (d.counts.classified || 0) + + (d.counts.failed || 0) + + (d.counts.garbage || 0); +``` + +Версия приложения повышена с `2.0.17` до `2.0.18`; cache-buster статических +скриптов обновлён в `site/templates/index.html`. + +Kubernetes проверялся только командами чтения через ВМ: +`kubectl get`, `kubectl describe`, `kubectl top`, `kubectl logs`. diff --git a/site/config.py b/site/config.py index 3e2252d..56b0395 100644 --- a/site/config.py +++ b/site/config.py @@ -1,7 +1,7 @@ """Конфигурация приложения — все настройки в одном месте.""" import os -VERSION = "2.0.17" +VERSION = "2.0.18" LLM_URL = os.getenv("LLM_API_URL", "https://api.aillm.ru/v1/chat/completions") LLM_KEY = os.getenv("LLM_API_KEY", "") diff --git a/site/static/app.js b/site/static/app.js index 4a4ce3a..f392a48 100644 --- a/site/static/app.js +++ b/site/static/app.js @@ -163,7 +163,9 @@ async function runClassify() { var r = await fetch(VM_API + '/api/batch-progress?batch=' + state.batchId); var d = await r.json(); if (d.ok && d.counts) { - var done = (d.counts.classified || 0) + (d.counts.failed || 0); + var done = (d.counts.classified || 0) + + (d.counts.failed || 0) + + (d.counts.garbage || 0); var total = d.total || 0; if (total > 0) totalFiles = total; btn.innerHTML = ' Классификация... ' + done + '/' + total + ' (' + Math.round((Date.now() - start) / 1000) + 'с)'; diff --git a/site/templates/index.html b/site/templates/index.html index c6738d7..a8af2d5 100644 --- a/site/templates/index.html +++ b/site/templates/index.html @@ -73,7 +73,7 @@