Enable reasoning models to think before they respond using the Responses API
Reasoning models are LLMs trained with reinforcement learning to think before they answer, producing a long internal chain of thought before responding. They excel at complex problem solving, coding, scientific reasoning, and multi-step planning for agentic workflows.
The Responses API is best supported on the Enterprise plan. Use https://enterprise.blackbox.ai as the base URL for full model availability and production reliability. The API is also available on standard plans at https://api.blackbox.ai, where it is currently experimental.
When reasoning is enabled, the output array includes a reasoning item with the model’s internal thinking, followed by a message item with the visible response:
The encrypted_content field contains an opaque token that can be passed back in multi-turn conversations so the model can reference its previous reasoning. Use include: ["reasoning.encrypted_content"] to receive it.
When reasoning is combined with tool calling, the model thinks first (producing a reasoning item), then calls the tool (producing a function_call item):
After executing the tool, pass back the reasoning item, function call, and tool result in the input array. The model uses its previous reasoning context to generate the final answer:
import osimport requestsimport jsonurl = 'https://enterprise.blackbox.ai/v1/responses'headers = { 'Content-Type': 'application/json', 'Authorization': f"Bearer {os.environ['BLACKBOX_API_KEY']}",}tools = [{ 'type': 'function', 'name': 'calculator', 'description': 'Perform a calculation', 'parameters': { 'type': 'object', 'properties': {'expression': {'type': 'string'}}, 'required': ['expression'] }}]# Turn 1: Model reasons and calls the toolr1 = requests.post(url, headers=headers, json={ 'model': 'blackboxai/openai/gpt-5.3-codex', 'reasoning': {'effort': 'medium'}, 'include': ['reasoning.encrypted_content'], 'input': [{'role': 'user', 'content': 'What is 15 + 27? Use the calculator.'}], 'tools': tools}).json()# Build input for Turn 2: include all output items + tool resultinput_turn2 = [{'role': 'user', 'content': 'What is 15 + 27? Use the calculator.'}]for item in r1['output']: input_turn2.append(item) if item['type'] == 'function_call': input_turn2.append({ 'type': 'function_call_output', 'call_id': item['call_id'], 'output': '42' })# Turn 2: Model uses reasoning context + tool result for final answerr2 = requests.post(url, headers=headers, json={ 'model': 'blackboxai/openai/gpt-5.3-codex', 'reasoning': {'effort': 'medium'}, 'input': input_turn2, 'tools': tools}).json()msg = next(item for item in r2.get('output', []) if item.get('type') == 'message')text = next(part['text'] for part in msg['content'] if part['type'] == 'output_text')print(text) # "15 + 27 = 42"
The reasoning.summary field is part of the OpenAI Responses API spec and is accepted by the API. Support varies by model — when supported, setting it causes the output array to include a reasoning item before the message item containing a human-readable summary of the model’s internal thinking.
Value
Description
"auto"
Uses the most detailed summarizer available (recommended)
"detailed"
Full step-by-step reasoning summary
"concise"
A shorter, high-level summary of the reasoning process
reasoning.summary is not currently supported by blackboxai/openai/gpt-5.3-codex. When unsupported, the field is accepted but ignored — the response returns only the message output item.
When a model supports reasoning.summary, the output array contains a reasoning item before the message:
[ { "id": "rs_abc123", "type": "reasoning", "summary": [ { "type": "summary_text", "text": "**Answering a simple question**\n\nThe capital of France is Paris — a well-known fact. I'll keep the answer brief and direct." } ] }, { "id": "msg_abc456", "type": "message", "status": "completed", "role": "assistant", "content": [ { "type": "output_text", "text": "The capital of France is Paris.", "annotations": [] } ] }]
Reasoning tokens are generated internally and are not visible in the response, but they are billed as output tokens and appear in usage.output_tokens_details:
If the model runs out of token budget while reasoning, it may return status: incomplete — or in some cases return status: completed with an empty output_text when all tokens were consumed by internal reasoning. Reserve enough tokens for both reasoning and the visible output to avoid this.
const response = await fetch('https://enterprise.blackbox.ai/v1/responses', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${process.env.BLACKBOX_API_KEY}`, }, body: JSON.stringify({ model: 'blackboxai/openai/gpt-5.3-codex', reasoning: { effort: 'medium' }, max_output_tokens: 300, input: [ { role: 'user', content: 'Write a bash script that transposes a matrix.', }, ], }),});const data = await response.json();if (data.status === 'incomplete' && data.incomplete_details?.reason === 'max_output_tokens') { console.log('Ran out of tokens'); const msg = data.output?.find((item: any) => item.type === 'message'); const text = msg?.content?.find((part: any) => part.type === 'output_text')?.text; if (text) { console.log('Partial output:', text); } else { console.log('Ran out of tokens during reasoning — no visible output produced'); }}
When set, returns a human-readable reasoning summary alongside the response. One of "auto", "detailed", or "concise". Not included unless explicitly set.
Maximum number of tokens to generate in the response, including reasoning tokens. Increase this when using higher effort levels to avoid incomplete responses.