Install
openclaw skills install @iirtegova/pdf-rezumeОдностраничное резюме PDF-отчёта для руководителя (A4, ключевые выводы и вопросы для обсуждения). Русские и английские PDF с текстом; сканы — на латинице (встроенный OCR без сети). Каждое число сверяется с текстом страницы автоматически.
openclaw skills install @iirtegova/pdf-rezumeНавык превращает PDF-отчёт в одну страницу A4 в фиксированном оформлении: шапка, заголовок,
преамбула, ключевые выводы, вопросы для обсуждения, источник. Результат — PDF; HTML-копия рядом
отдаётся только по прямой просьбе и только вторым файлом. Сканы читаются встроенным OCR
(pdf.py ocr, без сети): латиница — всегда, русские сканы — только с пакетом модели кириллицы;
русские PDF с текстовым слоем читаются без OCR.
Думаешь и пишешь ты; скрипты хранят прочитанное вне твоего контекста, сверяют каждое число с исходником, верстают страницу и говорят, что исправить. Не пропускай шаги и не пиши «из головы».
Если скрипты не запускаются (навык выключен, не прошёл ревью, нет зависимостей, неисправимая
ошибка) — не собирай резюме сам (ни HTML, ни PDF, ни другим инструментом): скажи, что навык не
работает, и приведи ошибку. Перевод документа делает навык pdf-perevod.
skill_exec(skill="pdf-rezume", script="pdf.py", args=["open", "/путь/к/файлу.pdf"])
args — список строк; JSON — одной строкой после --json (--file — только файл внутри папки
состояния навыка, путь есть в job_dir).ok: true — лишь «отработал»: смотри rejected, verdict,
errors, warnings и подсказку next. При ok: false — error и hint.complete: false / done: false — повтори вызов.job — из ответа pdf.py open; повторный open того же файла продолжает то же задание.Справка по командам (<job> — из ответа pdf.py open):
pdf.py open <путь> | ocr <job> [--pages 1-8] | pages <job> [--pages 1-8]
| render <job> --pages 3 [--dpi 110] | jobs
facts.py add <job> --json '<JSON-массив>' | skip <job> --pages 1,2
| list <job> [--relevance high,medium] [--offset N] | stats <job> | drop <job> --ids f003
summary.py schema [--density standard|compact]
| build <job> --json '<summary.json>' [--density compact --user-request '<слова>']
guide.py summary
Вне Ouroboros / ГигаАгента (OpenClaw и другие агенты без skill_exec): запускай скрипты
командой из папки навыка ({baseDir}), папку состояния задай переменной PDF_SKILL_STATE_DIR
(любая рабочая папка; без неё скрипты ничего не запишут):
PDF_SKILL_STATE_DIR="$HOME/pdf-skill-state" python3 {baseDir}/scripts/pdf.py open /путь/к/файлу.pdf
Зависимости один раз: pip install "pymupdf>=1.24.2" "rapidocr>=3.9,<4" "onnxruntime>=1.17,<2".
Результат — в <PDF_SKILL_STATE_DIR>/jobs/<job>/out/. В Ouroboros и ГигаАгенте — только skill_exec.
pdf.py open <путь>. page_kinds: text, mixed (текст + картинки с надписями),
scan, broken (испорченный текстовый слой), scan_text. При needs_ocr сразу
pdf.py ocr <job> до complete: true. Нет модели кириллицы, а скан русский — скажи, что эти
страницы прочитать нельзя.guide.py summary — один раз, до чтения.pdf.py pages <job> --pages 1-8, 9-16…; при next_pages продолжай с него.
Читай каждую страницу — выводы вне оглавления часто самые ценные.facts.py add <job> --json '[{"page": 3, "kind": "trend", "topic": "ИИ-агенты",
"claim": "40% крупных организаций масштабируют ИИ-агентов против 27% годом ранее.",
"numbers": ["40", "27"], "attribution": null,
"quote": "Forty percent of respondents from large organizations", "relevance": "high",
"why": "разрыв между крупными и малыми компаниями"}]'
kind: fact | trend | forecast | estimate | opinion | recommendation | term (термин — русская
расшифровка до 12 слов). Один факт — одна запись; приоритет: числа, динамика, сроки, доли,
прогнозы, причины, рекомендации. Числа — символ в символ, диапазон остаётся диапазоном; «на глаз»
с графика не извлекай; число подписано на графике, но не в тексте — "from_image": true.
Сгруппированные диаграммы коварны: проверь через pdf.py render <job> --pages N, если видишь
картинки, иначе бери числа из текста отчёта. Факт без его чисел на странице будет отклонён
(rejected) — исправь; номер страницы в колонтитуле числом не считается. После OCR бери числа
строго как в pdf.py pages (на mixed распознанный текст идёт в конце страницы).
Пустые страницы — facts.py skip <job> --pages 1,2; в конце facts.py stats <job>.facts.py list <job>, сгруппируй в 8–12 тем, отбери лучшее по канону,
напиши summary.json (summary.py schema). У каждого пункта — source_pages: числа сверяются
только с этими страницами (и соседними).summary.py build <job> --json '<summary.json>'.
verdict: "ready" — готово: outputs.pdf, имя <название>_summary.pdf в file_name. Если
лишними были считаные строки, скрипт сам убрал последний пункт (autofit.dropped) — ставь
важное первым и упомяни убранное одной строкой.verdict: "fix_required" — исправь все errors («вывод 1», «вопрос 2» — с единицы, в порядке
JSON) и собери снова. В outputs только черновики …_ЧЕРНОВИК.pdf/.html: не отдавай их и не
называй готовым резюме. Переполнение: fit.overflow_lines, fit.items, fit.cheapest_cuts
(убери чуть больше знаков, чем last_line_chars). Шрифт не меняется; --density compact
(10 pt) — только по прямой просьбе пользователя с его словами в --user-request. Доли и
кратности прописью тоже сверяются — переноси как в источнике, сам не выводи. Обоснование
вопроса — только факты документа.
Обычно хватает 2–3 сборок. После 5 (или если кончается бюджет) — отправь ЧЕРНОВИК-PDF как есть,
с пометкой, и прямо напиши, что не сошлось; HTML вместо PDF — никогда.ready outputs.pdf под именем file_name (см. «Как отправлять файл»).
Только PDF; HTML — вторым файлом и лишь по просьбе. В сообщении — одна-две фразы о документе и
оставшиеся warnings; текст резюме в чат не дублируй.Как отправлять файл. Новые версии платформы (Ouroboros / ГигаАгент 6.7+) не прикладывают файлы
из папки навыка («Не удалось безопасно подготовить вложение»). Скопируй PDF без изменений в папку
файлов пользователя — в ГигаАгенте /data/user/Deliverables/ (создай при необходимости) — и
отправляй копию (send_file). Если скопировать нельзя — отправляй напрямую.
| Ответ | Что делать |
|---|---|
Не установлена библиотека pymupdf | Зависимости ставятся после ревью: перезапусти ревью, включи навык |
Модуль распознавания недоступен | rapidocr/onnxruntime не встали — сканы не прочитать, скажи; обычные страницы работают |
| OCR: «модели кириллицы нет» | Русские сканы не читаются без пакета модели кириллицы (cyrillic_model в ответе ocr) |
Задание … не найдено | Сначала pdf.py open; список — pdf.py jobs |
PDF защищён паролем | Попроси версию без пароля |
| Факт отклонён: «чисел нет в тексте страницы» | Перепиши число как в источнике; с графика — "from_image": true |
| Резюме: «чисел … нет на указанных страницах» | Поправь source_pages или убери число |
eval/exec, динамических импортов и ключей
(env_from_settings пуст). Читается только OUROBOROS_SKILL_STATE_DIR (без неё скрипты
завершаются с ошибкой; вне Ouroboros — PDF_SKILL_STATE_DIR, если нет OUROBOROS_SKILL_NAME).
Устанавливается одна переменная — ORT_DISABLE_TELEMETRY=1 до импорта onnxruntime (иначе он
пишет и отправляет телеметрию); проверено strace: сети и записи вне папки состояния нет.fs: вне папок навыка читается только PDF по пути пользователя — после проверки (обычный файл,
≤ 300 МБ, %PDF, без пароля) он копируется в jobs/<job>/, оригинал не меняется.jobs/<job>/ папки состояния (<job> проверяется regex и resolve());
в папку навыка ничего не пишется (sys.dont_write_bytecode), из неё читаются только
references/summary_canon.md и assets/summary_template.html. --file — только JSON ≤ 5 МБ
внутри папки состояния.pymupdf ≥ 1.24.2, rapidocr (модели PP-OCRv6 внутри пакета, ничего не скачивается),
onnxruntime. Модель кириллицы берётся только из пакета pdf_rezume_ocr_cyrillic или
<папка состояния>/models/ и только со встроенным словарём. Шрифты — встроенные в PyMuPDF.SKILL.md; scripts/ — pdf.py, facts.py, summary.py, guide.py, модули _core.py, _ocr.py;
references/summary_canon.md (печатается через guide.py); assets/summary_template.html.