Handle reasoning output separately from the final answer, and budget for the whole generation. Some models may emit visible reasoning, but RedRouter currently provides no configurable reasoning-effort or thinking-token budget.
Controls do not set a reasoning budget
| Interface | Accepted controls | Current behavior |
|---|---|---|
| Chat Completions | reasoning_effort, reasoning, enable_thinking, thinking, thinking_budget, chat_template_kwargs, output_config | Accepted and ignored. |
| Responses | reasoning.effort, reasoning.summary | Validated compatibility values, then ignored. |
| Messages | thinking, output_config.effort | Validated compatibility shapes, then ignored. |
These fields do not change the selected model, activate a hidden budget, or guarantee visible reasoning. Omit them when writing a new integration. Messages output_config.format is separate: it controls structured output.
Responses accepts effort values none, minimal, low, medium, high, xhigh, and max; summary values are auto, concise, and detailed. Messages thinking types are adaptive, enabled, and disabled; effort values are low, medium, high, xhigh, and max. Unsupported values or extra nested fields return 400 even though valid controls are ignored.
Read available reasoning
| Interface | Reasoning output |
|---|---|
| Chat Completions | message.reasoning_content when nonempty; streaming uses delta.reasoning_content. |
| Responses | Reasoning items with reasoning_text content; streaming uses response.reasoning_text.delta and done events. |
| Messages | Reasoning deltas are omitted; output contains visible answer text and tool calls. |
Do not assume a model always emits reasoning or that reasoning text is a stable schema. For an application that needs an explanation, explicitly ask for a short rationale in the final answer or in your output schema. Treat any model-generated explanation as generated content requiring the same review as the answer.
Replay history deliberately
Chat Completions preserves assistant reasoning replay. It uses reasoning_content if present, otherwise a string reasoning, otherwise text/summary entries in reasoning_details. Only one representation is used. Encrypted details are dropped, and reasoning fields on non-assistant messages are omitted. Replayed visible reasoning becomes input and counts toward the next request's input budget.
Responses accepts reasoning input items but omits both plaintext and encrypted reasoning from model-visible history. Keep the actual message and tool-call/result items needed for the task. Messages omits assistant thinking and redacted-thinking blocks, including signatures. Compaction summary text is preserved.
A reasoning history from another service cannot restore its private state through RedRouter. See Compatibility and Migration.
Budget for complete output
Use the endpoint's ordinary output limit. Current models are capped at 8,192 output tokens, including reported reasoning where the model counts it as output. An answer can truncate before a useful final response or before tool arguments finish. Inspect finish_reason, status, or stop_reason and reject incomplete structured results.
Reported reasoning-token details are part of output usage, not extra tokens to add to it. Chat uses completion_tokens_details.reasoning_tokens; Responses uses output_tokens_details.reasoning_tokens. Missing details do not establish zero reasoning use. See Streaming, Token counting, and Billing.