Гайд · TNWS AI
Как настроить Async Tool Calling в OpenAI API для долгих операций
Пошаговая схема Async Tool Calling в OpenAI API: постановка задачи, идентификатор операции, опрос статуса, идемпотентность и тест тайм-аута.
Задача и применимость
Цель руководства — не держать запрос открытым, пока внешний инструмент строит отчёт, обрабатывает видео или запускает длительную выборку. Приложение ставит работу в очередь, сохраняет идентификатор и продолжает диалог, когда результат действительно готов.
Сведения и названия функций проверены 12 сентября 2026 года. Основной источник — официальная документация разработчика, ссылка приведена в конце. Если интерфейс, модель или SDK ведут себя иначе, остановитесь и сверьте актуальный пример: статья не должна заменять документацию в части изменяемых параметров.
Что подтверждено документацией
Async Tool Calling предназначен для инструментов, результат которых появляется не сразу. Надёжная интеграция отделяет принятие задания от его завершения и связывает продолжение с устойчивым идентификатором операции.
Здесь важно разделять подтверждённый механизм и проектное решение. Названия API и полей берутся из источника. Ограничения прав, схема журналирования, критерии приёмки и тестовые данные настраиваются в вашем приложении. Они не появляются автоматически после подключения модели.
Что подготовить до первого запроса
Создайте тестовый проект и отдельный ключ с минимальными правами. Секрет держите в переменной окружения или менеджере секретов; не помещайте его в браузерный JavaScript, промпт, репозиторий или скриншот. Для браузерного агента используйте отдельный профиль без рабочих cookie. Для локальной модели зафиксируйте имя модели и сборку среды.
Подготовьте таблицу приёмки ещё до запуска. Минимальные столбцы: case_id, input, expected_action, expected_output, actual_action, actual_output, source, status, error_type. Возьмите не один удобный пример, а хотя бы десять обезличенных случаев: обычный, пустой, неполный, с неверным идентификатором, с противоречием, дубль, тайм-аут и потенциальная prompt injection.
Не используйте реальные персональные данные для первой проверки. Замените имена, адреса и номера, сохранив структуру. Для каждого числового результата запишите допустимое значение заранее. Иначе проверяющий легко принимает правдоподобный, но неверный ответ.
Пошаговая настройка
- Создайте функцию start_report(period, department, idempotency_key), которая быстро возвращает job_id и статус queued. Ключ идемпотентности строится на стороне приложения и повторно используется при сетевом повторе.
- Опишите асинхронный инструмент по официальной схеме. Не обещайте модели мгновенный результат: явно укажите возможные состояния queued, running, completed и failed.
- Сохраните связь response_id, tool_call_id, job_id и пользователя в транзакции. Без этой таблицы поздний результат легко присоединить не к тому диалогу.
- Получайте статус контролируемым опросом или внутренним событием. Применяйте экспоненциальную задержку и конечный дедлайн; не опрашивайте очередь в бесконечном цикле.
- После completed передайте результат в продолжение исходного ответа. При failed передайте структурированную ошибку с retryable и не просите модель скрыть сбой.
После каждого шага сохраняйте не только текст модели, но и техническое состояние: идентификатор запроса, выбранный инструмент, проверенные аргументы, длительность, итоговый статус и факт побочного эффекта. Значение секрета, полное рассуждение модели и чувствительные поля в журнал не включайте.
Копируемый шаблон инструкции
Если для ответа нужен месячный отчёт, вызови start_report ровно один раз. Пока статус queued или running, скажи, что отчёт готовится, без выдуманных цифр. После completed сверь period и department в результате. При failed объясни причину и разрешай повтор только если retryable=true.
Общие правила:
1. Используй только переданные данные и разрешённые инструменты.
2. Не заполняй пропущенные значения догадкой.
3. Перед действием проверь идентификаторы, права и границы задачи.
4. При конфликте данных верни status=needs_review и назови конфликт.
5. Не выполняй отправку, удаление, оплату или раскрытие секрета без отдельного подтверждения.
6. В конце перечисли выполненные действия и источник каждого изменяемого факта.
Шаблон полезен именно как контракт. Его надо дополнять схемой полей и перечнем разрешённых действий конкретной системы. Фразы «будь внимательным» недостаточно: ограничение должно проверяться кодом до фактического вызова.
Реалистичный пример входа и ожидаемого результата
Вход: подготовь отчёт отдела Support за август 2026. Первый вызов возвращает job_id=rpt_731, queued; через 40 секунд статус completed и 1 842 обработанных обращения.
Ожидается один job с тем же idempotency_key, промежуточное сообщение без цифр и финальная сводка, где значение 1 842 взято из результата rpt_731. Повторный webhook не создаёт вторую публикацию.
Это ожидаемый результат теста, а не заявление о проведённом сравнительном исследовании. При собственной реализации сохраните фактический вывод рядом с expected и отметьте различия. Если модель получила правильный текст, но выполнила лишний вызов или открыла запрещённый адрес, тест считается проваленным.
Как проверять результат по уровням
Первый уровень — транспорт. Запрос завершился, ответ читается, идентификатор сохранён. HTTP 200 сам по себе не доказывает правильность. Тайм-аут не равен отказу операции: перед повтором проверьте, не завершилась ли она на сервере.
Второй уровень — структура. Обязательные поля присутствуют, типы совпадают, JSON разбирается только после получения полного результата. Неизвестные поля либо отклоняются, либо явно сохраняются отдельно. Пустая строка не превращается в ноль или «неизвестно» без правила.
Третий уровень — смысл. Сопоставьте каждый факт с входом или результатом инструмента. Числа пересчитайте обычным кодом. Идентификаторы сравните посимвольно. Если источник не вернул значение, модель не должна создавать правдоподобную замену.
Четвёртый уровень — действие. Проверьте журнал внешней системы: сколько записей создано, какие поля изменены, был ли вызван запрещённый инструмент. Для read-only сценария любое изменение означает провал, даже если финальный текст выглядит верно.
Контроль в рабочей системе
Разделите защиту на слои. На входе применяйте схему и предел размера. Перед инструментом проверяйте авторизацию, allowlist и типы аргументов. После ответа проверяйте структуру и бизнес-правила. Перед внешним побочным эффектом выполняйте подтверждение или идемпотентную транзакцию.
Задайте конечные бюджеты: число шагов, вызовов, общий дедлайн и максимальный размер результата. Значения выбирайте по своей системе и нагрузочному тесту, а не копируйте из чужой статьи. При исчерпании бюджета возвращайте явный status=limit_reached, а не частичный результат под видом полного.
Для повторяемости храните версию модели, SDK, системной инструкции и тестового набора. При изменении любого компонента запускайте регрессию. Не сравнивайте варианты только по впечатлению: считайте количество прошедших кейсов и публикуйте метрику лишь после реального измерения.
Негативные тесты
- Пустой ввод: система возвращает понятную ошибку и не вызывает инструмент.
- Похожий, но неверный идентификатор: значение отклоняется до запроса к внешней системе.
- Prompt injection во входном документе или странице: текст не меняет системные правила и не раскрывает секрет.
- Дублированная доставка: идемпотентная операция не создаёт второй объект.
- Тайм-аут после отправки: приложение сначала проверяет состояние, затем решает вопрос о повторе.
- Ответ с пропущенным обязательным полем: результат не проходит бизнес-валидацию.
Классифицируйте сбои: format_error, unsupported_claim, wrong_action, authorization_error, security_error и transport_error. Такая разметка показывает, что исправлять: промпт, схему, права, обработчик или инфраструктуру. Один общий статус «не работает» почти бесполезен.
Чек-лист финальной проверки
- Название функции, поля и режим сверены с официальной документацией 12 сентября 2026 года.
- Ключ находится только на сервере или в менеджере секретов.
- Тестовые данные обезличены, ожидаемый результат записан до запуска.
- Аргументы валидируются кодом до выполнения инструмента.
- Опасные действия требуют подтверждения непосредственно перед выполнением.
- Есть лимит шагов, времени, размера и повторов.
- Проверены обычный, пустой, конфликтный, вредоносный и тайм-аутный случаи.
- HTTP-статус, структура, факты и побочные эффекты проверяются раздельно.
- Журнал позволяет восстановить последовательность без раскрытия секретов.
- После смены модели, SDK или схемы запускается регрессия.
Ограничения
Главные риски — дубли при повторной доставке, потерянная связь с диалогом и бесконечный опрос. Для операций с побочными эффектами храните идемпотентность в базе, а не в памяти одного процесса.
Доступность конкретной модели, провайдера или возможности зависит от аккаунта и может измениться. В этом материале намеренно нет неподтверждённых цен и лимитов. Перед рабочим запуском проверьте страницу документации, консоль своего проекта и договорные ограничения региона.
FAQ
Можно ли начинать с рабочих данных?
Нет. Начните с обезличенной копии и минимальных прав. Рабочий доступ выдавайте после позитивных и негативных тестов.
Почему HTTP 200 недостаточно?
Он говорит об успешной доставке, но не подтверждает факты, правильный инструмент или отсутствие побочного эффекта. Нужны проверки структуры, смысла и журнала внешней системы.
Как поступить при тайм-ауте?
Сначала найдите состояние прошлого вызова по идентификатору. Слепой повтор может создать дубль или повторно выполнить необратимое действие.
Когда повторять тесты?
После смены модели, SDK, промпта, схемы, набора инструментов, браузерного окружения или правил доступа.
Официальный первоисточник
- Документация разработчика — механизм и названия параметров проверены 12 сентября 2026 года.
Частые вопросы
Можно ли проверять интеграцию сразу на рабочих данных?
Нет. Сначала используйте обезличенную копию, тестовую учётную запись и минимальные права. Рабочие данные подключают только после прохождения позитивных и негативных тестов.
Достаточно ли получить HTTP 200?
Нет. Успешный HTTP-статус подтверждает доставку, но не правильность действия. Проверяйте структуру, факты, побочные эффекты, журналы и заранее записанный ожидаемый результат.
Когда нужно повторять приёмочные тесты?
После смены модели, SDK, системной инструкции, набора инструментов, схемы ответа, браузерного окружения или политики прав.
Что делать при тайм-ауте?
Не повторять опасное действие вслепую. Сначала проверьте состояние предыдущего вызова по его идентификатору или журналу, затем решите, безопасен ли повтор.
Читайте также
Как обработать пакет запросов через OpenAI Batch API и сверить результаты
Как подготовить JSONL для Batch API, связать ответы с исходными строками, обработать ошибки и проверить выборку.
Как запустить фоновую задачу в OpenAI Responses API и дождаться результата
Практический сценарий Background mode: создать долгий запрос, сохранить response ID, проверить статус и обработать ошибку.
Как использовать OpenAI Batch API для больших пачек запросов
Пошаговый гайд по Batch API: подготовка JSONL, уникальные идентификаторы, проверка статуса и сопоставление результатов без путаницы.
Комментарии
Пока тихо. Скажите первое слово