LOOMA / ДОКУМЕНТАЦИЯ
API приложения
Локальный бэкенд по умолчанию работает на http://127.0.0.1:8765. Embed-сервер — отдельный API на порту 8766 с другой авторизацией. Не подменяйте один адрес другим.
Полный справочник API приложения · Справочник embed-сервера
Доступ и авторизация#
Для защищённых маршрутов приложения используется заголовок X-API-Key, если в настройках включена авторизация и задан ключ. Это не глобальная защита всех маршрутов: часть настроек и управляющих endpoints не требует ключа. Локальный API рассчитан на loopback; не открывайте порт 8765 в публичную сеть.
Embed-сервер использует Authorization: Bearer <ключ>; его /health открыт. Текущая реализация допускает работу без авторизации при пустом или повреждённом файле ключей — сохраняйте корректный непустой файл и ограничьте сетевой доступ. Ключ embed-сервера также даёт доступ к управлению ключами.
Живой Swagger UI каждого сервера находится на /docs, OpenAPI — на /openapi.json. Статический справочник ниже работает офлайн и не отправляет запросы к вашей библиотеке. Это снимок схемы той версии исходников, из которой собрана документация.
Поиск с текстом и координатами#
curl --get 'http://127.0.0.1:8765/api/search' \
--data-urlencode 'q=солнечная энергия' \
--data-urlencode 'semantic_weight=0.5' \
--data-urlencode 'k=10' \
--data-urlencode 'include_text=true' \
-H "X-API-Key: $LOOMA_API_KEY"
semantic_weight=0 — только BM25; 1 — только визуальные эмбеддинги; между ними — гибридный поиск. space_id выбирает одно пространство; повторяющийся space_ids — несколько. k от 1 до 100.
Ответ содержит results, total, warnings, имя модели и баланс. Результат содержит pdf_id, page_number, score, match_types, snippet, text_url. При include_text=true добавляется text_layer с сохранёнными слоями и координатами. total — число возвращённых результатов, а не размер всей библиотеки. score — ранг гибридного поиска, не вероятность.
Получить слой страницы#
Страницы в API нумеруются с нуля: 0 — первая страница.
curl --get 'http://127.0.0.1:8765/api/pages/12/0/text' \
--data-urlencode 'q=энергия' \
-H "X-API-Key: $LOOMA_API_KEY"
Ответ включает has_native_text, has_ocr, checked, coordinate_system и layers. Каждый слой содержит source (native или ocr), text, spans, width, height и сведения о движке. bbox слова имеет вид [x0,y0,x1,y1]: координаты нормализованы относительно страницы, начало в левом верхнем углу. Умножьте X на ширину изображения, Y — на высоту. match отмечает совпадение с q.
Наличие OCR не означает, что собственный текст удалён: оба источника хранятся отдельно. checked=false означает, что проверка собственного текста ещё не сохранена.
Прогресс поиска#
GET /api/search/stream возвращает NDJSON, не SSE: одна JSON-запись на строку. Пустые строки — keepalive. События progress содержат step и state; финальное result — ответ в data; error — описание сбоя.
curl -N --get 'http://127.0.0.1:8765/api/search/stream' \
--data-urlencode 'q=энергия' \
--data-urlencode 'semantic_weight=0' \
-H "X-API-Key: $LOOMA_API_KEY"
Этапы: prepare, text, model, query, visual, rank, results. Не все этапы выполняются для каждого режима. Поток индексации /api/indexing/stream, напротив, использует SSE.
OCR одной страницы#
curl -X POST 'http://127.0.0.1:8765/api/ocr/pages/12/0' \
-H "X-API-Key: $LOOMA_API_KEY"
Запрос принудительно распознаёт страницу без общей очереди и изменяет сохранённый OCR. Он может выполняться долго. Для массовой обработки используйте POST /api/ocr/enqueue; очереди OCR и извлечения текста имеют разные kind (ocr и text).
API embed-сервера#
curl 'http://127.0.0.1:8766/embedders' \
-H "Authorization: Bearer $EMBED_API_KEY"
curl 'http://127.0.0.1:8766/embed/queries' \
-H "Authorization: Bearer $EMBED_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"model":"colqwen3_2b","queries":["солнечная энергия"]}'
Для файлов приложение использует задания:
| Метод и путь | Назначение |
|---|---|
POST /document-jobs/{client_id} |
Отправить бинарный файл; параметры model, sha256, dpi, kind |
GET /document-jobs/{client_id} |
Получить состояние и готовые порции |
GET /document-jobs/{client_id}/batches/{number} |
Скачать порцию ZIP; отсчёт с нуля |
POST /document-jobs/{client_id}/control |
{"paused":true} или false |
DELETE /document-jobs/{client_id} |
Подтвердить получение или отменить с очисткой |
client_id — 64 шестнадцатеричных символа. Повторное создание того же задания возвращает существующее; для продолжения нужен тот же API-ключ. Исходник передаётся бинарным телом, не multipart. Старые /embed/images и /embed/queries возвращают JSON.
Ошибки#
Проверяйте HTTP-статус и поле detail: 401/403 — доступ, 404 — отсутствующий объект, 409 — конфликт состояния, 422 — неверные параметры, 503 — временная недоступность вычисления. У потокового поиска ошибка после открытия ответа передаётся событием error, поэтому одного HTTP 200 недостаточно.