Документация

Распознавание изображений

Доступно только на платных тарифах

Пакетное распознавание изображений и PDF-документов. Изображения отправляются модели вместе с JSON Schema ответа — модель возвращает данные строго по этой схеме. PDF-документы разбиваются на страницы, каждая страница распознаётся отдельным запросом.

POST

Пакетное распознавание с промптом и схемой

https://ai.wormsoft.ru/api/ocr
POST

«Под ключ» распознавание текстовых документов.

https://ai.wormsoft.ru/api/ocr/document
Старый адрес
/api/ocr/v1, /api/ocr/v1/document.

Интеграция агента

Для интеграции вашего агента скачайте и передайте ему эту документацию.

Структура запроса

  • Обязательное поле sources — массив источников (1–20): каждый элемент содержит либо image (base64, с опциональным префиксом data:image/...;base64,), либо pdfFile (base64 PDF). Оба поля в одном элементе передать нельзя.
  • prompt — опциональная инструкция к распознаванию (уточнение задачи для модели).
  • responseSchema — обязательная JSON Schema ответа. Передаётся напрямую в tool-calling: модель обязана вернуть объект строго по этой схеме.
  • model — обязательная vision-модель провайдера с поддержкой tool-calling, например wormsoft/vision/medium
  • Bearer YOUR_API_KEY— авторизация.

Минимальный пример запроса

Распознать текст на одном изображении.

curl --request POST \
  --url https://ai.wormsoft.ru/api/ocr \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "sources": [
      { "image": "data:image/jpeg;base64,/9j/4AAQSkZJRg..." }
    ],
    "prompt": "",
    "responseSchema": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "text": { "type": "string", "description": "Распознанный текст" }
      },
      "required": ["text"]
    },
    "model": "wormsoft/vision/medium"
  }'

Пакетная обработка

В sources можно отправить несколько изображений и PDF-файлов одним запросом (до 20 источников). Ответ — всегда массив: по элементу на каждый входной источник. Один prompt и одна responseSchema применяются ко всем источникам.

{
  "sources": [
    { "image": "data:image/jpeg;base64,/9j/4AAQ..." },
    { "pdfFile": "JVBERi0xLjQK..." },
    { "image": "iVBORw0KGgo..." }
  ],
  "prompt": "Распознай текст",
  "responseSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": { "text": { "type": "string" } },
    "required": ["text"]
  },
  "model": "wormsoft/vision/medium"
}

Структурированное распознавание

Схема под конкретный кейс: например, подсчёт людей на фото или извлечение полей договора. Рекомендации: указывайте additionalProperties: false и required; для полей, которые могут отсутствовать, используйте union-тип ["string", "null"]; описывайте каждое поле в description.

{
  "sources": [{ "image": "data:image/jpeg;base64,/9j/4AAQ..." }],
  "prompt": "Посчитай количество людей, видимых на фотографии",
  "responseSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {
      "peopleCount": { "type": "integer", "description": "Количество людей на фотографии" }
    },
    "required": ["peopleCount"]
  },
  "model": "wormsoft/vision/medium"
}

PDF-документы

PDF-файл в sources (pdfFile) разбивается на страницы (до 50), каждая страница распознаётся отдельным запросом с той же схемой. В ответе по документу будет массив pages постранично. Если нужен единый результат по всему PDF — собирайте поля pages[i].data на своей стороне.

{
  "sources": [{ "pdfFile": "JVBERi0xLjQK..." }],
  "prompt": "Договор. Распознай стороны и сумму",
  "responseSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {
      "partyA": { "type": ["string", "null"] },
      "partyB": { "type": ["string", "null"] },
      "amount": { "type": ["number", "null"] }
    },
    "required": ["partyA", "partyB", "amount"]
  },
  "model": "wormsoft/vision/medium"
}

Пример ответа

documents — всегда массив: по элементу на каждый входной источник (для изображения — одна страница, для PDF — постранично).

{
  "model": "wormsoft/vision/medium",
  "documents": [
    {
      "documentIndex": 0,
      "pageNumbers": [1],
      "pages": [
        {
          "pageNumber": 1,
          "data": { "text": "Распознанный текст..." },
          "usage": { "inputTokens": 1234, "outputTokens": 567, "credits": 100 }
        }
      ]
    },
    {
      "documentIndex": 1,
      "pageNumbers": [1, 2],
      "pages": [
        { "pageNumber": 1, "data": { "text": "Страница 1..." },
          "usage": { "inputTokens": 1234, "outputTokens": 567, "credits": 100 } },
        { "pageNumber": 2, "data": { "text": "Страница 2..." },
          "usage": { "inputTokens": 1234, "outputTokens": 567, "credits": 100 } }
      ]
    }
  ],
  "usage": { "inputTokens": 4936, "outputTokens": 2268, "credits": 400 }
}

/api/ocr/document — распознавание «под ключ»

Метод «под ключ» для текстовых документов: промпт, схема ответа ({"text": "string"}) и модель зашиты на стороне сервиса. На вход — массив documents (то же самое, что sources: элементы с image или pdfFile), на выходе — постраничный текст каждого документа.

curl --request POST \
  --url https://ai.wormsoft.ru/api/ocr/document \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "documents": [
      { "pdfFile": "JVBERi0xLjQK..." },
      { "image": "data:image/png;base64,iVBORw0KGgo..." }
    ]
  }'

Ответ имеет тот же формат, что у /api/ocr (без поля model): documents[i].pages[j].data.text — текст страницы.

Тарификация

  • Стоимость рассчитывается по токенам всех страниц всех источников (input-токены включают «визуальные» токены изображений) и списывается как операция ocr.
  • Итоговая сумма — в usage.credits ответа; постраничная — в pages[i].usage.credits.
  • Кредиты списываются с буста и лимита подписки
  • При нехватке кредитов остаток уходит в долг
  • Списание происходит только при успешном ответе провайдера

Сколько стоит один элемент

  • Фиксированной цены за «один элемент» нет: стоимость одного источника (изображения или страницы PDF) считается от его реальных токенов: input_tokens × 1 / 1000 + output_tokens × 4000 / 1000
  • Тариф: 1 кредит за 1K входных токенов (1 000 000 за 1M) и 4000 кредитов за 1K выходных токенов (4 000 000 за 1M).
  • Входные токены страницы — это «визуальные» токены изображения + токены промпта/схемы. Размер и детализация изображения влияют на их количество.
  • Выходные токены — размер JSON-ответа по вашей responseSchema. Основная часть стоимости — именно выходные токены.

Ориентиры по цене одного элемента:

  • Изображение с коротким текстом (фото документа, ~1 500–3 000 входных токенов, ~200–500 выходных): ≈ 800–2 000 кредитов.
  • Страница PDF с плотным текстом (до ~5 000–10 000 входных, до 2 000–3 000 выходных токенов): ≈ 8 000–12 000 кредитов.
  • Текст на всю страницу при схеме {"text": "..."} — выходные токены равны длине распознанного текста, поэтому цена растёт вместе с объёмом текста.
  • Точную стоимость конкретного распознавания всегда смотрите в usage.credits ответа — она рассчитывается по фактическим токенам этого запроса.

Ошибки и лимиты

400
Неверный запрос пользователя
401
Неверный или отсутствует API ключ
403
Запрос на бесплатном (БАЗОВЫЙ) тарифе.
500+
Ошибка на стороне нашего сервиса
До 20 источников (изображений и/или PDF) за один запрос;
Размер одного файла — до 25 МБ;
Максимум 50 страниц в одном PDF;
Промпт — до 4000 символов.