Skip to content

Thinking effort

Inkling supports continuous reasoning-effort conditioning. Set effort to a finite floating-point value from 0.0 inclusive up to, but not including, 1.0. Larger values generally encourage more reasoning, but do not guarantee longer responses or higher accuracy on every sample.

Choose an effort level

These presets are useful starting points when sweeping reasoning effort:

Name none minimal low medium high (default) xhigh
Effort 0.0 0.01 0.3 0.6 0.9 0.99

Named presets in OpenAI- or Anthropic-compatible APIs may map to different scalar values. The Cookbook renderer accepts any finite scalar in the range [0.0, 1.0).

Before creating training data, use sample_reasoning.py to sweep effort values for your task and choose the value that produces the desired behavior.

Generate at a fixed effort

Pass your chosen effort to the Cookbook renderer:

from tinker_cookbook.renderers import Message
from tinker_cookbook.renderers.tml_v0 import TmlV0Renderer
from tinker_cookbook.tokenizer_utils import get_tokenizer

renderer = TmlV0Renderer(get_tokenizer("thinkingmachines/Inkling"))
messages = [Message(role="user", content="Solve this problem step by step.")]
prompt = renderer.build_generation_prompt(messages, effort=0.9)

When effort is omitted, the renderer uses high effort (0.9). The renderer inserts a Thinking effort level system message before the first non-system message. Do not add that message manually or include another effort message in the conversation.

Supervised fine-tuning

Generate rollouts at your chosen fixed effort, then use the same value when rendering them for supervised fine-tuning:

model_input, weights = renderer.build_supervised_example(
    messages_with_assistant_response,
    effort=0.9,
)

Generation and supervised rendering insert the same conditioning prefix, so training data matches sampling token-for-token. Generic supervised dataset builders currently use the default effort (0.9). To render individual conversations at another effort level, call build_supervised_example(...) directly.

We plan to cover variable-effort conditioned training in a future Cookbook guide.

Behavior to keep in mind

  • effort=0.0 conditions the model toward no reasoning; it does not enforce a hard no-reasoning constraint.
  • Reasoning effort and max_tokens are independent. Higher effort may require a larger generation budget to avoid truncation.
  • Temperature still affects generation.
  • Compare several samples or aggregate benchmark accuracy rather than drawing conclusions from one response.

Low-level renderer

The same control is available through the low-level tml_renderers.v0.Renderer (see the tml-renderers API reference):

from tml_renderers import chat, tokenizers, v0

tml_renderer = v0.Renderer(tokenizers.o200k_base_chat())
tml_messages = chat.OpenAIMessage.from_oss_messages(
    [{"role": "user", "content": "Solve this problem step by step."}]
)
spans, parser = tml_renderer.render_for_completion_with_effort(tml_messages, effort=0.9)

Effort scaling

Sweeping Inkling's effort setting traces model quality against mean generated tokens on Terminal-Bench 2.1, Humanity's Last Exam (HLE), and IFBench. Competing models are shown at their default operating points.

Inkling effort scaling across benchmarks