# 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).