Отправляю пакет из 2 задач файлом, в отложенные задачи - batch.
Задачи создаются, отправляются в пул, мониторятся и видно, что их там 2. Дожидаюсь выполнения, иду забирать - возвращает результат только по 1 задаче, по первой. Как так? Ответ смотрю прямо в ответе библиотеки в отладчике, да, приходит 1 ответ.
На той же кодовой базе крутятся другие сервисы, использующие отложенные задачи chatgpt, но они все корректно выполняются... В чем может быть причина? Деньги на балансе есть.
Код, картинки и прочее:
rPman, да собственно как в документации...
Вот так собирается запрос
prompt_batch_data = []
prompt_description = f"большой промпт"
prompt_description_jsonl_object = ai_batch_generate(1, prompt_description)
prompt_title = f"маленький промпт"
prompt_title_jsonl_object = ai_batch_generate(2, prompt_title)
prompt_batch_data.extend([prompt_description_jsonl_object, prompt_title_jsonl_object])
task_id = process_batch(
prompt_batch_data=prompt_batch_data,
filename="article_plan.jsonl",
description="article_plan",
client=client
)
вспомогательные функцииdef ai_batch_generate(custom_id, prompt, role):
"""
Формирует jsonl объект для batch запросов
:param custom_id: Список id данных, только уникальные в рамках текущей задачи id
:param prompt: Сформированный промпт
:param role: роль нейронки в запросе
:return:
"""
prompt_batch_data = []
jsonl_object = {
"custom_id": str(custom_id),
"method": "POST",
"url": "/v1/chat/completions",
"body": {
"model": "gpt-4o",
"messages": [
{"role": "system", "content": role},
{"role": "user",
"content": prompt}
],
"max_tokens": 1500
}
}
return jsonl_object
def process_batch(
prompt_batch_data,
filename,
description,
client
):
"""
Обрабатывает данные батча: сохраняет в .jsonl, отправляет в OpenAI,
создаёт задачу и запускает мониторинг.
:param prompt_batch_data: Список словарей с данными для генерации.
:param filename: Имя выходного файла (.jsonl).
:param description: Описание задачи (будет использоваться в метаданных).
:param client: Клиент OpenAI с методами `files.create` и `batches.create`.
"""
# Сохраняем данные в .jsonl файл
with open(filename, 'w', encoding='utf-8') as f:
for item in prompt_batch_data:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
# Загружаем файл в OpenAI
batch_input_file = client.files.create(
file=open(filename, "rb"),
purpose="batch"
)
batch_input_file_id = batch_input_file.id
# Создаем батч-запрос
send_batch = client.batches.create(
input_file_id=batch_input_file_id,
endpoint="/v1/chat/completions",
completion_window="24h",
metadata={
"description": description
}
)
task_id = send_batch.id
logging.info(f"Генерация '{description}' отправлена в нейронку, задача: {task_id}")
return task_id
Потом мониторю ответ, получаю вот такой

обращаюсь по этому output_file_id
batch_data = client.files.content(batch_file)
jsonl_string = batch_data.text
# Результирующий список
prompt_batch_data = []
# Обрабатываем строки файла построчно
json_object = json.loads(jsonl_string[0]) # Преобразуем строку в JSON-объект
custom_id = json_object['custom_id'] # Извлекаем custom_id
content = json_object['response']['body']['choices'][0]['message']['content']
content = prepare_content(content) # Извлекаем и очищаем контент
и просто заглядывая в ответ chatgpt вижу такой ответ:
{
"id": "batch_req_67fcf1bf76588190b9a6cf7b871babfb",
"custom_id": "1",
"response": {
"status_code": 200,
"request_id": "bf2823953630da7654984be23c14703b",
"body": {
"id": "chatcmpl-BMCIlgiLSLFb3I3pUImzV1115A3D9",
"object": "chat.completion",
"created": 1744630203,
"model": "gpt-4o-2024-08-06",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "ответ",
"refusal": null,
"annotations": []
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 106,
"completion_tokens": 309,
"total_tokens": 415,
"prompt_tokens_details": {
"cached_tokens": 0,
"audio_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
},
"service_tier": "default",
"system_fingerprint": "fp_fa860cbac8"
}
},
"error": null
}
то есть данные только для custom_id 1, данных по custom_id 2 нет.