diff --git a/site/routes/llm.py b/site/routes/llm.py index 48d3a3b..ed44645 100644 --- a/site/routes/llm.py +++ b/site/routes/llm.py @@ -88,23 +88,32 @@ def process(cid): extracted[s["supp_id"]] = rows yield f"data: {_json.dumps({'type': 'extract_done', 'name': s['filename'], 'time_s': elapsed, 'count': len(rows), 'unresolved': unresolved})}\n\n" - # ── Шаг 2: Сравнение допников ──────────────────────── + # ── Шаг 2: Сравнение ──────────────────────────────── yield f"data: {_json.dumps({'type': 'diff_start', 'files': len(supp_rows)})}\n\n" - # Группируем: initial + amendments + # Группируем: ищем amendments, если нет — сравниваем первый с остальными initial_rows = None amendments = [] for s in supp_rows: - if s["type"] == "initial": - initial_rows = extracted.get(s["supp_id"], []) - else: + if s["type"] != "initial": amendments.append({ "supp_id": s["supp_id"], "filename": s["filename"], "type": s["type"], "rows": extracted.get(s["supp_id"], []), }) + elif initial_rows is None: + # Первый initial — базовый + initial_rows = extracted.get(s["supp_id"], []) + else: + # Последующие initial — как допники (fallback) + amendments.append({ + "supp_id": s["supp_id"], + "filename": s["filename"], + "type": "initial", + "rows": extracted.get(s["supp_id"], []), + }) all_changes = [] diff --git a/site/templates/llm.html b/site/templates/llm.html index e075a43..6ea1d3e 100644 --- a/site/templates/llm.html +++ b/site/templates/llm.html @@ -448,6 +448,12 @@ diffBody.innerHTML = '⏳ LLM-извлечение строк спецификации...'; var es = new EventSource('/llm/process/' + contractId); + var llmStart = Date.now(); + + var timerInterval = setInterval(function() { + var elapsed = ((Date.now() - llmStart) / 1000).toFixed(1); + diffStatus.textContent = '⏳ ' + elapsed + 'с'; + }, 200); es.onmessage = function(e) { var d = JSON.parse(e.data); @@ -473,6 +479,7 @@ diffBody.innerHTML += '
' + d.name + ': +' + (s.added||0) + ' ~' + (s.changed||0) + ' -' + (s.deleted||0) + '
'; } else if (d.type === 'done') { + clearInterval(timerInterval); es.close(); llmBtn.innerHTML = ' ✓ Готово'; lucide.createIcons(); @@ -505,6 +512,7 @@ }; es.addEventListener('error', function() { + clearInterval(timerInterval); es.close(); llmBtn.innerHTML = ' Сравнить (LLM)'; llmBtn.disabled = false;