Fix classification progress for garbage documents
Deploy contracts-flask / validate (push) Canceled after 0s
Deploy contracts-flask / validate (push) Canceled after 0s
This commit is contained in:
@@ -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`.
|
||||
+1
-1
@@ -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", "")
|
||||
|
||||
+3
-1
@@ -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 = '<span class="spinner"></span> Классификация... ' + done + '/' + total + ' (' + Math.round((Date.now() - start) / 1000) + 'с)';
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
<body>
|
||||
<div class="topbar">
|
||||
<img src="/static/logo.svg" alt="Nubes">
|
||||
<span class="title">Сверка договоров — LLM AI-driven Event Sourcing <span style="font-weight:400;color:var(--muted);font-size:12px;">v2.0.17</span></span>
|
||||
<span class="title">Сверка договоров — LLM AI-driven Event Sourcing <span style="font-weight:400;color:var(--muted);font-size:12px;">v2.0.18</span></span>
|
||||
<div id="pipelineStepper" style="display:flex;gap:8px;font-size:11px;align-items:center;color:var(--muted);">
|
||||
<span id="stepUpload">○ Загрузка</span><span>→</span>
|
||||
<span id="stepClassify">○ Классификация</span><span>→</span>
|
||||
@@ -224,11 +224,11 @@
|
||||
import { listZipFiles } from '/upload/zip/list_zip_files.js';
|
||||
window.listZipFiles = listZipFiles;
|
||||
</script>
|
||||
<script src="/static/state.js?v=2.0.17"></script>
|
||||
<script src="/static/app_utils.js?v=2.0.17"></script>
|
||||
<script src="/static/files.js?v=2.0.17"></script>
|
||||
<script src="/static/groups.js?v=2.0.17"></script>
|
||||
<script src="/static/compare.js?v=2.0.17"></script>
|
||||
<script src="/static/app.js?v=2.0.17"></script>
|
||||
<script src="/static/state.js?v=2.0.18"></script>
|
||||
<script src="/static/app_utils.js?v=2.0.18"></script>
|
||||
<script src="/static/files.js?v=2.0.18"></script>
|
||||
<script src="/static/groups.js?v=2.0.18"></script>
|
||||
<script src="/static/compare.js?v=2.0.18"></script>
|
||||
<script src="/static/app.js?v=2.0.18"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user