> ## Documentation Index
> Fetch the complete documentation index at: https://docs.layerx1.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tool calling.

> Every model in the catalog calls tools, in both dialects, with strict schema-faithful arguments — the property agent loops live and die on. The loop is the same everywhere: define, receive a call, execute, return the result.

## 1 · Define tools

<CodeGroup>
  ```json Chat Completions theme={null}
  {
    "model": "lx1-gpt-oss-120b",
    "messages": [{ "role": "user", "content": "Weather in Paris?" }],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Current weather for a city",
        "parameters": {
          "type": "object",
          "properties": { "city": { "type": "string" } },
          "required": ["city"]
        }
      }
    }]
  }
  ```

  ```json Messages theme={null}
  {
    "model": "lx1-sonnet-4.6",
    "max_tokens": 1024,
    "messages": [{ "role": "user", "content": "Weather in Paris?" }],
    "tools": [{
      "name": "get_weather",
      "description": "Current weather for a city",
      "input_schema": {
        "type": "object",
        "properties": { "city": { "type": "string" } },
        "required": ["city"]
      }
    }]
  }
  ```
</CodeGroup>

## 2 · The model calls

When the model decides to use a tool, the response carries a call instead of (or alongside)
text:

```json title="Chat Completions — finish_reason: tool_calls" theme={null}
{
  "message": {
    "role": "assistant",
    "tool_calls": [{
      "id": "call_abc123",
      "type": "function",
      "function": { "name": "get_weather", "arguments": "{\"city\": \"Paris\"}" }
    }]
  },
  "finish_reason": "tool_calls"
}
```

```json title="Messages — stop_reason: tool_use" theme={null}
{
  "content": [{
    "type": "tool_use",
    "id": "toolu_abc123",
    "name": "get_weather",
    "input": { "city": "Paris" }
  }],
  "stop_reason": "tool_use"
}
```

Arguments conform to your schema — parse them, run the tool, and send the result back.
Models may emit **several calls in one turn** (parallel tool use); execute them all and
return one result per call id.

## 3 · Return results

<CodeGroup>
  ```json Chat Completions theme={null}
  {
    "role": "tool",
    "tool_call_id": "call_abc123",
    "content": "{\"temp_c\": 18, \"sky\": \"clear\"}"
  }
  ```

  ```json Messages theme={null}
  {
    "role": "user",
    "content": [{
      "type": "tool_result",
      "tool_use_id": "toolu_abc123",
      "content": "{\"temp_c\": 18, \"sky\": \"clear\"}"
    }]
  }
  ```
</CodeGroup>

Append the result to the conversation and call the endpoint again — the model continues
with the tool output in context. Repeat until it answers in text.

## Steering with tool\_choice

* `auto` (default) — the model decides whether to call.
* `required` / `{ "type": "any" }` — must call some tool (Chat Completions / Messages
  respectively).
* Named — force one specific tool:
  `{ "type": "function", "function": { "name": "get_weather" } }` or
  `{ "type": "tool", "name": "get_weather" }`.
* `none` — text only, tools stay visible but uncallable.

<Note>
  Tool calls stream too: argument deltas arrive incrementally on both dialects
  ([Streaming](/guides/streaming)). For extracting structured data without any real tool,
  prefer [Structured output](/guides/structured-output).
</Note>
