Programmatic Tool Calling vs Function Calling: чем отличается и как использовать GPT-5.6 Sol
Programmatic Tool Calling (PTC) — ключевая инновация GPT-5.6 Sol, которая позволяет модели не вызывать инструменты, а писать код для их оркестрации. Вместо одного вызова функции за другим, модель генерирует полноценный скрипт, который выполняет цепочку операций с условной логикой, циклами и обработкой ошибок. Разбираем, чем PTC отличается от классического Function Calling, и как это радикально меняет разработку AI-агентов.
Как работает Function Calling (GPT-4o и более ранние версии)
Function Calling — это механизм, при котором модель определяет, какую функцию нужно вызвать, и возвращает JSON с параметрами вызова. Разработчик сам реализует логику вызова, обработки ответа и маршрутизации.
# Function Calling: модель выбирает, какую функцию вызвать
response = openai.chat.completions.create(
model="gpt-4o",
tools=[{
"type": "function",
"function": {
"name": "get_weather",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
}
}
}
}],
messages=[{"role": "user", "content": "Какая погода в Москве?"}]
)
# Разработчик получает JSON и сам вызывает функцию
tool_call = response.choices[0].message.tool_calls[0]
result = get_weather(**json.loads(tool_call.function.arguments))
Проблема: если нужно выполнить цепочку из 5–10 вызовов с условной логикой, разработчику приходится писать собственный раннер-оркестратор. Каждый вызов — отдельный round-trip к API, а логика ветвления остаётся на стороне приложения.
Как работает Programmatic Tool Calling (GPT-5.6 Sol)
PTC в GPT-5.6 Sol генерирует исполняемый код (Python или псевдокод), который сразу содержит всю логику оркестрации:
# GPT-5.6 Sol генерирует код для выполнения цепочки операций
response = openai.chat.completions.create(
model="gpt-5.6-sol",
tools=[...], # те же функции
messages=[{
"role": "user",
"content": "Найди отели в Париже на 3 дня, сравни цены, выбери лучший вариант и отправь бронь на почту"
}],
# Включаем режим PTC
tool_choice="programmatic"
)
# Модель возвращает не JSON, а исполняемый код
# response содержит programmatic_tool_call.code
Модель возвращает не список JSON-объектов, а полноценный код:
# Код, сгенерированный GPT-5.6 Sol
def execute_booking_pipeline():
# Шаг 1: Поиск отелей
hotels = search_hotels(city="Paris", check_in="2026-08-01", check_out="2026-08-04")
# Шаг 2: Сортировка по цене
hotels.sort(key=lambda h: h["price_per_night"])
best = hotels[0]
# Шаг 3: Проверка отзывов — только если рейтинг ниже 4.0
if best["rating"] < 4.0:
best = hotels[1] # Берём следующий
# Шаг 4: Бронирование
booking = create_booking(hotel_id=best["id"],
dates=["2026-08-01", "2026-08-04"])
# Шаг 5: Отправка подтверждения
send_email(to="user@example.com",
subject=f"Бронь {booking['id']} подтверждена",
body=f"Отель: {best['name']}, сумма: {booking['total']}")
return booking
Сравнение: PTC vs Function Calling
| Параметр | Function Calling | Programmatic Tool Calling (PTC) |
|---|---|---|
| Формат ответа | JSON с параметрами функции | Исполняемый код |
| Оркестрация | Внешняя (код разработчика) | Внутренняя (код модели) |
| Цепочки вызовов | Требуют round-trip на каждый шаг | Один вызов на всю цепочку |
| Условная логика | На стороне приложения | В коде модели |
| Потребление токенов | Высокое (повторные вызовы) | На 63,5% ниже |
| Обработка ошибок | Ручная | Автоматическая (try/catch) |
| Поддержка циклов | Нет (только последовательные вызовы) | Да (for, while) |
Как переписать агента с Function Calling на PTC
Шаг 1: Обновить модель
# Было
model="gpt-4o"
# Стало
model="gpt-5.6-sol"
Шаг 2: Включить режим PTC
response = openai.chat.completions.create(
model="gpt-5.6-sol",
messages=[...],
tools=tools,
# Включаем PTC
tool_choice="programmatic"
)
Шаг 3: Выполнить сгенерированный код
GPT-5.6 Sol возвращает код в поле programmatic_tool_call. Выполнить его можно через exec() или специализированную песочницу:
# Получаем код от модели
ptc_code = response.choices[0].message.programmatic_tool_call.code
# Определяем контекст с доступными функциями
context = {
"search_hotels": search_hotels,
"create_booking": create_booking,
"send_email": send_email,
"json": json,
"datetime": datetime
}
# Выполняем
exec(ptc_code, context)
result = context.get("booking")
Когда использовать PTC, а когда оставаться на Function Calling
| Сценарий | Рекомендация |
|---|---|
| Одиночный вызов функции (проверить погоду, перевести текст) | Function Calling — проще |
| Цепочка из 2–3 последовательных вызовов | Function Calling — достаточно |
| Сложная бизнес-логика с условиями и циклами | PTC — обязателен |
| Оркестрация AI-агентов (Multi-Agent) | PTC — единственный вариант |
| Обработка данных с ETL-конвейерами | PTC — значительно эффективнее |
| Критичная безопасность (песочница недоступна) | Function Calling — безопаснее |
Практический пример: агент обработки заказов
Сравним, как выглядит реализация агента для обработки возвратов на Function Calling и PTC.
Function Calling (6 round-trip к API, ~850 токенов):
Вызов 1: get_order("ORD-12345") → вернул данные заказа
Вызов 2: check_return_policy(order) → политика допускает возврат
Вызов 3: get_customer(customer_id) → данные клиента
Вызов 4: calculate_refund(order) → сумма возврата
Вызов 5: process_refund(order, amount) → успешно
Вызов 6: send_notification(customer, refund) → уведомление
PTC (1 вызов, ~310 токенов):
def handle_return(order_id="ORD-12345"):
order = get_order(order_id)
if not check_return_policy(order):
return {"error": "Возврат невозможен"}
customer = get_customer(order["customer_id"])
refund = calculate_refund(order)
result = process_refund(order, refund["amount"])
send_notification(customer["email"], f"Возврат {refund['amount']}₽ оформлен")
return result
Экономия: 63,5% токенов, 83% времени выполнения, 1 запрос вместо 6.
❓ Часто задаваемые вопросы
PTC работает только с Python? В текущей версии GPT-5.6 Sol генерирует Python-код. OpenAI анонсировала поддержку TypeScript и псевдокода в следующих версиях.
Безопасно ли выполнять код, сгенерированный моделью? OpenAI встроил в PTC ограничения: модель не может генерировать код с сетевыми запросами вне объявленных инструментов, системными вызовами или импортом произвольных библиотек. Рекомендуется выполнять код в песочнице (Sandbox/Docker) на продакшене.
Как дебажить PTC-код?
GPT-5.6 Sol возвращает не только код, но и пояснения к каждому шагу в поле programmatic_tool_call.reasoning. Используйте их для отладки и логирования.
Поддерживает ли PTC асинхронные вызовы?
Да. В сгенерированном коде модель может использовать async/await для параллельного выполнения нескольких независимых вызовов инструментов.
Когда PTC появится в GPT-5.6 Terra и Luna? GPT-5.6 Terra (лёгкая версия) и GPT-5.6 Luna (специализированная) выходят 9 июля 2026. PTC будет доступен во всех трёх модификациях, но с разными лимитами на длину генерируемого кода.
📖 Читайте также
- GPT-5.6 Sol Programmatic Tool Calling: 5 бизнес-процессов для автоматизации
- 6 слоёв стека AI-агентов: архитектура enterprise-решений 2026
- 15 лучших платформ для создания AI-агентов в 2026
🚀 Хотите внедрить AI-автоматизацию в свой бизнес? Раисыч поможет настроить AI-агентов, чат-ботов и системы лидогенерации под ключ.
Заказать консультацию — raisovich.ru
На сколько PTC снижает потребление токенов по сравнению с Function Calling?
По данным OpenAI, PTC снижает потребление токенов на 63,5% и сокращает время выполнения на 83% за счёт одного вызова вместо цепочки round-trip.
Какие типы задач требуют обязательного перехода на PTC?
Сложная бизнес-логика с условиями и циклами, оркестрация мультиагентных систем и ETL-конвейеры — в этих сценариях PTC обязателен.
Подпишитесь на @raisovich_news
Первыми получайте новые статьи об AI-автоматизации, нейросетях для бизнеса и создании сайтов. Без спама — только полезный контент.
Часто задаваемые вопросы
На сколько PTC снижает потребление токенов по сравнению с Function Calling?
По данным OpenAI, PTC снижает потребление токенов на 63,5% и сокращает время выполнения на 83% за счёт одного вызова вместо цепочки round-trip.