Files
drhider/History/sonnet/2026-08-20-sonnet-query-review-speed.md
T

5.2 KiB
Raw Blame History

Промпт для Sonnet — код-ревью drhider (скорость + сбои)

Роль

Ты — ревьюер кода. Отвечай ТОЛЬКО по делу: короткие технические тезисы. Без воды, без лирики, без «как было бы здорово», без общих фраз. Каждый тезис — конкретика: файл, функция, строка, суть.

Ограничение: смотреть ТОЛЬКО эти файлы, нигде больше не рыться

  • drhider/obfuscator.py — двухпроходный обфускатор (проход 1: извлечение текста + regex + LLM NER; проход 2: замена)
  • drhider/extractor.py — pdf_to_markdown (pdfplumber), doc_to_markdown (сервис liberta), expand_zips (рекурсия zip, CP437→CP866), защита от zip-бомб
  • drhider/scanner.py — scan_regex, scan_llm_ner
  • drhider/replacer.py — apply_replacements (один regex из всех ключей)
  • drhider/llm_client.py — OpenAI-совместимый клиент, счётчики токенов/времени
  • drhider/builder.py — build_zip, build_mapping_csv
  • site/routes/api_bp.py — upload, process_stream (SSE + воркер в потоке), download/csv
  • site/app.py — create_app, лимиты, setup_logging (LOG_LEVEL/LOG_FILE)
  • site/session.py — хранение сессий в памяти, TTL 30 мин, MAX_SESSION_BYTES
  • site/templates/index.html — фронт: нативный unzip, таблица, SSE-прогресс, таймеры, лимиты 100МБ/1ГБ

Не читай README, docs, History, tests, Dockerfile, ничего про деплой.

Контекст: сбои, которые были (объясни каждый, если увидишь первопричину в коде)

  1. «SSE connection failed» при живом воркере. Выяснено: воркер падал на битом PDF — PDFSyntaxError('No /Root object!') в extract_text не был обёрнут по-файлово; после фикса (skip битого файла) SSE доходит до complete. Подтверди/опровергни по коду, есть ли ещё места, где одна ошибка файла роняет весь проход.
  2. Кракозябры кириллицы в именах zip. Причина: Info-ZIP пишет UTF-8 без флага 0x800 → декодер encode(cp437).decode(cp866) ломает. Проверь _decode_name в extractor.py: покрывает ли оба реальных сценария (CP866 без флага и UTF-8 с флагом), есть ли дыры.
  3. HTTP 413 при загрузке. Лимиты: MAX_CONTENT_LENGTH=200MB (запрос), MAX_SESSION_BYTES=500MB (сессия). Фронт пускает до 100МБ/файл и 1ГБ/сумма — рассинхрон фронт/бэк. Отметь.

Главная задача: предложи БОЛЕЕ БЫСТРУЮ логику обработки

Известные факты производительности (факты, не догадки):

  • pdfplumber на скане Spartan10Manual.pdf 14.8 МБ — 70–470 секунд на извлечение текста.
  • Большой PDF 19 МБ — ~2526 с на extract_text.
  • LLM NER — один общий вызов на все файлы, ~1.8с на маленьком наборе, зависит от числа токенов.
  • apply_replacements оптимизирован (один regex), но проверить, нет ли лишней работы.

Что хочешь от тебя:

  • Где реальные узкие места в коде (не «вообще», а конкретные функции/строки).
  • Конкретные предложения ускорения: что менять, как, ожидаемый эффект. Без «использовать PyMuPDF» — уже пробовали, теряет таблицы (94 vs 40), ТАБЛИЦЫ КРИТИЧНЫ. Учитывай это ограничение.
  • Можно ли ускорить без смены pdfplumber (параллельность страниц, кэши, ограничение повторных парсингов, предобработка)?
  • Есть ли дублирующая работа между проходами 1 и 2 (например, повторный парсинг/чтение)?
  • Безопасно ли распараллелить извлечение текста по файлам (потоки/GIL)? Если да — как.

Формат ответа

  • Секция «Сбои»: по каждому — подтверждение/опровержение по коду + где именно.
  • Секция «Узкие места»: список файл:строка + суть + почему.
  • Секция «Предложения ускорения»: пронумерованный список, каждый пункт: что/где/как/эффект/риски.
  • Секция «Итог»: 3–5 самых важных действий по приоритету.
  • Максимум — сухо, без воды.