2025, Dec 17 21:02

Как исправить ошибку unexpected keyword argument 'file_ids' в OpenAI Assistants API

Разбираем, почему messages.create не принимает file_ids в OpenAI Assistants API, и даём рабочий пример с attachments для передачи файлов в code interpreter

Загрузка файла к сообщению в OpenAI Assistants API может завершиться ошибкой unexpected keyword argument, если передать неверный параметр. Внешне проблема кажется мелкой, но из‑за неё срывается весь запуск, когда вы пытаетесь прикрепить входные данные для инструментов вроде интерпретатора кода.

Проблема в контексте

На этапе создания сообщения используется ключ, который конечная точка не принимает. Вызов падает во время выполнения и обрывает выполнение потока.

# Создаём сообщение с прикреплённым файлом
post = api.beta.threads.messages.create(
    thread_id=dialog.id,
    role="user",
    content="Here is the HTML content for the seminar page.",
    file_ids=[uploaded.id]  # ожидалось, что файл будет передан здесь
)

При выполнении вызов завершается ошибкой:

An error occurred: Messages.create() got an unexpected keyword argument 'file_ids'

Что на самом деле не так

Эндпоинт messages.create не принимает параметр верхнего уровня file_ids. Вместо него используется attachments. Внутри attachments каждый элемент содержит поле file_id. Похожее по названию file_ids встречается в других частях Assistants API, но там оно выступает полем внутри словаря, а не передаётся как прямой параметр создания сообщения. Из‑за этого несоответствия и возникает ошибка unexpected keyword argument.

Рабочий подход и исправленный пример

Переход на параметр attachments решает проблему. Каждый элемент вложений включает file_id и может указать, каким инструментам следует передать файл.

# Создаём нового ассистента
helper = api.beta.assistants.create(
    name="Seminar HTML to CSV Assistant",
    instructions=instructions,
    model="gpt-4",
    tools=[{"type": "code_interpreter"}],
)
# Создаём поток
dialog = api.beta.threads.create()
# Создаём сообщение с загруженным файлом
post = api.beta.threads.messages.create(
    thread_id=dialog.id,
    role="user",
    content="Here is the HTML content for the seminar page.",
    attachments=[{"file_id": uploaded.id, "tools": [{"type": "code_interpreter"}]}]
)
# Запускаем ассистента
job = api.beta.threads.runs.create(
    thread_id=dialog.id,
    assistant_id=helper.id
)

Почему это важно

Использование attachments гарантирует, что файл корректно привязан к сообщению и доступен указанным инструментам. Это критично, когда нужно, чтобы интерпретатор кода обработал загруженный ресурс в рамках запуска — например, распарсил HTML или преобразовал данные. Неверный параметр на уровне сообщения фактически блокирует этот процесс до исправления ошибки.

Выводы

При создании сообщения в потоке используйте attachments с file_id вместо верхнеуровневого file_ids. Оставляйте file_ids для тех мест, где он явно допускается внутри словаря. Если сомневаетесь, перепроверьте справочник по CreateMessage и, для полноты картины, посмотрите, как устроены attachments и как они связаны с инструментами вроде интерпретатора кода. Такая согласованность избавит от сюрпризов во время выполнения и сохранит стабильность конвейера Assistants.