← Все статьи

OpenAI Assistants API отключается 26 августа: финальный чек-лист миграции

OpenAI Assistants API полностью отключается 26 августа 2026 года — через 14 дней. Этот финальный чек-лист охватывает маппинг объектов Assistants→Responses, переписывание tool loop, экспорт Thread, ловушку с Prompts и интеграционные тесты перед переключением.

· TheRouter

OpenAI Assistants API отключается 26 августа: финальный чек-лист миграции

Assistants API жёстко отключается 26 августа 2026 года — через 14 дней. После этой даты все вызовы openai.beta.assistants.* и openai.beta.threads.* будут возвращать ошибку. О продлении сроков не объявлялось (страница deprecations OpenAI, получено 2026-08-12).

В июне мы опубликовали концептуальный гайд по миграции. Эта статья — его операционное дополнение: чек-лист, который можно передать команде и пройти за оставшиеся 14 дней. Каждый шаг содержит команду проверки или конкретный тест.

Что произойдёт 27 августа

После отключения все endpoint Assistants API вернут HTTP-ошибки. История Thread, хранившаяся на сервере, станет недоступна через Assistants API. Если вы не экспортировали сообщения Thread до дедлайна, эти данные будут потеряны — OpenAI не гарантировал окно экспорта после отключения (гайд миграции Assistants, получено 2026-08-12).

Замена — Responses API. Chat Completions по-прежнему поддерживается и не затронут этим отключением (гайд Migrate to Responses API, получено 2026-08-12).

Маппинг объектов: Assistants → Responses

Прежде чем трогать код, разберитесь в переименовании:

Assistants APIЭквивалент в Responses APIЧто изменилось
AssistantPrompt (только dashboard, тоже отключается 30 ноября)Конфигурация переезжает в код или в Prompt-объекты
ThreadConversationХранит item stream (сообщения, tool call, output), а не только сообщения
RunResponseСинхронный запрос-ответ; для простых вызовов polling не нужен
Run stepItemТипизированное объединение: message, tool_call, tool_call_output, reasoning
openai.beta.threads.messages.create()Input items в запросе ResponseСообщения — часть тела запроса
openai.beta.threads.runs.create()openai.responses.create()Один вызов вместо create + poll

Источник: гайд миграции Assistants, получено 2026-08-12.

Ловушка с Prompts: двойная миграция

Гайд миграции OpenAI предлагает конвертировать Assistant в Prompt через dashboard. Однако Prompt-объекты тоже объявлены deprecated, отключение запланировано на 30 ноября 2026 (страница deprecations OpenAI, получено 2026-08-12).

Если мигрировать Assistant в Prompt сейчас, через три месяца придётся мигрировать снова. Более надёжный путь — перенести конфигурацию Assistant (instructions, tool schemas, temperature, model) прямо в код приложения или в конфигурационный файл под контролем версий. Промежуточный шаг с Prompts можно пропустить.

Чек-лист: 14 дней до переключения

Шаг 1 — Аудит всех вызовов Assistants

Запустите grep по кодовой базе:

grep -rn "openai\.beta\.\(assistants\|threads\)" \
  --include="*.py" --include="*.ts" --include="*.js" \
  app/ services/ workers/ scripts/ lib/

Классифицируйте каждое совпадение:

  • A — Новые сессии чата. Нет зависимости от истории Thread. Мигрируйте первыми.
  • B — Долгоживущие Thread. Нужен экспорт истории до отключения. Запланируйте backfill.
  • C — Агенты с активным использованием tool. Требуют явного переписывания tool loop. Максимальный объём работ.
  • D — File search / code interpreter. Проверьте, что эквиваленты в Responses API покрывают ваш use case.

Шаг 2 — Экспортируйте историю Thread прямо сейчас

Не откладывайте. Thread станут недоступны после отключения. Экспортируйте все активные Thread:

import json
from openai import OpenAI

client = OpenAI()

def export_thread(thread_id: str) -> list[dict]:
    messages = []
    for page in client.beta.threads.messages.list(
        thread_id=thread_id, order="asc"
    ).iter_pages():
        messages.extend(page.data)
    return [m.model_dump() for m in messages]

thread_ids = ["thread_abc123", "thread_def456"]
for tid in thread_ids:
    data = export_thread(tid)
    with open(f"export_{tid}.json", "w") as f:
        json.dump(data, f, indent=2)
    print(f"Exported {len(data)} messages from {tid}")

Проверка: убедитесь, что каждый экспортированный файл содержит ожидаемое количество сообщений.

Шаг 3 — Новые сессии через Responses API

Самый простой путь миграции — прекратить создание новых Assistant и Thread. Новые пользовательские чаты направляются через Responses API.

До (Assistants):

thread = client.beta.threads.create()
client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Explain API routing"
)
run = client.beta.threads.runs.create_and_poll(
    thread_id=thread.id,
    assistant_id="asst_xxx"
)
messages = client.beta.threads.messages.list(thread_id=thread.id)
answer = messages.data[0].content[0].text.value

После (Responses):

response = client.responses.create(
    model="gpt-5.5",
    instructions="You are a helpful API routing expert.",
    input="Explain API routing"
)
answer = response.output_text

Для multi-turn передавайте previous_response_id или используйте Conversations:

resp1 = client.responses.create(
    model="gpt-5.5",
    input="What is API routing?"
)

resp2 = client.responses.create(
    model="gpt-5.5",
    input="How does fallback work?",
    previous_response_id=resp1.id
)

Шаг 4 — Переписывание tool loop

Assistants выполняли tool через polling-цикл статуса Run. Responses API делает выполнение tool явным: вы получаете tool_call item, сами выполняете tool и отправляете результат как tool_call_output item.

До (Assistants tool loop):

run = client.beta.threads.runs.create(
    thread_id=thread.id,
    assistant_id="asst_xxx"
)
while run.status in ("queued", "in_progress"):
    time.sleep(1)
    run = client.beta.threads.runs.retrieve(
        thread_id=thread.id, run_id=run.id
    )
if run.status == "requires_action":
    tool_calls = run.required_action.submit_tool_outputs.tool_calls
    outputs = [execute_tool(tc) for tc in tool_calls]
    run = client.beta.threads.runs.submit_tool_outputs_and_poll(
        thread_id=thread.id,
        run_id=run.id,
        tool_outputs=outputs
    )

После (Responses tool loop):

response = client.responses.create(
    model="gpt-5.5",
    instructions="You are a helpful assistant.",
    input="What is the weather in Tokyo?",
    tools=[{
        "type": "function",
        "name": "get_weather",
        "description": "Get current weather",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {"type": "string"}
            },
            "required": ["location"]
        }
    }]
)

for item in response.output:
    if item.type == "function_call":
        result = execute_tool(item.name, json.loads(item.arguments))
        response = client.responses.create(
            model="gpt-5.5",
            previous_response_id=response.id,
            input=[{
                "type": "function_call_output",
                "call_id": item.call_id,
                "output": json.dumps(result)
            }]
        )

Шаг 5 — Backfill истории Thread в Conversations

Используйте экспорт из шага 2 для заполнения Conversations:

import json

def backfill_thread_to_conversation(export_path: str) -> str:
    with open(export_path) as f:
        messages = json.load(f)

    items = []
    for m in messages:
        role = m["role"]
        for content_block in m["content"]:
            if content_block["type"] == "text":
                content_type = (
                    "input_text" if role == "user" else "output_text"
                )
                items.append({
                    "role": role,
                    "content": [
                        {"type": content_type, "text": content_block["text"]["value"]}
                    ]
                })

    conversation = client.conversations.create(items=items)
    return conversation.id

Скрипт адаптирован из гайда миграции Assistants, получено 2026-08-12.

Проверка: после backfill отправьте тестовое сообщение через Conversation и убедитесь, что модель учитывает импортированную историю.

Шаг 6 — File search и code interpreter

Оба tool доступны в Responses API, но интерфейс изменился:

  • File search — vector store по-прежнему работают. Responses API возвращает file_search_call item и message item с annotation, указывающими на исходные файлы. Polling Run step больше не нужен — результаты приходят в response output (гайд File search OpenAI, получено 2026-08-12).
  • Code interpreter — возвращает code_interpreter_call item. Sandbox-исполнение происходит на сервере; результаты включают текстовый вывод и сгенерированные файлы.

Протестируйте оба tool с известным запросом до переключения на production.

Шаг 7 — Интеграционные тесты

Тестовые сценарии должны покрывать:

  1. Простую генерацию текста (без tool)
  2. Multi-turn conversation с previous_response_id
  3. Tool calling как минимум с одной function
  4. File search с известным vector store
  5. SSE streaming с обработкой событий
  6. Обработку ошибок (rate limit, невалидная model, некорректный input)

Запустите оба пути в shadow-режиме на 24–48 часов. Сравните latency, качество output и частоту ошибок перед переключением.

Шаг 8 — Переключение через feature flag

Разверните миграцию на Responses за feature flag:

  1. Включите для внутреннего/staging-трафика
  2. 10% production-трафика, мониторинг 24 часа
  3. Увеличение до 50%, затем 100%
  4. Удаление кода Assistants через неделю стабильной работы

До 26 августа держите код Assistants как путь отката. После этой даты он перестанет работать — удалите.

Пользователи Azure OpenAI

Azure OpenAI подтвердил ту же дату отключения — 26 августа 2026 (Microsoft Learn, получено 2026-08-12). Путь миграции аналогичен.

Особенности Azure:

  • Deployment name не меняется, API version обновляется
  • Убедитесь, что ваша Azure API version поддерживает endpoint Responses
  • Azure Content Safety фильтры работают с Responses так же, как с Assistants

Маршрутизация через gateway

Если вы направляете запросы OpenAI через gateway вроде TheRouter, протестируйте следующие пути:

  • Endpoint /v1/responses — убедитесь, что gateway корректно пересылает запросы в формате Responses
  • Streaming — SSE-события Responses отличаются по формату от Chat Completions
  • Tool call — типы item function_call и function_call_output отличаются от tool_calls в Chat Completions
  • Fallback routing — если gateway переключается с OpenAI на другого провайдера, целевой провайдер тоже должен поддерживать формат Responses API, либо gateway должен транслировать формат

TheRouter маршрутизирует OpenAI-совместимые запросы через настроенных провайдеров и поддерживает provider/model routing и fallback в рамках реализованных продуктовых путей. Конкретные комбинации model и tool нужно протестировать до переключения production.

  1. Меняйте три значения, а не три SDK. Замените api_key, base_url и model в существующем клиенте OpenAI. Код запроса и ответа оставьте неизменным.
  2. Сопоставьте model ID явно. ID модели у целевого провайдера почти никогда не совпадает с OpenAI ID. Держите словарь { openai_id: target_id } вне бизнес-логики.
  3. Проверьте формат streaming. SSE-чанки должны соответствовать контракту OpenAI: data: {...} + data: [DONE]. Прогоните один streaming вызов до продакшена.
  4. Проверьте rate-limit заголовки. Некоторые провайдеры не возвращают x-ratelimit-*. Добавьте обёртку с безопасным дефолтом.
  5. Оставьте путь отката. Раскатайте замену под feature flag, гоняйте оба endpoint в shadow-режиме 24 часа, затем переключайтесь.

Хронология

ДатаСобытие
26 августа 2025Объявление о deprecated Assistants API
3 июня 2026Объявление о deprecated reusable Prompts
26 августа 2026Жёсткое отключение Assistants API
30 ноября 2026Отключение reusable Prompts

FAQ

В: Chat Completions тоже отключат? Нет. Chat Completions по-прежнему поддерживается. Responses API рекомендуется для новых проектов, но Chat Completions не объявлен deprecated (гайд Migrate to Responses API, получено 2026-08-12).

В: Можно получить продление? OpenAI указывает, что разработчики могут обеспечить продолжение доступа через выделенные мощности. Для этого нужно связаться с отделом продаж (страница deprecations OpenAI, получено 2026-08-12). Публичного продления не объявлялось.

В: Что будет с моими vector store? Vector store останутся доступны. File search tool в Responses API использует ту же инфраструктуру vector store. Перезагружать файлы не нужно.

В: Conversations или клиентское управление состоянием? Для коротких сессий (одна задача, без многодневной непрерывности) управляйте состоянием на клиенте через previous_response_id. Для сессий, где пользователь возвращается к чату через дни или недели, используйте Conversations для серверной персистенции.

В: Нужно обновлять Python / Node SDK? Оба официальных SDK уже поддерживают client.responses.create(). Обновите до последней версии. Namespace openai.beta.* перестанет работать после 26 августа.

Источники

Помощь и контакты