56 lines
3.2 KiB
Markdown
56 lines
3.2 KiB
Markdown
# 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).
|