---
url: https://docs.freetheai.org/concepts/reasoning.md
description: >-
  Some FreeTheAI models think before they answer. Where the reasoning arrives,
  and how to turn thinking off per request or for a whole key.
---

# Thinking and reasoning

Some models reason before they write their answer, for example GLM 5.3 and Kimi K3. Thinking helps with code and hard questions, but the first words take longer and the request uses more tokens. You can keep it, or turn it off per request or for a whole key.

## Where the reasoning arrives

On Chat Completions the reasoning comes in `reasoning_content`, separate from the reply text:

```json
{
  "choices": [{
    "message": {
      "role": "assistant",
      "reasoning_content": "The user wants a one-line summary...",
      "content": "Recursion is a function calling itself to solve smaller copies of a problem."
    }
  }]
}
```

When streaming, it arrives in `delta.reasoning_content` before the answer's `delta.content`. On Responses and Anthropic Messages it arrives as each format's reasoning or thinking blocks. Show it, hide it, or drop it; it is not part of the answer.

::: tip Keep streaming on
With thinking on, a long chat can take a while before the first word. Apps that wait without streaming may give up and show "No response from bot". Turn on streaming, or turn thinking off.
:::

## Turn thinking off for one request

Send either of these fields:

::: code-group

```json [thinking]
{
  "model": "fta/zai/glm-5.3",
  "thinking": { "type": "disabled" },
  "messages": [{ "role": "user", "content": "Summarize this in one line." }]
}
```

```json [reasoning_effort]
{
  "model": "fta/kimi/k3",
  "reasoning_effort": "none",
  "messages": [{ "role": "user", "content": "Hi!" }]
}
```

:::

With the OpenAI SDKs, pass fields the SDK does not know through `extra_body` (Python) or as extra properties (JavaScript):

::: code-group

```python [Python]
reply = client.chat.completions.create(
    model="fta/zai/glm-5.3",
    messages=[{"role": "user", "content": "Summarize this in one line."}],
    extra_body={"thinking": {"type": "disabled"}},
)
```

```ts [TypeScript]
const reply = await client.chat.completions.create({
  model: 'fta/zai/glm-5.3',
  messages: [{ role: 'user', content: 'Summarize this in one line.' }],
  // @ts-expect-error: accepted by FreeTheAI, not in the OpenAI SDK's types
  thinking: { type: 'disabled' },
})
```

:::

Leave both out to keep the model's default.

## Turn thinking off for a whole key

Apps such as JanitorAI have no thinking setting. For them, open **Dashboard > API keys**, open **scope & settings** under your key, turn on **Turn thinking off**, and save. Models then answer straight away with nothing to change in your app. A thinking setting sent with a request still wins over the key setting.

## A second "thinking" part inside the reply

If the reply text itself contains a thinking section, the model is not the cause: your app's preset is asking the model to write its thoughts. Turn that option off in the preset.
