Skip to content
View as Markdown

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.

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:

json
{
  "model": "fta/zai/glm-5.3",
  "thinking": { "type": "disabled" },
  "messages": [{ "role": "user", "content": "Summarize this in one line." }]
}
json
{
  "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):

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
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.

FreeTheAI documentation. Paid models and plans are coming soon; the free tier has daily limits.