gpt-6-astra
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.

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.
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:
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:
| Level | Mean reasoning tokens | Correct |
|---|---|---|
none | 0 | 1 of 3 |
low | 777 | 0 of 3 |
medium | 1,377 | 3 of 3 |
xhigh | 1,188 | 3 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 ID | openai/gpt-6-astra |
| Context window | 1,050,000 tokens |
| Max output | 128,000 tokens |
| Knowledge cutoff | 30 April 2026 |
| Input | Text, image |
| Output | Text |
| Reasoning effort | low · medium · high · xhigh |
| Tools | Functions, 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
| Capability | Value |
|---|---|
input_types | text, image |
output_types | text |
audio_input | Not supported |
video_input | Not supported |
context_window | 1050000 |
max_output_tokens | 128000 |
reasoning | low, medium, high, xhigh — no none, no max |
streaming | Supported |
tool_calling | Supported |
structured_output | Supported — JSON schema |
requires_prompt | Yes — text prompt required, image optional |
Calling It on DEVUP AI
Base URL: https://api.devupai.com/v1 · Model ID: openai/gpt-6-astra
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.
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
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
npm install devupaiimport 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
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
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
nonereasoning level, andlowmeasured worse thannoneon multi-step reasoning. Deliberation on this model is effectivelymediumor above. maxis 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.