Загрузите PDF (с текстовым слоем) или скан JPG/PNG — на сервере сработает OCR (Tesseract), затем free-LLM выдаст структурированный JSON по схеме (Zod). Файлы нигде не сохраняются: в журнале остаётся только SHA-256 хэш и метаданные.
лимит файла: … MB
tesseract: …
модель: …
Тип:
Как это работает
Простая идея. Программа берёт текст из вашего файла (читает напрямую из PDF или распознаёт буквы на картинке), отдаёт его бесплатной нейросети и просит заполнить заранее придуманный шаблон — JSON с понятными полями. Перед тем как показать результат, код проверяет шаблон по строгой схеме: если хотя бы одно поле «не той формы», запрос автоматически переотправляется с подсказкой об ошибке. Файл при этом нигде не остаётся — он живёт только в памяти процесса несколько секунд.
- Браузер шлёт ваш файл на VPS обычной HTML-формой (multipart). На сервере он лежит в оперативной памяти, не пишется на диск.
- Если это PDF с текстовым слоем — текст берётся «как есть». Если это JPG/PNG — Tesseract.js на CPU распознаёт буквы (русский + английский).
- Текст вместе с компактным описанием схемы уходит free-LLM из OpenRouter в JSON-режиме — модель обязана вернуть один JSON-объект.
- Ответ парсится и валидируется библиотекой Zod. Если поле невалидное (например, не email) — один автоматический retry с подсказкой об ошибке. Если и тогда ошибка — fallback-модель.
- В журнал (audit.jsonl) пишется только SHA-256 файла, MIME, размер, время каждой стадии и id запроса — никакого содержимого.
Стек и ограничения
- OCR:
tesseract.js 5(WASM в процессе Node), языкиrus+eng, traineddata закэширована на VPS в/var/lib/antonov-ai/tessdata. - PDF:
pdf-parse. Сканы PDF без текстового слоя в v1 не поддерживаются — попросит загрузить страницу как JPG/PNG. - Schema: Zod. Три типа:
resume,invoice,generic. - LLM: free-модели OpenRouter из живого ранкинга, JSON-mode + retry + fallback-модель.
- Файлы не сохраняются. Лимит — 5 MB. Audit пишет только хэш и метаданные.
- Tesseract на CPU небыстрый — на скане A4 уходит 3–8 секунд. Для PDF с текстовым слоем извлечение мгновенно.