- Responses
- Chat Completions
- Messages
Effort levels
Responses and Chat Completions share one scale:none, minimal, low, medium, high, xhigh and max. You set it with reasoning.effort in Responses and reasoning_effort in Chat Completions. Models don’t all support every level, so NagaAI sends the nearest level the model has. You can keep one setting in your code and switch models freely.
Messages takes output_config.effort from low to max, or the older thinking object with a token budget. NagaAI turns the budget into one of its effort levels and translates that level for the provider serving the model:
thinking: {"type": "adaptive"} sets no level and leaves the choice to the model. When you send both thinking and output_config.effort, the effort wins. The budget doesn’t cap the thinking exactly.
A model without reasoning lacks reasoning_effort in the parameters of its chat operation in /v1/models. NagaAI removes the setting from requests to such a model, so the request still succeeds.
Reasoning in the response
In Responses,
reasoning.summary in the request asks for a summary of the reasoning: auto, concise or detailed. A reasoning item holds summary, a list of summary_text parts, and content with the full reasoning as reasoning_text parts when the model returns it. A model that seals its reasoning returns encrypted_content instead. NagaAI always includes it, so you don’t need include: ["reasoning.encrypted_content"]. In a stream the reasoning arrives as response.reasoning_summary_text.delta and response.reasoning_text.delta events.
The official Chat Completions API has no reasoning fields, so NagaAI adds two to the message and to stream deltas. reasoning_content is the reasoning as plain text, often a summary. reasoning_details lists typed entries: reasoning.text with the full text and a signature when the model signs it, reasoning.summary, or reasoning.encrypted with sealed reasoning in data. On input NagaAI also accepts reasoning in place of reasoning_content.
Some models hide their reasoning and return only a summary or sealed data. You still pay for every reasoning token at the output price, because the model generated them.
Keep the reasoning across turns
Some models need their earlier reasoning to continue a chain of tool calls. Send each assistant turn back unchanged: the Chat Completions message with itsreasoning_details, the Responses reasoning items in input, or the Messages content with its thinking blocks and their signature. In the Python SDK, append message.model_dump(exclude_none=True) for Chat Completions; in Node.js, append the message object itself.
A signature only works with the provider that issued it. NagaAI removes signatures and sealed reasoning from other providers before it sends the request, so a conversation can move between providers without an error.
Troubleshooting
400 with thinking.budget_tokens must be >= 1024
The Messages format requires a budget of at least 1024 tokens. Raise the budget, or set output_config.effort to a level instead.
The reasoning is empty
The model hides its reasoning. Look for a summary inreasoning_details or in the summary of the Responses item. The reasoning tokens in usage show that the model did reason.