mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
fix: make OCR portable and reliable across AMD64 and ARM64 (#519)
* fix: make OCR portable and reliable * fix: harden OCR installation portability * fix: pin OCR partials across downloads * fix: make OCR execution reliably asynchronous * fix: harden OCR portability and docs routes * fix: preserve decoder and docs safeguards
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
---
|
||||
description: "Структура монорепозиторію, архітектура застосунків і пакетів, життєвий цикл запиту та споживання ресурсів SnapOtter."
|
||||
i18n_source_hash: 9e8f80499a37
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 6a1de194bb8b
|
||||
i18n_source_hash: 733cb3c10884
|
||||
i18n_provenance: human
|
||||
---
|
||||
|
||||
# Архітектура {#architecture}
|
||||
@@ -36,13 +36,13 @@ snapotter/
|
||||
|
||||
### `@snapotter/ai` {#snapotter-ai}
|
||||
|
||||
Проміжний шар, який викликає скрипти Python для ML-операцій. Під час першого використання цей шар запускає стійкий процес-диспетчер Python, який заздалегідь імпортує важкі бібліотеки (PIL, NumPy, MediaPipe, rembg), тож наступні AI-виклики пропускають накладні витрати на імпорт. Якщо диспетчер ще не готовий, шар повертається до породження свіжого підпроцесу Python на кожен запит.
|
||||
Рівень мосту, який викликає нативну та Python ML середовища виконання. Більшість інструментів Python використовують постійний dispatcher, який попередньо імпортує важкі бібліотеки (PIL, NumPy, MediaPipe, rembg), тому наступні виклики пропускають накладні витрати на імпорт. OCR ізольовано від цього змінного спільного середовища: `fast` викликає рідний Tesseract, тоді як `balanced` і `best` використовують виділений постійний JSONL dispatcher, закріплений на активному незмінному RapidOCR/ONNX покоління. Кожен запит містить generation lease. Активація спочатку запускає smoke test на кандидаті, а потім атомарно перемикається на його dispatcher. Попередній dispatcher зливається перед тим, як його генерацію буде зібрано сміттям.
|
||||
|
||||
**Моделі не завантажуються заздалегідь.** Скрипт кожного інструмента завантажує ваги своєї моделі з диска під час запиту і відкидає їх після завершення запиту. Дивіться [Споживання ресурсів](#resource-footprint) для повного профілю пам'яті.
|
||||
|
||||
Підтримувані операції: видалення фону (rembg/BiRefNet), збільшення роздільності (RealESRGAN), розмиття облич (MediaPipe), покращення облич (GFPGAN/CodeFormer), видалення об'єктів (LaMa ONNX), OCR (PaddleOCR/Tesseract), розфарбовування (DDColor), видалення шуму, видалення ефекту червоних очей, відновлення фото, генерація фото на паспорт, виправлення прозорості (BiRefNet HR-matting) та зміна розміру з урахуванням вмісту (двійковий файл Go caire).
|
||||
Підтримувані операції: видалення фону (rembg/BiRefNet), масштабування (RealESRGAN), розмиття обличчя (MediaPipe), покращення обличчя (GFPGAN/CodeFormer), стирання об’єктів (LaMa ONNX), OCR (Tesseract і RapidOCR з моделями PP-OCR ONNX), розфарбовування (DDColor), видалення шуму, видалення ефекту червоних очей, відновлення фотографій, створення фотографій на паспорт, фіксація прозорості (BiRefNet HR-matting) і зміна розміру з урахуванням вмісту (двійковий файл Go caire).
|
||||
|
||||
Скрипти Python розташовані в `packages/ai/python/`. Образ Docker заздалегідь завантажує всі ваги моделей під час збірки, тож контейнер працює повністю офлайн.
|
||||
Сценарії Python знаходяться в `packages/ai/python/`. Великі додаткові пакети моделей встановлюються на вимогу в постійний том `/data/ai`. Точний OCR використовує підписані, специфічні для платформи артефакти; вбудований рівень Tesseract не вимагає завантаження пакета моделей.
|
||||
|
||||
### `@snapotter/shared` {#snapotter-shared}
|
||||
|
||||
@@ -87,7 +87,7 @@ snapotter/
|
||||
2. Фронтенд надсилає multipart POST на `/api/v1/tools/:section/:toolId` з файлом і налаштуваннями.
|
||||
3. Маршрут API валідує вхідні дані за допомогою Zod, а потім розподіляє обробку.
|
||||
4. Для стандартних інструментів завдання ставиться в чергу до відповідного пулу BullMQ (image, media або docs залежно від модальності). Воркер BullMQ у процесі автоматично орієнтує зображення на основі метаданих EXIF, виконує функцію обробки інструмента й повертає результат.
|
||||
5. Для AI-інструментів міст TypeScript надсилає запит до стійкого диспетчера Python (або породжує свіжий підпроцес як запасний варіант), чекає його завершення та зчитує вихідний файл.
|
||||
5. Для більшості інструментів ШІ міст TypeScript надсилає запит до постійного Python dispatcher. Натомість швидкий OCR викликає Tesseract, а точний OCR запускає закріплений виконуваний файл із активного незмінного покоління OCR. Запитуваний рівень OCR фіксується на вході та ніколи не мовчки змінюється під час виконання.
|
||||
6. Прогрес завдання зберігається в таблиці `jobs` у PostgreSQL, тож стан переживає перезапуски контейнера. Оновлення в реальному часі доставляються через SSE за адресою `/api/v1/jobs/:jobId/progress`.
|
||||
7. API повертає `jobId` та `downloadUrl`. Користувач завантажує оброблений файл з `/api/v1/download/:jobId/:filename`.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user