Работа с запросами
Вызов инструментов
Как использовать tools и function calling в AllTokens через совместимый chat/completions API.
Вызов инструментов позволяет модели не просто отвечать текстом, а предлагать вызвать внешнюю функцию. Сама модель не вызывает инструмент напрямую: она только возвращает tool_calls, а уже ваш код выполняет нужную функцию, получает результат и отправляет его обратно модели.
Это удобно для:
- поиска данных во внешнем API
- работы с базой данных
- вызова внутренних сервисов
- построения простых агентных сценариев
Что поддерживается
В совместимом POST /api/v1/chat/completions можно использовать:
toolstool_choice- сообщения с
role: "tool" - возврат результата инструмента через
tool_call_id
Если хотите подобрать модель с поддержкой инструментов, смотрите supported_parameters=tools в каталоге моделей или на alltokens.ru/models.
Как это работает
Обычно цикл состоит из трёх шагов:
- Вы отправляете запрос с
tools - Модель возвращает
tool_calls - Вы выполняете инструмент локально и отправляете результат вторым запросом
Шаг 1. Первый запрос с tools
Пример тела запроса:
{
"model": "google/gemini-3-flash-preview",
"messages": [
{
"role": "user",
"content": "Какие книги написал Джеймс Джойс?"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "search_gutenberg_books",
"description": "Ищет книги в библиотеке Project Gutenberg",
"parameters": {
"type": "object",
"properties": {
"search_terms": {
"type": "array",
"items": { "type": "string" },
"description": "Список поисковых фраз"
}
},
"required": ["search_terms"]
}
}
}
]
}
Шаг 2. Выполнение инструмента в вашем коде
После ответа модели вы читаете tool_calls, вызываете нужную функцию у себя и готовите результат:
const toolResult = await searchGutenbergBooks(["James", "Joyce"]);
Шаг 3. Второй запрос с результатом инструмента
Во втором запросе важно передать:
- исходное пользовательское сообщение
- ответ модели с
tool_calls - сообщение
role: "tool"с результатом вызова - тот же массив
tools
{
"model": "google/gemini-3-flash-preview",
"messages": [
{
"role": "user",
"content": "Какие книги написал Джеймс Джойс?"
},
{
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "search_gutenberg_books",
"arguments": "{\"search_terms\": [\"James\", \"Joyce\"]}"
}
}
]
},
{
"role": "tool",
"tool_call_id": "call_abc123",
"content": "[{\"id\": 4300, \"title\": \"Ulysses\"}]"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "search_gutenberg_books",
"description": "Ищет книги в библиотеке Project Gutenberg",
"parameters": {
"type": "object",
"properties": {
"search_terms": {
"type": "array",
"items": { "type": "string" }
}
},
"required": ["search_terms"]
}
}
}
]
}
tools лучше передавать в обоих запросах: и в первом, и во втором. Так схема инструмента остаётся в контексте и повторно валидируется одинаково.
Полный пример
Ниже пример с Project Gutenberg: модель просит инструмент, ваш код выполняет поиск книг, а затем возвращает результат модели.
Подготовка
Первый вызов модели
Обработка tool_calls
Второй вызов модели
tool_choice
Параметр tool_choice позволяет контролировать использование инструментов.
Примеры:
{ "tool_choice": "auto" }
{ "tool_choice": "none" }
{
"tool_choice": {
"type": "function",
"function": {
"name": "search_gutenberg_books"
}
}
}
Практические рекомендации
- давайте инструментам понятные и точные имена
- подробно описывайте
description, чтобы модели было проще выбрать правильный инструмент - делайте схему параметров максимально конкретной
- валидируйте аргументы перед реальным вызовом функции
- не забывайте добавлять в
messagesи ответ модели, и результат инструмента
Что важно учитывать
- не каждая модель поддерживает
tools - лучше заранее проверять
supported_parameters - сам инструмент вызывается вашим кодом, а не моделью
- для надёжных продакшен-сценариев стоит обрабатывать ошибки инструмента отдельно
Частые вопросы
Модель сама вызывает инструмент?
Модель сама вызывает инструмент?
Нет. Модель только возвращает tool_calls. Сам вызов делает ваш код, а результат вы затем отправляете обратно модели.
Нужно ли передавать tools во втором запросе?
Нужно ли передавать tools во втором запросе?
Да, это хороший и безопасный вариант. Так схема инструмента остаётся доступной и во втором шаге.
Как понять, поддерживает ли модель tool calling?
Как понять, поддерживает ли модель tool calling?
Смотрите supported_parameters в каталоге моделей. Если там есть tools, модель подходит для такого сценария.
Где лучше выполнять сам инструмент?
Где лучше выполнять сам инструмент?
В вашем серверном коде или в контролируемом backend-слое. Не стоит доверять модели прямой доступ к внешним системам без вашей валидации.