Распознавание изображений
Пакетное распознавание изображений и PDF-документов. Изображения отправляются модели вместе с JSON Schema ответа — модель возвращает данные строго по этой схеме. PDF-документы разбиваются на страницы, каждая страница распознаётся отдельным запросом.
Пакетное распознавание с промптом и схемой
https://ai.wormsoft.ru/api/ocr«Под ключ» распознавание текстовых документов.
https://ai.wormsoft.ru/api/ocr/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 ответа — она рассчитывается по фактическим токенам этого запроса.