Данила (Dayfing)
Назад к публикациям
2 044 слов10 мин

Assistants API отключён 26 августа 2026 года: миграция на Responses API

Assistants API официально отключён 26 августа 2026 года и больше недоступен. Рабочие приложения нужно перевести на Responses API, включая генерацию, состояние диалога, инструменты и работу с данными. Надёжный путь состоит в инвентаризации всех Assistant, Thread, Run и инструментов, восстановлении поведения в конфигурации Responses, переносе истории из собственных записей и проверке ответов и побочных действий до переключения трафика. Дата отключения и таблица соответствий подтверждены в официальном руководстве OpenAI по миграции Assistants.

Что меняет отключение 26 августа 2026 года

Это миграция конечных точек и объектов, а не переименование модели. После даты отключения обращения к старым ресурсам Assistants нельзя считать временным предупреждением. Код, который создаёт или читает /v1/assistants, /v1/threads, /v1/threads/messages или /v1/threads/runs, должен получить новый путь. Не начинайте новый проект на старом API и не рассчитывайте, что старые объекты останутся доступными для запросов.

Актуальная таблица OpenAI выглядит так:

Assistants API Платформа Responses Практический смысл
Assistant Prompt или конфигурация запроса Храните модель, инструкции, объявления инструментов и правила вывода в версионируемой конфигурации. Текущее руководство предлагает создать Prompt из Assistant в панели, но одновременно предупреждает об устаревании переиспользуемых Prompt.
Thread Conversation или история приложения Conversation хранит элементы, в том числе сообщения, вызовы инструментов и результаты инструментов. Состояние также можно хранить в своей базе и передавать нужные элементы.
Run Response Запрос Responses получает входные элементы и возвращает выходные. Отдельный объект Run и цикл опроса больше не являются центральной моделью.
Run step Item Обрабатывайте типизированные элементы message, function_call, function_call_output и reasoning, а не предполагайте, что каждый результат является сообщением.

Изучайте руководство по переходу на Responses API вместе с руководством об отключении. В нём Responses назван рекомендуемым API для новых проектов и описаны отличия от Chat Completions, а также формы входа и выхода.

Новая модель работы

Раньше Assistant был постоянным серверным набором настроек. Thread хранил сообщения, а Run выполнял Assistant относительно этого Thread. Responses разделяет эти задачи. Запрос задаёт модель, инструкции, входные данные и инструменты. Результат представляет собой типизированный Response с упорядоченным списком элементов в output.

Такой подход явно передаёт оркестрацию приложению. Ваш код решает, как определить пользователя, сколько истории отправить, какие вызовы разрешены, как проверить аргументы инструментов, как повторять неудачные операции и когда требуется подтверждение человека. OpenAI по-прежнему предоставляет варианты хранения состояния, но это выбранные режимы, а не скрытый жизненный цикл Assistant.

Для состояния есть три практических варианта:

  1. Используйте статeless-запрос и передавайте ограниченный список входных элементов на каждом ходу. Так база приложения контролирует хранение и обрезку истории.
  2. Связывайте ходы через previous_response_id. Этот вариант показан в документации о состоянии диалога. Он удобен для коротких сценариев, но предыдущие входные токены учитываются в оплате, а хранение должно соответствовать вашей политике.
  3. Создайте объект Conversations API и передавайте его ID в Responses. Conversation имеет постоянный идентификатор и используется между сессиями, устройствами и задачами. Его элементы хранятся до удаления, поэтому ID указывает на сохранённое состояние, а не включает режим конфиденциальности.

Выберите одну стратегию для каждого потока продукта. Не смешивайте без ясного владельца локально собранную стенограмму, Conversation и цепочку previous_response_id. Повторные ходы могут изменить поведение модели, увеличить расходы и усложнить выполнение запросов на удаление.

Проведите инвентаризацию до изменения кода

Создайте запись миграции для каждого Assistant ID и каждого пути пользовательской сессии. Зафиксируйте модель, инструкции, параметры по умолчанию, схемы инструментов, vector store, файлы, использование Code Interpreter, формат ответа, метаданные, ожидания по хранению и код, который опрашивает статус Run. Ищите зависимости не только в сервере, но и в фоновых задачах, административных скриптах, панели, тестах и потребителях аналитики. Успешный текстовый ответ не доказывает сохранение поведения file search, структурированного вывода, потоковой передачи или функции с побочным эффектом.

Отделите поведение от сохранённых данных. Инструкции и объявления инструментов можно восстановить из конфигурации. Сообщения Thread и загруженные файлы являются данными и требуют экспорта или копии, принадлежащей приложению. Если приложение не хранило пользовательские сообщения за пределами Threads, сначала решите, как обработать эти записи. Руководство после отключения указывает, что получить старые сообщения Thread больше нельзя, и рекомендует использовать сообщения, уже сохранённые приложением.

Восстановите базовый запрос

Для текстового сценария замените последовательность beta Thread и Run одним вызовом Responses. Поле input принимает строку или список элементов, похожих на сообщения. Используйте instructions для стабильного поведения системного уровня, а пользовательский текст оставляйте в input. Обычный текст удобно читать через response.output_text, но при возможных инструментах или нетекстовых элементах нужно проверять response.output.

from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model="gpt-5.6",
    instructions="Answer clearly and cite the supplied records.",
    input=[{"role": "user", "content": "Summarize the order status."}],
    store=False,
)

print(response.output_text)

Новая конечная точка — /v1/responses, а метод SDK — client.responses.create. Не переносите без изменений ключ messages, путь choices[0].message.content или цикл опроса из Run. Если Responses нужно сохранять, сделайте это осознанным решением. В документации по контролю данных сейчас указано, что состояние Responses по умолчанию или при store=true хранится 30 дней с оговорёнными исключениями.

Имя модели в примере не является гарантией миграции. Проверьте модель, инструменты и доступные возможности в актуальном каталоге моделей, зафиксируйте snapshot для воспроизводимости и проведите собственные тесты качества и задержки.

Корректно сохраните историю

Если стенограмма принадлежит вашему приложению, преобразуйте её во входные элементы Responses. Текст пользователя станет input_text, текст ассистента — output_text, а изображение — input_image с URL или ссылкой на файл. Сохраните хронологический порядок, а также пары вызов инструмента и результата, которые нужны для понимания предыдущего хода.

Небольшой пример создаёт постоянный Conversation из истории приложения и отправляет новый ход:

from openai import OpenAI

client = OpenAI()

conversation = client.conversations.create(
    items=[
        {
            "role": "user",
            "content": [{"type": "input_text", "text": "My order is 1842."}],
        },
        {
            "role": "assistant",
            "content": [{"type": "output_text", "text": "I can check order 1842."}],
        },
    ]
)

response = client.responses.create(
    model="gpt-5.6",
    conversation=conversation.id,
    input=[{"role": "user", "content": "Is it ready to ship?"}],
)

print(response.output_text)

После отключения не пытайтесь мигрировать вызовом threads.messages.list. Экспортируйте данные, пока старая конечная точка доступна, только если работаете в среде до отключения. Для системы после отключения используйте записи, сохранённые приложением. До импорта сопоставьте пользователя, запросы на удаление, региональные правила, вложения и временные метки. Нельзя принимать Conversation ID от клиента без проверки, что он принадлежит аутентифицированному пользователю.

Перенесите инструменты и вызовы функций

Инструменты Responses объявляются в запросе. Встроенные web search, file search, computer use, Code Interpreter, генерация изображений и удалённый MCP описаны в руководстве Using tools. Пользовательские функции по-прежнему реализуются на стороне приложения. Модель может запросить функцию, но не может сама авторизовать или выполнить бизнес-операцию.

Цикл управления теперь явный. Отправьте первый запрос, проверьте response.output на элементы function_call, проверьте и выполните разрешённую функцию, добавьте элементы ответа модели и function_call_output, затем отправьте следующий запрос. Для reasoning-моделей сохраняйте reasoning-элементы, возвращённые вместе с вызовом, как показано в руководстве по function calling.

import json
from openai import OpenAI

client = OpenAI()

tools = [
    {
        "type": "function",
        "name": "lookup_order",
        "description": "Return the status of an order owned by the authenticated user.",
        "parameters": {
            "type": "object",
            "properties": {
                "order_id": {"type": "string"},
            },
            "required": ["order_id"],
            "additionalProperties": False,
        },
        "strict": True,
    }
]

input_items = [{"role": "user", "content": "Where is my order 1842?"}]

response = client.responses.create(
    model="gpt-5.6",
    tools=tools,
    input=input_items,
)

input_items += response.output
for item in response.output:
    if item.type == "function_call" and item.name == "lookup_order":
        arguments = json.loads(item.arguments)
        result = {"order_id": arguments["order_id"], "status": "packed"}
        input_items.append(
            {
                "type": "function_call_output",
                "call_id": item.call_id,
                "output": json.dumps(result),
            }
        )

response = client.responses.create(
    model="gpt-5.6",
    tools=tools,
    input=input_items,
)

print(response.output_text)

Строгий режим помогает соблюдать схему, но не даёт разрешений. В коде проверьте пользователя, владение заказом, диапазоны, перечисления и состояние операции. Для оплаты, удаления, публикации или отправки используйте идемпотентность или транзакцию. При ошибке возвращайте структурированную ошибку инструмента, а не сообщение об успешном действии. Ограничьте число ходов инструментов и записывайте вызовы, результаты и решения об одобрении с маскированием чувствительных значений.

Формат функции Responses отличается от старой оболочки функций Chat Completions. Перенесите схему осознанно и протестируйте неверные аргументы, неизвестные функции, повторные и параллельные вызовы, тайм-ауты и результат инструмента с недоверенным текстом.

Сохраните структурированный вывод

Если старый Assistant использовал JSON mode или схему ответа, перенесите её в конфигурацию Responses text.format, а response_format не копируйте механически. Руководство по structured outputs описывает текущую форму схемы и помощники SDK. Проверяйте разобранный результат до записи в базу, показа в интерфейсе или передачи другому инструменту. Валидный JSON всё ещё может содержать неверный номер заказа, опасную инструкцию или незавершённое бизнес-решение.

Держите схему небольшой и версионируйте вместе с Prompt или конфигурацией запроса. Объявляйте обязательные поля, устанавливайте additionalProperties=false там, где это требует строгий режим, и проверяйте отказы, неполные ответы и изменение схемы. Наличие JSON-объекта само по себе не означает успех операции.

Безопасность и данные после миграции

Миграция меняет границу хранения состояния, поэтому её нужно рассматривать как архитектурное изменение безопасности. Храните API-ключи только на доверенном сервере, аутентифицируйте сессии и связывайте Conversation или локальную стенограмму с серверным пользователем. Не помещайте секреты, токены авторизации и неограниченные запросы к базе в инструкции или описания инструментов.

Для каждого запроса выбирайте минимальный набор инструментов. Разделяйте функции чтения и записи, требуйте явного подтверждения важных действий и выполняйте авторизацию независимо от вывода модели. Считайте полученные файлы, веб-страницы и ответы удалённого MCP недоверенными данными. У удалённых MCP-серверов есть собственные правила хранения, а размещённые контейнеры Code Interpreter могут держать временное состояние во время работы. Эти ограничения перечислены в руководстве по контролю данных.

Решите для каждого потока, нужен ли store, Conversation или стенограмма в вашей базе. Текущая документация говорит, что данные API не используются для обучения моделей OpenAI без явного согласия, но это не заменяет анализ хранения, доступа, удаления, региональной обработки и поставщиков. store=false не является общей политикой удаления и не делает Conversation временным.

Ограничивайте вход и выход, применяйте модерацию там, где она нужна, и организуйте проверку человеком для решений с высоким риском. В рекомендациях OpenAI по безопасности отдельно советуются adversarial-тесты против prompt injection, модерация и участие человека. Записывайте ID запросов и типы событий, но маскируйте пользовательский текст, ключи, аргументы функций и результаты инструментов согласно политике.

Частые ошибки миграции

Старая конечная точка возвращает ошибку

После 26 августа 2026 года запросы к Assistants — это дефект миграции. Удалите старый путь клиента, а не повторяйте его. Если фоновый worker всё ещё опрашивает Run ID, разверните worker Responses и замените поля thread_id и run_id на идентификаторы сессии и Response.

Ответ пустой или парсер падает

Output Responses — неоднородный список элементов. output_text удобен для обычного текста, но вызов инструмента, отказ или неполный ответ требуют проверки статуса и типов элементов. Не берите первый элемент по индексу, считая его сообщением.

Модель повторяет контекст или расходы растут

Выберите одну стратегию состояния и правило обрезки. previous_response_id не делает старые входные токены бесплатными, а копирование стенограммы одновременно в Conversation и input дублирует контекст. В staging измеряйте входные и выходные токены на реалистичных длинных диалогах.

Функция выполняется дважды

Повторы, параллельные вызовы, сетевые тайм-ауты и переподключения могут повторить вызов. Добавьте каждой функции с побочным эффектом идемпотентный ключ из call ID и пользователя, затем перед применением проверьте бизнес-транзакцию. Успешное сообщение модели не доказывает однократное выполнение функции.

Старые файлы или результаты поиска исчезли

Инвентаризируйте vector store, ID файлов, сроки действия и разрешения отдельно от истории Thread. Восстановите поддерживаемый путь поиска, проверьте доступ каждого арендатора и протестируйте цитаты и пустые результаты. Преобразование конфигурации Assistant не означает копирование файлов.

Чек-лист миграции

Для каждого production-потока выполните шаги по порядку:

  1. Запишите зависимости от старых Assistant, Thread, Run, файлов, vector store, инструментов, Prompt и метаданных.
  2. Перенесите пользовательские инструкции и схемы инструментов в версионируемую конфигурацию.
  3. Выберите модель Responses и подтвердите инструменты, мультимодальный ввод, structured outputs и региональную доступность.
  4. Выберите единственную стратегию состояния: stateless-элементы, previous_response_id или Conversations.
  5. Сопоставьте messages с input, choices с output, а извлечение текста с output_text.
  6. Перепишите определения функций и реализуйте явный ограниченный цикл инструментов.
  7. По одной возможности восстановите file search, Code Interpreter, web search, MCP, streaming и structured outputs.
  8. Импортируйте только историю, которой владеет приложение, сохранив порядок, идентичности, вложения, вызовы и удаление.
  9. Добавьте авторизацию, лимиты ввода, модерацию, идемпотентность, маскированные логи и одобрение побочных действий.
  10. Запустите golden-диалоги, adversarial-запросы, ошибки инструментов, повторы, отказы, длинный контекст и параллельные сессии.
  11. Сравните ответы, цитаты, эффекты инструментов, токены, задержку, ошибки и хранение.
  12. Выпустите изменение под feature flag, остановите старые workers, наблюдайте ошибки Responses и оставьте откат без sunset API.
  13. Удаляйте старый код Assistant и ключи только после проверки экспорта, аудита и процедур поддержки.

Про архитектуру системы читайте в руководстве по production-архитектуре AI-агента. Наборы регрессий и поведенческие проверки описаны в руководстве по evals AI-агентов.

Как понять, что миграция завершена

Миграция завершена, когда ни один production-путь не зависит от ресурсов Assistants, для каждой сессии назначен владелец состояния, каждый вызов инструмента авторизован и защищён от повторного выполнения, а контракт output Responses покрыт тестами. Храните запись миграции с snapshot моделей, версиями Prompt или конфигурации запроса, схемами, решениями о хранении и известными отказами. Пересматривайте её при изменении Responses API или выбранной модели, поскольку отключение старого fallback не отменяет постоянную оценку качества.

Ещё публикации