Пакетные запросы
Актуальный список моделей, поддерживающих фоновую обработку, можно получить динамически через API эндпоинт: https://bothub.chat/api/v2/openai/v1/batches/models и https://bothub.chat/api/v2/replicate/v1/models
Пакетны е запросы (Batches API) предназначены для асинхронной обработки огромных объемов данных. Вместо того чтобы ждать ответ на каждый запрос к модели при классификации, переводе или парсинге, вы собираете все задачи в один файл .jsonl и запускаете фоновую обработку на сервере BotHub.
Архитектура полностью совместима со спецификацией OpenAI Batch API, поэтому вы можете использовать официальные SDK без изменения логики формирования данных.
1. Запуск пакетной обработки
Процесс запуска состоит из двух этапов: сначала вы загружаете файл с задачами (формат JSON Lines), а затем инициализируете саму очередь на генерацию.
Пример структуры файла my_tasks.jsonl перед загрузкой:
{"custom_id": "task-translate-001", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "claude-opus-4.6", "messages": [{"role": "system", "content": "Переведи текст на французский язык."}, {"role": "user", "content": "Привет, как дела?"}], "max_tokens": 100}}
{"custom_id": "task-generate-003", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "claude-opus-4.6", "messages": [{"role": "user", "content": "Напиши короткое хокку про нейросети."}], "max_tokens": 50}}
Шаг 1. Загрузка файла
Файл должен иметь формат .jsonl, где каждая строка — это отдельный запрос к Chat Completions API. Обратите внимание, что параметр purpose всегда должен быть равен "batch".
- JS
- Python
- Go
- cURL
import OpenAI from 'openai';
import fs from 'fs';
const openai = new OpenAI({
apiKey: 'ВАШ_API_КЛЮЧ_BOTHUB',
baseURL: 'https://openai.bothub.chat/v1'
});
async function uploadFile() {
const file = await openai.files.create({
file: fs.createReadStream('my_tasks.jsonl'),
purpose: 'batch',
});
console.log(file.id); // Сохраните этот ID для следующего шага
}
uploadFile();
from openai import OpenAI
client = OpenAI(
api_key='ВАШ_API_КЛЮЧ_BOTHUB',
base_url='https://openai.bothub.chat/v1'
)
file = client.files.create(
file=open("my_tasks.jsonl", "rb"),
purpose="batch"
)
print(file.id) # Сохраните этот ID для следующего шага
package main
import (
"context"
"fmt"
"os"
"github.com/openai/openai-go"
"github.com/openai/openai-go/option"
)
func main() {
client := openai.NewClient(
option.WithAPIKey("ВАШ_API_КЛЮЧ_BOTHUB"),
option.WithBaseURL("https://openai.bothub.chat/v1"),
)
f, err := os.Open("my_tasks.jsonl")
if err != nil {
panic(err)
}
defer f.Close()
file, err := client.Files.New(context.Background(), openai.FileNewParams{
File: openai.File(f, "my_tasks.jsonl", "application/jsonl"),
Purpose: openai.FilePurposeBatch,
})
if err != nil {
panic(err)
}
fmt.Println(file.ID) // Сохраните этот ID для следующего шага
}
curl https://openai.bothub.chat/v1/files \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ_BOTHUB" \
-F purpose="batch" \
-F "files=@./my_tasks.jsonl"
Шаг 2. Создание задачи
Используйте полученный file_id для старта генерации. Платформа резервирует под выполнение окно в 24h (на данный момент это единственное доступное значение).
- JS
- Python
- Go
- cURL
async function createBatch() {
const batch = await openai.batches.create({
input_file_id: 'АЙДИ_РАНЕЕ_ЗАГРУЖЕННОГО_ФАЙЛА', // ID из предыдущего шага
endpoint: '/v1/chat/completions',
completion_window: '24h'
});
console.log(batch);
}
createBatch();
batch = client.batches.create(
input_file_id="АЙДИ_РАНЕЕ_ЗАГРУЖЕННОГО_ФАЙЛА", # ID из предыдущего шага
endpoint="/v1/chat/completions",
completion_window="24h"
)
print(batch)
batch, err := client.Batches.New(context.Background(), openai.BatchNewParams{
InputFileID: "АЙДИ_РАНЕЕ_ЗАГРУЖЕННОГО_ФАЙЛА",
Endpoint: openai.BatchNewParamsEndpointV1ChatCompletions,
CompletionWindow: openai.BatchNewParamsCompletionWindow24h,
})
if err != nil {
panic(err)
}
fmt.Println(batch)
curl https://openai.bothub.chat/v1/batches \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ_BOTHUB" \
-d '{
"input_file_id": "АЙДИ_РАНЕЕ_ЗАГРУЖЕННОГО_ФАЙЛА",
"endpoint": "/v1/chat/completions",
"completion_window": "24h"
}'
2. Мониторинг и получение результатов
Поскольку обработка занимает время, вам необходимо периодически проверять статус задачи. Как только статус изменится на completed, вы сможете скачать готовый файл.
validating— проверка структуры файла сервером.in_progress— отправка запросов провайдерам нейросетей.completed— успешное завершение, файл с ответами готов к загрузке.failed— критическая ошибка (например, невалидный JSON или нулевой баланс).cancelled— обработка прервана пользователем по API.
Шаг 1. Проверка статуса
Для отслеживания подробных расходов по операции передавайте флаг include_usage=true в строке запроса.
- JS
- Python
- Go
- cURL
async function checkStatus() {
const batch = await openai.batches.retrieve('АЙДИ_БАТЧА');
console.log('Текущий статус:', batch.status);
if (batch.status === 'completed') {
console.log('ID готового файла:', batch.output_file_id);
}
}
checkStatus();
batch = client.batches.retrieve("АЙДИ_БАТЧА")
print("Текущий статус:", batch.status)
if batch.status == "completed":
print("ID готового файла:", batch.output_file_id)
batch, err := client.Batches.Get(context.Background(), "АЙДИ_БАТЧА")
if err != nil {
panic(err)
}
fmt.Println("Текущий статус:", batch.Status)
if batch.Status == "completed" {
fmt.Println("ID готового файла:", batch.OutputFileID)
}
curl "https://openai.bothub.chat/v1/batches/АЙДИ_БАТЧА?include_usage=true" \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ_BOTHUB"
Шаг 2. Скачивание результата
Используйте идентификатор файла из поля output_file_id, чтобы получить итоговый документ. Строки в нем могут идти не по порядку, поэтому всегда сопоставляйте ответы по полю custom_id, которое вы задавали изначально.
- JS
- Python
- Go
- cURL
async function getResult() {
const response = await fetch('https://openai.bothub.chat/v1/files/АЙДИ_ФАЙЛА', {
headers: { 'Authorization': 'Bearer ВАШ_API_КЛЮЧ_BOTHUB' }
});
const link = await response.text();
console.log(link);
}
getResult();
import requests
def get_result():
response = requests.get(
"https://openai.bothub.chat/v1/files/АЙДИ_ФАЙЛА",
headers={"Authorization": "Bearer ВАШ_API_КЛЮЧ_BOTHUB"}
)
link = response.text
print(link)
get_result()
req, _ := http.NewRequest("GET", "https://openai.bothub.chat/v1/files/АЙДИ_ФАЙЛА", nil)
req.Header.Set("Authorization", "Bearer ВАШ_API_КЛЮЧ_BOTHUB")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
link, _ := io.ReadAll(resp.Body)
fmt.Println(string(link))
curl https://openai.bothub.chat/v1/files/АЙДИ_ФАЙЛА \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ_BOTHUB"
3. Управление пакетами
Дополнительные методы для контроля над запущенными задачами и историей.
Отмена запроса
Позволяет экстренно остановить генерацию. Деньги спишутся только за те задачи, которые нейросеть успела отработать до отмены.
- JS
- Python
- Go
- cURL
await openai.batches.cancel('АЙДИ_БАТЧА');
client.batches.cancel("АЙДИ_БАТЧА")
_, err := client.Batches.Cancel(context.Background(), "АЙДИ_БАТЧА")
if err != nil {
panic(err)
}
curl -X POST https://openai.bothub.chat/v1/batches/АЙДИ_БАТЧА/cancel \
-H "Authorization: Bearer ВАШ_API_КЛЮЧ_BOTHUB"