ModelsOpenAIgpt-6-astra
provideropenai /

gpt-6-astra

3500 DZD in 17500 DZD out 350 DZD cached/ 1M tokens

GPT-6 Astra is OpenAI's most capable model and the one its documentation recommends by default: built for the hardest end-to-end work rather than for any single task. It carries the newest knowledge of anything in OpenAI's catalogue, against a context window slightly beyond a million tokens and a 128,000-token output ceiling. Reasoning runs across four effort levels — and unlike the generation below it, deliberation cannot be switched off, which is a deliberate signal about what this model is for. It accepts text and images, calls functions, and returns structured output. On DEVUP AI it is reachable through the standard OpenAI-compatible endpoint, billed in Algerian Dinar.

PublicJSONStreamingFlagship
gpt-6-astra
Capabilities
ToolsVisionReasoningStructured output
ArchitectureProprietary
Context Window1M

Use gpt-6-astra 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-6 Astra

OpenAI's own guidance: "If you're not sure where to start, use GPT-6 Astra, our flagship model for complex reasoning and coding."

This is the default recommendation, not merely the top of a list. Whether it is the right default for your workload is a separate question — see the last section.


⚠️ Reasoning Effort: Four Levels, and none Is Not One of Them

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

Two removals matter, and both are verified:

none is rejected on this model. The generation below it accepts none; this one does not:

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

If you built a routing layer that sends classification and formatting traffic at none, that path cannot terminate here. Keep a lighter model for it, or accept low as your floor — with the caveat in the next section.

max is rejected on every model in this family, despite appearing in some documentation. Sending it returns HTTP 400.

The gateway does not validate the value. A wrong 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 get an error that does not tell you what went wrong.


⚠️ A Little Reasoning Is Worse Than None

The effort levels are not a clean ascending ladder. Measured 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.

Two things follow. On multi-step reasoning, either switch deliberation off or give it enough budget — a small amount is the worst of both. And since none is unavailable on this model, low is a weak floor here; if your workload is genuinely simple, a lighter model is the better answer than a cheap setting on this one.

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

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


What This Model Is For

The description OpenAI uses is "the hardest end-to-end work" — and end-to-end is the operative part. Not the hardest question, but the hardest task: many steps, many tools, judged on whether the whole thing worked.

Where it separates itself:

Knowledge recency. Its training data runs later than the generation below it, which matters for anything touching recent events, standards, or library versions.

Complex reasoning and coding, the pairing OpenAI names explicitly.

Architectural and design work. OpenAI's developer material highlights this model for architectural visualisation and for building interactive applications — work where structure and visual judgment matter as much as correctness.


Specifications

Model IDopenai/gpt-6-astra
Context window1,050,000 tokens
Max output128,000 tokens
Knowledge cutoff30 April 2026
InputText, image
OutputText
Reasoning effortlow · 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
reasoninglow, medium, high, xhigh — no none, no max
streamingSupported
tool_callingSupported
structured_outputSupported — JSON schema
requires_promptYes — text prompt required, image optional

Calling It on DEVUP AI

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

BASH
curl https://api.devupai.com/v1/chat/completions \
  -H "Authorization: Bearer $DEVUP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-6-astra",
    "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": "high",
    "max_tokens": 32768
  }'

A validator that survives model switching — Python

Effort vocabularies differ across models, and the gateway forwards without checking. The error you get back will not name the accepted values, so check before sending.

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-6-astra": {"low", "medium", "high", "xhigh"},
    "openai/gpt-5.6-sol": {"none", "low", "medium", "high", "xhigh"},
    "openai/gpt-5.6-terra": {"none", "low", "medium", "high", "xhigh"},
    "openai/gpt-5.6-luna": {"none", "low", "medium", "high", "xhigh"},
}


def ask(model: str, prompt: str, *, effort: str, max_tokens: int = 32768) -> 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


# Raises immediately with a named reason, rather than returning a generic upstream error.
ask("openai/gpt-6-astra", question, effort="none")

Long-horizon work with tools — Python

PYTHON
import json

TOOLS = [
    {
        "type": "function",
        "function": {
            "name": "read_file",
            "description": "Return the contents of a file at a repository-relative path.",
            "parameters": {
                "type": "object",
                "properties": {"path": {"type": "string"}},
                "required": ["path"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "run_tests",
            "description": "Run the test suite and return pass/fail counts with failure output.",
            "parameters": {"type": "object", "properties": {}},
        },
    },
]


def read_file(path: str) -> dict:
    """Replace with your real, sandboxed file access."""
    raise NotImplementedError


def run_tests() -> dict:
    """Replace with your real, sandboxed test runner."""
    raise NotImplementedError


HANDLERS = {"read_file": read_file, "run_tests": run_tests}

messages = [{"role": "user", "content": "The invoice rounding test is failing. Find the cause and fix it."}]

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

    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.

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-6-astra",
  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: 32768,
  reasoning_effort: "high",
});

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

Image input

PYTHON
import base64

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

response = client.chat.completions.create(
    model="openai/gpt-6-astra",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {"url": f"data:image/png;base64,{encoded}"},
                },
                {
                    "type": "text",
                    "text": (
                        "This is a proposed system architecture. Identify every single point of "
                        "failure and every unbounded queue. Cite the component by its label in "
                        "the diagram. Report nothing you cannot actually see."
                    ),
                },
            ],
        }
    ],
    max_tokens=32768,
    extra_body={"reasoning_effort": "high"},
)

print(response.choices[0].message.content)

Streaming

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

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.

At xhigh the model reasons before emitting anything. Raise client timeouts before deploying a high-effort path; a cancelled request has already cost you the reasoning it did.


When Not To Use It

The most useful thing a flagship page can say.

Not for classification, routing, or formatting. There is no zero-deliberation setting here, and those paths do not benefit from any. The measurement above shows low is not a safe substitute — send that traffic to a lighter model instead.

Not as an undifferentiated default. OpenAI recommends this model as a starting point, which is sound advice for a first integration and poor advice for a mature one. Once you know which of your paths are genuinely hard, route the rest downward.

Not without measuring your own case. A lighter model that succeeds on your input is better than a stronger one that succeeds more expensively.


Limitations

  • No none reasoning level, and low measured worse than none on multi-step reasoning. Deliberation on this model is effectively medium or above.
  • max is not a valid level despite appearing in some documentation.
  • 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.
  • 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.
  • 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.