# Вызов инструментов

Позвольте модели вызывать ваши функции через tools, tool_choice и сообщения tool.

Вызов инструментов работает как в OpenAI API. С непустым списком `tools` роутер отправляет запрос только на маршруты с поддержкой инструментов; их поддерживают модели с возможностью **Инструменты** в [каталоге](/models).

## 1. Опишите инструменты

```json
{
  "model": "openai/gpt-4o-mini",
  "messages": [{ "role": "user", "content": "What is the weather in Kazan?" }],
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Current weather in a city",
        "parameters": {
          "type": "object",
          "properties": { "city": { "type": "string" } },
          "required": ["city"]
        }
      }
    }
  ],
  "tool_choice": "auto"
}
```

## 2. Выполните вызов, который запросила модель

Ответ заканчивается `finish_reason: "tool_calls"`:

```json
{
  "role": "assistant",
  "content": null,
  "tool_calls": [
    { "id": "call_1", "type": "function", "function": { "name": "get_weather", "arguments": "{\"city\":\"Kazan\"}" } }
  ]
}
```

`arguments` — это JSON-строка: разберите и проверьте ее, прежде чем что-либо выполнять.

## 3. Отправьте результат обратно

Повторите диалог с сообщением ассистента и сообщением `tool` для каждого вызова, затем отправьте запрос снова с теми же `tools`:

```json
[
  { "role": "user", "content": "What is the weather in Kazan?" },
  { "role": "assistant", "content": null, "tool_calls": [ { "id": "call_1", "type": "function", "function": { "name": "get_weather", "arguments": "{\"city\":\"Kazan\"}" } } ] },
  { "role": "tool", "tool_call_id": "call_1", "content": "{\"temp_c\": 12, \"sky\": \"cloudy\"}" }
]
```

## Настройки

| Поле                  | Значения                                                                                                  |
| --------------------- | --------------------------------------------------------------------------------------------------------- |
| `tool_choice`         | `auto` (по умолчанию), `none`, `required` или `{"type": "function", "function": {"name": "get_weather"}}` |
| `parallel_tool_calls` | `false` — не больше одного вызова в ответе                                                                |

В потоке `delta.tool_calls` приходит частями: склеивайте `function.arguments` по `index` до чанка с `finish_reason: "tool_calls"`.

Описания инструментов — часть промпта: в каждом запросе они оплачиваются как входные токены.
