ModelsOpenAIgpt-5.6-terra
provideropenai /

gpt-5.6-terra

700 DZD in 4200 DZD out 70 DZD cached/ 1M tokens

GPT-5.6 Terra is the balanced tier of OpenAI's GPT-5.6 family: more capability than the efficiency model, at a fraction of the flagship's cost, on an interface identical to both. All three tiers share the same context window, output ceiling, input types, and six reasoning effort levels — so routing between them is a change to one field, not a re-integration. Terra is positioned as the practical default for everyday production traffic: application features, internal tooling, support automation, and the routine steps of a longer agent run. It reasons across six levels from none through maximum, accepts text and images, supports structured outputs and function calling, and can carry its reasoning across turns to improve both multi-turn quality and cache efficiency.

PublicJSONStreaming
gpt-5.6-terra
Capabilities
ToolsVisionReasoning (optional)Structured output
ArchitectureProprietary
Context Window1M

Use gpt-5.6-terra in VS Code, Cursor and Antigravity

DEVUP Code, the DEVUP AI extension, is free to install. Requests are paid from your DEVUP balance.

Explore DEVUP Code

GPT-5.6 Terra

The balanced tier of OpenAI's GPT-5.6 family — the practical default for production traffic that is neither trivial nor genuinely hard.


⚠️ Reasoning Effort: Five Levels, Not Six

This model accepts none, low, medium, high, xhigh — measured against the live API.

max is rejected. It appears in some published documentation, but sending it returns HTTP 400 on every model in this family:

CODE
Unsupported value: 'reasoning_effort' does not support 'max' with this model.
Supported values are: 'none', 'low', 'medium', 'high', and 'xhigh'.

The gateway does not validate the value. An invalid effort level is forwarded upstream, rejected there, and returned to you as a generic invalid-parameter error — the upstream text naming the accepted values is masked. Validate client-side, per model, or you will receive an error that does not tell you what to fix.

none works here but not everywhere in the catalogue. The newer flagship generation rejects it. If one code path serves both, check per model.


⚠️ A Little Reasoning Is Worse Than None

The effort levels are not a clean ascending ladder. Measured on a sibling model in this family, on a multi-step constraint-satisfaction task, three samples per level:

LevelMean reasoning tokensCorrect
none01 of 3
low7770 of 3
medium1,3773 of 3
xhigh1,1883 of 3

At low the model reasoned for roughly 777 tokens and got the answer wrong in every sample — it constructed alternative arrangements and concluded the problem had no unique solution. At none, with zero reasoning tokens, one of three was correct.

low cost more than none and performed worse.

This matters more on this tier than on the flagship, because low looks like the obvious economy setting for a mid-tier model. It is not. On multi-step reasoning, either switch deliberation off or give it enough budget — medium is where the measured task flipped to fully correct.

Note also that xhigh used fewer tokens than medium on this task and was no more accurate. More effort is neither reliably more compute nor reliably better output.

Measured on a sibling model in the same family; treat the shape as indicative rather than exact for this one.


Where This Tier Fits

The three GPT-5.6 tiers are interface-identical. Same context window, same output ceiling, same knowledge cutoff, same text-and-image input, same five reasoning levels, same tools. Nothing about your integration changes when you move between them.

That parity is the point of this tier. Terra exists so that routing by task is a cheap decision rather than a project: send hard requests up, routine requests down, and change one string.

It is positioned for everyday production work — application features, internal tooling, support automation, and the routine steps inside a longer agent run. It handles multi-step coding and tool use solidly without the flagship's cost per token, and it has more headroom than the efficiency tier for open-ended reasoning.


Specifications

Model IDopenai/gpt-5.6-terra
Context window1,050,000 tokens
Max output128,000 tokens
Knowledge cutoff16 February 2026
InputText, image
OutputText
Reasoning effortnone · low · medium · high · xhigh
ToolsFunctions, web search, file search, computer use

Context, output, and cutoff figures are as published by OpenAI and have not been independently verified here. Architecture is not published — no parameter counts, no layer structure, no training details, no weights.


Capabilities

CapabilityValue
input_typestext, image
output_typestext
audio_inputNot supported
video_inputNot supported
context_window1050000
max_output_tokens128000
reasoningnone, low, medium, high, xhigh — no max
streamingSupported
tool_callingSupported
structured_outputSupported — JSON schema
fine_tuningNot supported
requires_promptYes — text prompt required, image optional

Calling It on DEVUP AI

Base URL: https://api.devupai.com/v1 · Model ID: openai/gpt-5.6-terra

BASH
curl https://api.devupai.com/v1/chat/completions \
  -H "Authorization: Bearer $DEVUP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-5.6-terra",
    "messages": [
      {
        "role": "user",
        "content": "Two services write to the same row without a transaction. Walk through the failure modes in order of likelihood and propose the smallest fix for each."
      }
    ],
    "reasoning_effort": "medium",
    "max_tokens": 16384
  }'

Tier routing — Python

The pattern this family is built for: one function, three tiers, one changed field — with the effort level validated against what each model actually accepts.

PYTHON
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["DEVUP_API_KEY"],
    base_url="https://api.devupai.com/v1",
)

# Measured against the live API. `max` is rejected on every model in this family.
EFFORT_LEVELS = {
    "openai/gpt-5.6-luna": {"none", "low", "medium", "high", "xhigh"},
    "openai/gpt-5.6-terra": {"none", "low", "medium", "high", "xhigh"},
    "openai/gpt-5.6-sol": {"none", "low", "medium", "high", "xhigh"},
    "openai/gpt-6-astra": {"low", "medium", "high", "xhigh"},  # no `none`
}


def ask(model: str, prompt: str, *, effort: str, max_tokens: int = 16384) -> str:
    """Send a request, refusing an effort level the target model does not accept."""
    allowed = EFFORT_LEVELS.get(model)
    if allowed is not None and effort not in allowed:
        raise ValueError(
            f"{model} does not accept reasoning_effort={effort!r}. Allowed: {sorted(allowed)}"
        )

    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": prompt}],
        max_tokens=max_tokens,
        extra_body={"reasoning_effort": effort},
    )
    return response.choices[0].message.content


# Routine classification — cheapest tier, no deliberation.
ask("openai/gpt-5.6-luna", ticket, effort="none", max_tokens=16)

# Everyday production work.
ask("openai/gpt-5.6-terra", question, effort="medium")

# The hard case that failed elsewhere.
ask("openai/gpt-5.6-sol", question, effort="high")

Note the effort levels chosen. none for classification, medium — not low — as the working default. The measurement above is the reason.

Structured extraction with a schema — Python

PYTHON
response = client.chat.completions.create(
    model="openai/gpt-5.6-terra",
    messages=[{"role": "user", "content": ticket}],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "support_ticket",
            "strict": True,
            "schema": {
                "type": "object",
                "properties": {
                    "order_id": {"type": ["string", "null"]},
                    "issue_type": {
                        "type": "string",
                        "enum": ["missing_items", "damaged", "late", "other"],
                    },
                    "missing_items": {"type": "array", "items": {"type": "string"}},
                    "contact": {"type": ["string", "null"]},
                },
                "required": ["order_id", "issue_type", "missing_items", "contact"],
                "additionalProperties": False,
            },
        },
    },
    max_tokens=2048,
    extra_body={"reasoning_effort": "none"},
)

A schema-constrained response removes a whole class of parsing failure. Extraction is one of the few tasks where none is the right setting rather than a compromise — the schema does the structuring, and deliberation adds nothing.

Image input — Python

PYTHON
import base64

with open("invoice.png", "rb") as handle:
    encoded = base64.b64encode(handle.read()).decode("utf-8")

response = client.chat.completions.create(
    model="openai/gpt-5.6-terra",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {"url": f"data:image/png;base64,{encoded}"},
                },
                {
                    "type": "text",
                    "text": (
                        "Extract every line item as JSON with fields: description, quantity, "
                        "unit_price, line_total. Report the currency exactly as printed. "
                        "Use null for any illegible field — do not infer."
                    ),
                },
            ],
        }
    ],
    max_tokens=8192,
    extra_body={"reasoning_effort": "medium"},
)

Instructing the model to return null rather than infer is not optional in document work. An invented figure is undetectable downstream.

Node.js

BASH
npm install devupai
JAVASCRIPT
import DevupAI from "devupai";

const client = new DevupAI({
  apiKey: process.env.DEVUP_API_KEY,
});

const response = await client.chat.completions.create({
  model: "openai/gpt-5.6-terra",
  messages: [
    {
      role: "system",
      content:
        "You are a staff engineer reviewing a migration. Report only defects that would " +
        "cause data loss or downtime, each with a severity and the smallest safe fix.",
    },
    { role: "user", content: migrationPlan },
  ],
  max_tokens: 16384,
  reasoning_effort: "high",
});

console.log(response.choices[0]?.message?.content);

An agent loop

PYTHON
import json

TOOLS = [
    {
        "type": "function",
        "function": {
            "name": "lookup_order",
            "description": "Return order status and line items for an order id.",
            "parameters": {
                "type": "object",
                "properties": {"order_id": {"type": "string"}},
                "required": ["order_id"],
            },
        },
    },
]


def lookup_order(order_id: str) -> dict:
    """Replace with your real data access layer."""
    raise NotImplementedError


HANDLERS = {"lookup_order": lookup_order}

messages = [{"role": "user", "content": "Why is order 48213 incomplete?"}]

for _ in range(15):  # bounded loop — never let an agent iterate without a ceiling
    response = client.chat.completions.create(
        model="openai/gpt-5.6-terra",
        messages=messages,
        tools=TOOLS,
        max_tokens=16384,
        extra_body={"reasoning_effort": "medium"},
    )

    message = response.choices[0].message
    messages.append(message)

    if not message.tool_calls:
        print(message.content)
        break

    for call in message.tool_calls:
        handler = HANDLERS.get(call.function.name)
        if handler is None:
            result = {"error": "unknown_tool", "name": call.function.name}
        else:
            try:
                result = handler(**json.loads(call.function.arguments or "{}"))
            except Exception as exc:  # describe the failure — do not crash the loop
                result = {"error": type(exc).__name__, "detail": str(exc)}

        messages.append(
            {
                "role": "tool",
                "tool_call_id": call.id,
                "content": json.dumps(result),
            }
        )
else:
    print("Agent loop exceeded its iteration limit.")

The iteration ceiling is the only bound you have. There is no per-request spending limit and no model-scoped credential on this platform — an unbounded loop runs against your full balance. Set the ceiling, and monitor your balance separately.

Streaming

PYTHON
stream = client.chat.completions.create(
    model="openai/gpt-5.6-terra",
    messages=[{"role": "user", "content": "Design a retry policy for a webhook delivery system."}],
    max_tokens=16384,
    stream=True,
    extra_body={"reasoning_effort": "high"},
)

for chunk in stream:
    if not chunk.choices:
        if getattr(chunk, "usage", None):
            print(f"\n\nTokens — in: {chunk.usage.prompt_tokens}, out: {chunk.usage.completion_tokens}")
        continue

    delta = chunk.choices[0].delta
    if getattr(delta, "content", None):
        print(delta.content, end="", flush=True)

Streamed responses carry a real usage object in the final chunk. Note that streamed responses carry no platform metadata, so any request parameter the gateway drops is invisible to you on a streamed call — test parameter handling on a non-streamed request first.


Choosing an Effort Level on This Tier

Because Terra is the tier most likely to carry mixed traffic, the effort decision matters more here than anywhere else in the family.

WorkloadLevelWhy
Classification, routing, formattingnoneDeliberation adds latency and nothing else
Schema-constrained extractionnoneThe schema does the structuring
General assistant and application workmediumThe working default
Multi-step reasoning, planning, debuggingmedium or highBelow medium measured worse than none at all
Hard analysis where accuracy dominatesxhighWith the caveat that it may not beat medium

low is absent from this table deliberately. On the measured task it was the worst option available — more expensive than none and less accurate. If a workload feels like it needs "a little" reasoning, that is the signal to test none and medium and pick between them.


Moving Between Tiers

Because the three tiers share an interface, migration is a changed string.

Move down when a workload is procedural rather than deductive. The efficiency tier was built for exactly this, and interface parity means the test costs nothing.

Move up when a specific input has already failed here. Failure on a real case is better evidence than a benchmark.

Watch the effort floor when you move. The newer flagship generation does not accept none, so a routing layer that terminates classification traffic at none cannot terminate there.


Limitations

  • max is not a valid reasoning level despite appearing in some documentation.
  • low measured worse than none on multi-step reasoning, at higher cost. The effort ladder is not monotonic.
  • The gateway does not validate effort values. An invalid value returns a generic error that does not name the accepted set.
  • No per-request spending limit exists on this platform. Bound agent loops by iteration count and watch your balance.
  • The middle tier. For the hardest long-running tasks the flagship is stronger; for pure volume the efficiency tier is cheaper.
  • Text and images only. No audio or video input, and no image generation.
  • Architecture is not disclosed. No parameter counts, layer structure, or training details are published; no weights are released.
  • Published figures are unverified here — context window, output ceiling, and knowledge cutoff are as stated by OpenAI.
  • Fine-tuning is not supported.
  • Streamed responses carry no platform metadata, so dropped parameters are invisible on streamed calls.
  • Standard foundation-model limitations apply, including hallucination.
  • Not a safety layer. Apply your own moderation and validation before acting on model output in a production system.