Function calling на практике: инструменты шаг за шагом
Как модель вызывает ваши функции: описание инструментов, разбор tool_calls, возврат результата и финальный ответ. Полный цикл на примере с кодом.
Языковая модель сама по себе не знает погоду, курс валют или содержимое вашей базы. Function calling (вызов инструментов) даёт ей мост в реальный мир: вы описываете доступные функции, модель решает, какую позвать и с какими аргументами, а выполняете её вы и возвращаете результат. Разберём полный цикл по шагам. Определение — в глоссарии.
Как это работает: четыре шага
- Вы описываете инструменты — имя, назначение и схему аргументов каждой функции в поле
toolsзапроса. - Модель решает — вместо текста возвращает
tool_calls: какую функцию звать и с какими аргументами в JSON. - Вы выполняете — модель не запускает код сама; функцию вызываете вы своим кодом и получаете результат.
- Модель отвечает — результат отправляется обратно, и модель формулирует финальный ответ пользователю на его основе.
Шаг 1: описание инструмента
Инструмент описывается JSON-схемой. Чем понятнее description, тем точнее модель решает, когда его звать:
tools = [{"type": "function","function": {"name": "get_weather","description": "Возвращает текущую погоду в указанном городе","parameters": {"type": "object","properties": {"city": {"type": "string", "description": "Название города"},},"required": ["city"],},},}]Шаг 2–4: полный цикл
import jsonfrom openai import OpenAIclient = OpenAI(base_url="https://ai-gatewey.ru/v1", api_key="sk-aigate-ваш_ключ")def get_weather(city: str) -> str:# здесь настоящий запрос к погодному сервисуreturn f"В городе {city} сейчас +18°C, ясно"messages = [{"role": "user", "content": "Какая погода в Казани?"}]# 1. модель решает вызвать инструментresp = client.chat.completions.create(model="anthropic/claude-sonnet-5.5", messages=messages, tools=tools,)msg = resp.choices[0].messagemessages.append(msg)# 2. выполняем вызванную функциюfor call in msg.tool_calls or []:args = json.loads(call.function.arguments)result = get_weather(**args)messages.append({"role": "tool","tool_call_id": call.id,"content": result,})# 3. модель формулирует финальный ответfinal = client.chat.completions.create(model="anthropic/claude-sonnet-5.5", messages=messages, tools=tools,)print(final.choices[0].message.content)Практические советы
- Ясные описания — модель выбирает инструмент по
description; пишите его как инструкцию, а не как заголовок. - Строгая схема — перечисляйте
required-поля и типы, чтобы аргументы приходили в предсказуемом виде. - Несколько инструментов — модель сама выберет подходящий или несколько; давайте ей осмысленный набор, а не один на всё.
- Проверка на выходе — всегда валидируйте аргументы и оборачивайте вызов в обработку ошибок.
Список моделей с поддержкой инструментов и детали формата — на странице возможности function calling.
Частые вопросы
Модель сама выполняет мою функцию?
Нет. Модель только возвращает tool_calls — имя функции и аргументы. Выполняете её вы своим кодом и отправляете результат обратно. Это важно для безопасности: перед запуском вы контролируете и валидируете аргументы.
Что если модель вызвала несколько инструментов сразу?
В tool_calls придёт массив вызовов. Выполните каждый, добавьте по сообщению с ролью tool и соответствующим tool_call_id, затем отправьте всё обратно — модель учтёт все результаты в финальном ответе.
Все модели поддерживают function calling?
Не все — это отдельная возможность. Список поддерживающих моделей строится живьём из каталога на странице возможности function calling. Через единый API формат вызова одинаков для всех таких моделей.