Не работают инструменты GPT‑6.1 Sol? Перенос полного цикла на Responses

Исправьте интерфейс и параметры GPT‑6.1 Sol, сохраните call_id и состояние, проверьте аргументы и ограничьте цикл. Полный Python-пример и офлайн-тесты.

Контурный рисунок трафарета на тёплом сером фоне с заголовком GPT-6.1 Sol Tools.

Если после замены имени модели на gpt-6.1-sol перестали работать инструменты, сначала проверьте интерфейс, а не промпт. Для вызова инструментов GPT‑6.1 Sol нужен Responses API. Chat Completions поддерживается без вызова инструментов. Уровни рассуждений none и minimal также не поддерживаются. Замена только имени модели может оставить несовместимый запрос.

Здесь разобран полный цикл чтения учебного склада: запрос, вызов функции, выполнение в приложении и возврат результата. Python-файл включает офлайн-тесты с синтетическими ответами. Они проверяют нашу логику, а не платный API и не качество модели. Технические условия сверены 30 сентября 2026 года со страницей модели, руководством по миграции и документацией функций.

Найдите слой, на котором произошёл сбой

Клиент собирает запрос; API возвращает структурированный вызов; приложение исполняет разрешённую функцию; затем передаёт результат модели. Фраза «инструменты не работают» не различает эти четыре этапа.

СимптомЧто проверитьДействие
Запрос отклонён до выводаИнтерфейс и поляResponses и совместимые параметры
Только текст вместо вызоваПереданы ли tools, инструкции и выбор инструментаПросмотреть структурированный output
Вызов есть, исполнения нетДиспетчер приложенияИсполнить функцию из разрешённого списка
Следующий шаг не связывает результатcall_id и историяВернуть исходный ID и сохранить элементы
Цикл повторяетсяОшибки, недостающие данные, лимитЯвный результат ошибки и граница повторов
Интерфейс пишет «готово» без результатаУсловие успехаПотребовать подтверждение реального выполнения

Не повторяйте запрос до определения категории ошибки. Неподдерживаемое поле не станет допустимым с пятой попытки. Ошибка авторизации также требует другого решения, чем ограничение частоты.

Документация Sol с требованием Responses для инструментов

Настоящий снимок английской документации. Он подтверждает ограничение API, но не запуск складской функции.

Измените структуру запроса

В определении функции Responses поля находятся непосредственно в объекте инструмента. Обёртку function из Chat Completions нельзя переносить без изменений:

tool = {
    "type": "function",
    "name": "lookup_stock",
    "description": "Read stock for one known product SKU.",
    "parameters": {
        "type": "object",
        "properties": {"sku": {"type": "string"}},
        "required": ["sku"],
        "additionalProperties": False,
    },
    "strict": True,
}

Минимальный запрос использует client.responses.create, input, reasoning={"effort": "medium"} и подходящий max_output_tokens. Для Sol допустимы low, medium, high, xhigh, max. Название Ultra в продукте не является допустимой строкой API.

Руководство по миграции требует убрать несовместимые параметры выборки для этих запросов, включая temperature, top_p, top_logprobs, а также соответствующие запросы выходных log probabilities. Прокси или SDK могут добавить значение по умолчанию. Если ошибка называет поле, проверьте окончательную конфигурацию, а не только строку с моделью. В диагностике храните маршрут, модель, названия параметров, статус и ID запроса без секретов.

Запустите полный пример только для чтения

Скачайте tool_loop.py. В нём есть схема, два вымышленных товара, проверка аргументов, диспетчер, ограниченный цикл и тесты. Это учебные данные, а не реальные остатки.

С Python 3.9 или новее сначала выполните:

python3 tool_loop.py --self-test

Ожидается offline checks passed. Этот режим использует стандартную библиотеку, не читает API-ключ, не устанавливает клиент и не обращается к сети. Проверяются корректный вызов, повреждённый JSON, неверные аргументы, неизвестные функция и SKU, незавершённый ответ, лимит раундов и запрет ложного успеха.

Для необязательного платного запуска в своём разрешённом API-проекте:

python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade openai
# Задайте OPENAI_API_KEY в окружении; не сохраняйте ключ в репозитории.
python tool_loop.py --live

Режим --live создаёт оплачиваемое использование API и требует доступа к модели. Для статьи он не запускался. Скрипт явно задаёт официальный адрес OpenAI, чтобы сторонняя переменная base URL не изменила маршрут. Он запрашивает DEMO-A, для которого локальный образец содержит 12 единиц. Успех требует настоящего lookup_stock, соответствующего результата и финального ответа с правильным количеством. Одной убедительной фразы недостаточно.

Сохраните версию SDK своего запуска. Команда установки берёт актуальный официальный пакет, а не означает, что эта среда прошла здесь платный интеграционный тест.

Сохраните элементы ответа и исходный call_id

Ключевые действия цикла:

history.extend(response.output)
for call in calls:
    result = dispatch(call.name, call.arguments)
    history.append({
        "type": "function_call_output",
        "call_id": call.call_id,
        "output": json.dumps(result),
    })

Сохраняйте весь response.output, включая необходимые элементы рассуждений. Нельзя восстановить полный протокол из response.output_text: текст — лишь часть ответа. Нескольким вызовам нужны отдельные результаты с их собственными ID. Имя функции не заменяет ID, и приложение не должно придумывать новый идентификатор.

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

Если вызовов больше нет, скрипт требует завершённый статус, непустой текст и ранее полученный корректный результат DEMO-A=12. Неизвестная функция или SKU не засчитываются. При этом соответствие итоговой естественной фразы данным нужно проверить отдельно. Отказ, незавершённость, сетевой сбой и пустой вывод не превращаются в сообщение об успехе.

Проверка аргументов остаётся обязанностью приложения

Строгая схема помогает ограничить аргументы, но не заменяет проверку сервера и не предоставляет полномочий. Диспетчер разбирает JSON, требует ровно одно строковое поле sku и допускает только известную функцию. Для отсутствующего товара возвращается структурированный unknown_sku. Команды оболочки, предложенные моделью, не исполняются, а текст инструмента не становится новой инструкцией.

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

Для записи нужны отдельные меры. После тайм-аута действие могло уже завершиться на сервере; повтор способен выполнить его дважды. Нужны ID операций, устойчивое состояние и подходящее согласование платежей, удаления или развёртывания. Пример намеренно только читает данные: он обучает протоколу, а не решает все вопросы авторизации записей.

Ограничьте время, раунды и бюджет

Число модельных раундов ограничено. Для учебного запуска через реальный API заданы тайм-аут SDK и отключение автоматических повторов, чтобы сбои были видимыми. Это учебные настройки, не универсальные параметры продакшена.

Лимит раундов не является денежным лимитом. В каждом обращении разное количество данных, история может пересечь порог длинного контекста. Для сервиса добавьте журнал и бюджет по руководству стоимости.

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

Приёмка перед заменой старого пути

В изолированном проекте подтвердите фактический маршрут Responses и модель, структурированный вызов, исполнение разрешённой функции, сохранённые элементы и точный ID результата следующего шага. Сверьте финальный ответ с образцом. Затем перенесите намеренные сбои из офлайн-набора в интеграционные проверки.

Оставьте обратимую конфигурацию модели и интерфейса. Не меняйте одновременно промпт, инструменты и разрешения: иначе источник регрессии будет неясен. Общий переход на Sol (на английском) рассматривает решение об обновлении, а настройка Codex — продуктовый клиент. Они не заменяют проверку собственного API-цикла.