Files
drhider/History/ux-frontend/2026-08-19-live-timer-llm.md
T

3.2 KiB
Raw Blame History

v0.0.38 — живой таймер обработки + индикация ИИ — 2026-08-19

Дата: 2026-08-19 Версия: 0.0.37 → 0.0.38


Суть

Юзер должен видеть, что обработка идёт (не зависла), особенно пока LLM «переваривает» большой файл. Добавлены:

  • крупный live-блок «⏱ Обработка…» с тикающим таймером общего времени;
  • строка текущего файла с размером («Файл 3/5: имя (5.0 МБ)»);
  • индикация ИИ: «🤖 ИИ обрабатывает… Nс» (от реальных данных с бэка).

Итоговая формулировка времени стала ясной: «…общее Xс, из них ИИ Yс».

Изменения

drhider/llm_client.py

  • В __init__ добавлены llm_active (bool) и llm_started (float).
  • Метод llm_elapsed_now() — секунд с начала текущего LLM-вызова (0 если не активен).
  • complete(): ставит llm_active=True/llm_started=time.time() перед HTTP, сбрасывает llm_active=False в finally. import time добавлен.

site/routes/api_bp.py

  • В ветке except queue.Empty (пока воркер занят) — heartbeat-событие SSE: event: llm{active, elapsed, tokens} (раз в ~1с, timeout=1).

site/templates/index.html

  • CSS для .live-block, .live-title, .live-file, .live-timer (40px), .live-llm.
  • HTML: блок #liveBlock с #liveFile, #liveTimer, #liveLlm/#liveLlmTime; в итоговом блоке подпись «Время ИИ» → «Из них ИИ».
  • JS (фаза 2):
    • показ #liveBlock, интервал liveRefresh (200мс) — тикает #liveTimer;
    • обработчик start — в #liveFile имя текущего файла + размер из sf[idx];
    • обработчик llm — показывает/скрывает #liveLlm и обновляет #liveLlmTime;
    • complete/onerror/catch — скрыть #liveBlock, очистить интервалы;
    • итоговый текст: «общее Xс, из них ИИ Yс».
  • resetAll — скрывает #liveBlock.

site/app.py

  • VERSION = "0.0.38".

Проверка

  • node --check, py_compile — OK.
  • LLMClient: во время вызова llm_active=True, llm_elapsed_now()≈0.3с; после — False; накопление токенов и времени — ок.
  • SSE end-to-end: complete содержит {total, tokens, llm_sec}. Heartbeat llm генерируется в ветке except queue.Empty при долгой обработке (локально без LLM обработка мгновенная, поэтому heartbeat не успевает — в проде при долгой LLM-обработке будет слаться раз в сек).

Примечание

Бэкенд метрики не менял (только флаг/метод для live-таймера + heartbeat).