docs: сортировка History по темам (sonnet, opus, llm, sse, ux-frontend, upload, infra, plans, tests, base, code-fixes)
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
# v0.0.34 — вывод токенов и времени LLM — 2026-08-19
|
||||
|
||||
**Дата:** 2026-08-19
|
||||
**Версия:** 0.0.33 → 0.0.34
|
||||
|
||||
---
|
||||
|
||||
## Суть
|
||||
|
||||
Пользователь замечает, что обфускация долгая. Добавлен вывод в UI:
|
||||
- суммарных токенов LLM за прогон;
|
||||
- суммарного времени работы LLM за прогон.
|
||||
|
||||
Строка статуса после завершения: «✅ Обработано N файлов за Xс · LLM: Yс · Z токенов».
|
||||
|
||||
## Изменения
|
||||
|
||||
### `drhider/llm_client.py`
|
||||
- В `LLMClient.__init__` добавлены кумулятивные счётчики:
|
||||
- `tokens_prompt`, `tokens_completion`, `llm_sec` (float);
|
||||
- свойство `tokens_total = prompt + completion`.
|
||||
- В `complete()` после ответа:
|
||||
- `self.llm_sec += r.elapsed.total_seconds()` — реальное время HTTP-вызова;
|
||||
- `usage` (из `r.json()`) → `self.tokens_prompt` / `self.tokens_completion`
|
||||
(через `.get(..., 0)` — устойчиво к отсутствию `usage`).
|
||||
- Возврат `complete()` не изменён (по-прежнему `content`) — `scan_llm_ner` не трогали.
|
||||
|
||||
### `site/routes/api_bp.py`
|
||||
- В `worker()` после `obfuscate_files` в очередь `result` добавляется
|
||||
`stats = {tokens: llm.tokens_total, llm_sec: round(llm.llm_sec, 1)}`.
|
||||
- В `event: complete` данные: `{total, tokens, llm_sec}`.
|
||||
|
||||
### `site/templates/index.html`
|
||||
- В обработчике `complete`: если `d.llm_sec > 0` — добавляет
|
||||
«· LLM: {llm_sec}с» и, если `d.tokens > 0` — «· {tokens} токенов».
|
||||
|
||||
### `site/app.py`
|
||||
- `VERSION = "0.0.34"`.
|
||||
|
||||
## Проверка
|
||||
- `py_compile` + `node --check` — OK.
|
||||
- Накопление: 2 вызова → 240 prompt + 90 completion = 330 total, llm_sec = 6.0.
|
||||
- Устойчивость: ответ без `usage` → токены 0, время 1.0 — без падения.
|
||||
- SSE end-to-end: `complete` приходит с `{"total":1,"tokens":0,"llm_sec":0.0}`
|
||||
(локально без ключа LLM — 0; в кластере с ключом — ненулевые).
|
||||
@@ -0,0 +1,41 @@
|
||||
# v0.0.37 — крупный блок статистики LLM в UI — 2026-08-19
|
||||
|
||||
**Дата:** 2026-08-19
|
||||
**Версия:** 0.0.36 → 0.0.37
|
||||
**Файл:** `site/templates/index.html`, `site/app.py` (версия)
|
||||
|
||||
---
|
||||
|
||||
## Суть
|
||||
|
||||
Раньше статистика LLM («... LLM: 5.3с · 1894 токенов») была МЕЛКИМ текстом
|
||||
в статус-строке под кнопкой — юзер её не замечал. Теперь после обработки
|
||||
показывается **крупный заметный блок** «📊 Итоги обработки»:
|
||||
|
||||
| Показатель | Значение |
|
||||
|---|---|
|
||||
| Общее время | крупное число, с |
|
||||
| Время ИИ | крупное число, с |
|
||||
| Токены ИИ | крупное число |
|
||||
|
||||
Оформление: зелёная плашка (фон-градиент, рамка 2px), три белые карточки,
|
||||
значения шрифтом 24px жирным. Блок скрыт до завершения и при сбросе.
|
||||
|
||||
## Изменения (`index.html`)
|
||||
- CSS: `.stats-block`, `.stats-title`, `.stats-row`, `.stat-item`,
|
||||
`.stat-label`, `.stat-value`.
|
||||
- HTML: блок `#statsBlock` с `#stTotalTime`, `#stLlmTime`, `#stLlmTokens`
|
||||
(после кнопок скачивания).
|
||||
- JS:
|
||||
- `complete`-обработчик — заполняет и показывает блок (общее время всегда;
|
||||
время ИИ и токены — если `llm_sec > 0`, иначе «—»);
|
||||
- `resetAll` — скрывает блок.
|
||||
|
||||
## Проверка
|
||||
- `node --check` — OK.
|
||||
- Визуально через браузер: блок появился полноширинным, три карточки,
|
||||
значения крупно — заметно.
|
||||
- Версия `app.VERSION = 0.0.37`.
|
||||
|
||||
## Бэкенд
|
||||
- Не менялся (метрики `tokens`/`llm_sec` в `event: complete` уже есть с v0.0.34).
|
||||
@@ -0,0 +1,41 @@
|
||||
# 2026-08-20 — LLM обрабатывает ВСЕ данные (чанкинг) — v0.0.57
|
||||
|
||||
## Задача
|
||||
Пользователь: LLM должен обрабатывать ВСЕ данные, а не урезку 8000 символов.
|
||||
Ветка сохранения пре-LLM конфигурации: `save-pre-llm-v0.0.56` (указывает на прежний master).
|
||||
|
||||
## Изменения (drhider/scanner.py)
|
||||
`scan_llm_ner` переписан:
|
||||
- Убраны глобальные урезки `t[:3000]` и `combined[:8000]`.
|
||||
- Каждый файл обрабатывается ПОЛНОСТЬЮ: split_into_chunks(6000, overlap 500).
|
||||
- Чанки файла — параллельно (ThreadPoolExecutor, concurrency 4), крупные файлы вперёд.
|
||||
- Для каждого чанка — полный промпт + «Already captured by regex» (mapping).
|
||||
- Дедуп найденного через normalize_entity (пробелы/регистр/кавычки/тире/ё).
|
||||
- Верификация _verify_entity против ПОЛНОГО текста файла — отсекает галлюцинации LLM.
|
||||
- regex-найденное не дублируется.
|
||||
|
||||
Новые хелперы (scanner.py):
|
||||
- split_into_chunks(text, size=6000, overlap=500) — границы \n\n,\n,. ,? ,! ,; ,, ," "
|
||||
- normalize_entity(s) — канонизация для дедупа
|
||||
- _verify_entity(value, full_text) — точное/нормализованное вхождение
|
||||
- _build_llm_prompt(text, already_found)
|
||||
- _call_llm(text, llm_client) — вызов + разбор JSON (пусто при ошибке)
|
||||
|
||||
Параметры верхнего уровня (легко тюнить):
|
||||
- _CHUNK_SIZE = 6000, _CHUNK_OVERLAP = 500, _LLM_CONCURRENCY = 4
|
||||
|
||||
## Ожидаемый эффект
|
||||
- LLM покрывает все файлы целиком (в т.ч. хвосты и таблицы после 3000 символа).
|
||||
- Время на ~300 файлов ≈ 3.5 мин при 4 потоках (~390 вызовов).
|
||||
- Меньше галлюцинаций (верификация).
|
||||
|
||||
## Проверка
|
||||
- py_compile OK.
|
||||
- test_scanner 20/20.
|
||||
- Юнит хелперов: split (12К→4 чанка ≤6100), verify (галлюцинация→False), normalize OK.
|
||||
- Все 106 тестов OK.
|
||||
- VERSION 0.0.57.
|
||||
|
||||
## Примечание
|
||||
Реальная проверка LLM-покрытия и времени — на наборе T/ при прогоне на проде/локально
|
||||
с ключом LLM (локально ключ отсутствует → LLM не выполняется, только regex).
|
||||
Reference in New Issue
Block a user