GPT Image 2.5 is live — OpenAI's newest image model, targeted edits that leave the rest of the frame alone
rreAPI Docs

gpt-6.1-sol

Call GPT-6.1 Sol, OpenAI's near-Astra GPT-6.1 model for complex coding and professional work, through reAPI's Chat Completions endpoint with text or image input, structured outputs and streaming, billed per token.

OpenAI's GPT-6.1 Sol — "near-Astra performance for complex work at a lower cost", for complex coding, computer use and professional work — exposed through reAPI as an OpenAI-compatible Chat Completions endpoint. A 1,050,000-token context window (up to 922,000 input tokens), 128,000 max output tokens, reasoning_effort from low to xhigh on this endpoint with medium as the default, text and image input, structured outputs and streaming. The wire model id is gpt-6.1-sol. Current rates live on the model page.

Quick example

curl https://reapi.ai/api/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6.1-sol",
    "messages": [
      { "role": "user", "content": "Review this Python function and return the bug and the fix: def avg(xs): return sum(xs) / len(xs) if xs else 0 — callers pass generators as well as lists." }
    ],
    "reasoning_effort": "medium",
    "max_completion_tokens": 2000,
    "stream": true
  }'
from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://reapi.ai/api/v1",
)

stream = client.chat.completions.create(
    model="gpt-6.1-sol",
    messages=[{"role": "user", "content": "Review this Python function and return the bug and the fix: def avg(xs): return sum(xs) / len(xs) if xs else 0 — callers pass generators as well as lists."}],
    reasoning_effort="medium",
    max_completion_tokens=2000,
    stream=True,
)
for chunk in stream:
    delta = chunk.choices[0].delta.content if chunk.choices else None
    if delta:
        print(delta, end="")
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: "YOUR_API_KEY",
  baseURL: "https://reapi.ai/api/v1",
});

const stream = await client.chat.completions.create({
  model: "gpt-6.1-sol",
  messages: [{ role: "user", content: "Review this Python function and return the bug and the fix: def avg(xs): return sum(xs) / len(xs) if xs else 0 — callers pass generators as well as lists." }],
  reasoning_effort: "medium",
  max_completion_tokens: 2000,
  stream: true,
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

func main() {
    body, _ := json.Marshal(map[string]any{
        "model": "gpt-6.1-sol",
        "messages": []map[string]string{
            {"role": "user", "content": "Review this Python function and return the bug and the fix: def avg(xs): return sum(xs) / len(xs) if xs else 0 — callers pass generators as well as lists."},
        },
        "reasoning_effort":      "medium",
        "max_completion_tokens": 2000,
    })
    req, _ := http.NewRequest("POST",
        "https://reapi.ai/api/v1/chat/completions", bytes.NewReader(body))
    req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
    req.Header.Set("Content-Type", "application/json")

    resp, _ := http.DefaultClient.Do(req)
    defer resp.Body.Close()
    out, _ := io.ReadAll(resp.Body)
    fmt.Println(string(out))
}

Authentication

Use your reAPI API key — the same key that calls the image, video and audio endpoints — as a bearer token:

Authorization: Bearer YOUR_API_KEY

Create one under API keys in your reAPI dashboard. Chat requests are billed from the same credit balance as every other model on the platform.

Endpoint

POST /api/v1/chat/completions

Base URL https://reapi.ai/api/v1. The wire format is OpenAI-compatible, so the same SDKs work once you swap the base URL, the key and the model string.

OpenAI lists both v1/responses and v1/chat/completions for GPT-6.1 Sol and states that "tool calling requires the Responses API". reAPI serves this model through Chat Completions; see Tool calling.

Request body

The table follows OpenAI's Chat Completions reference (37 request-body fields). Default is OpenAI's documented default. Notes say what reAPI does with the field and what sending it produced on 2026-10-28, one field per request unless the row names a combination. Every field is forwarded unchanged unless its row says otherwise; where the model rejected a value, its error message comes back inside reAPI's error envelope. An accepted field (200) is not proof that it changed the answer.

FieldTypeDefaultNotes
modelstring—Must be gpt-6.1-sol exactly. Required.
messagesarray—Conversation history: system, developer, user, assistant, tool roles. Text and image parts — see Image input. Required.
reasoning_effortenummediumlow, medium, high, xhigh on this endpoint. OpenAI also lists max; here it currently returns 400 — see reasoning_effort.
max_completion_tokensintegermodel limitUpper bound on generated tokens, reasoning included, up to 128,000. Enforced: a 40-token cap stopped at exactly 40 tokens with finish_reason: "length" — all 40 were reasoning tokens, so the visible answer was empty. Omitted → 128,000.
max_tokensinteger—Deprecated by OpenAI in favour of max_completion_tokens. Accepted: reAPI sends its value as max_completion_tokens (when both are set, the smaller one) and does not forward max_tokens itself.
streambooleanfalseServer-sent events ending with data: [DONE].
stream_optionsobject—On streamed requests reAPI replaces it with { "include_usage": true }, so the last data chunk carries usage.
response_formatobjecttextjson_schema (with strict) and json_object both applied.
ninteger1Applied: n: 2 returned two choices. Every choice is billed.
temperaturenumber1Only 1 is accepted; any other value returns 400 ("Only the default (1) value is supported").
top_pnumber1Returns 400 ("Unsupported parameter").
frequency_penalty, presence_penaltynumber0Return 400 ("Unsupported parameter").
stopstring or array—Returns 400 ("Unsupported parameter").
logprobs, top_logprobsboolean, integerfalse, —Sent together, they returned 400 ("Unsupported parameter") naming logprobs; top_logprobs was not sent alone.
logit_biasobject—Returns 400 ("Unsupported parameter").
predictionobject—OpenAI lists predicted outputs as unsupported for this model; returns 400.
seedinteger—Accepted; determinism not demonstrated.
verbosityenummediumlow, medium, high. Accepted; no measured effect.
tools, tool_choice, parallel_tool_callsarray, enum/object, boolean—, auto, —tools alone, and tools with tool_choice: "required" and parallel_tool_calls: false, returned 400. tool_choice and parallel_tool_calls were not sent without tools. See Tool calling.
functions, function_callarray, enum/object—Deprecated by OpenAI in favour of tools. functions returned the same 400; function_call was not tested.
web_search_optionsobject—Returns 400 ("Unknown parameter").
audio, modalitiesobject, array["text"]GPT-6.1 Sol outputs text only. modalities returns 400 ("Unknown parameter").
service_tierenumautoAccepted. flex and priority were answered at the default tier and billed at the standard rate.
prompt_cache_key, prompt_cache_options, prompt_cache_retentionstring, object, enum—Accepted. Caching itself works — see Pricing.
store, metadataboolean, object—Accepted. metadata requires store: true; with store: false it returns 400.
moderationobject—Accepted; no moderation result is returned.
safety_identifier, userstring—Accepted.

Checked before anything is forwarded or charged:

  • the body is a JSON object of at most 33,554,432 bytes (413 above that)
  • model is exactly gpt-6.1-sol (surrounding whitespace is ignored)
  • messages is a non-empty array, and every entry is an object with a non-empty role
  • stream, when present, is a boolean
  • max_completion_tokens / max_tokens, when present and not null, is a positive integer no larger than 128,000
  • n, when present and not null, is a positive integer

Everything else, including fields not in the table, is passed through for the model to accept or reject.

reasoning_effort — enum, default medium

OpenAI's model page: "reasoning.effort supports low, medium (default), high, xhigh, and max." OpenAI's GPT-6 guide: "GPT-6 Astra and GPT-6.1 Sol do not support the none reasoning effort."

On this endpoint, low, medium, high and xhigh are applied. max currently returns 400 with "Supported values are: 'low', 'medium', 'high', and 'xhigh'" (checked 2026-10-28); the request is forwarded unchanged and nothing is charged. none and minimal return the same error.

EffortWhen to use it
lowShort reasoning: clear extraction, small fixes, routine edits
mediumThe default
highMulti-file changes, long documents, conflicting requirements
xhighThe hardest cases offered on this endpoint

Reasoning tokens bill as output. max_completion_tokens caps them together with the visible answer.

Tool calling

OpenAI's model page: "Tool calling requires the Responses API." Its GPT-6 guide: "GPT-6 Astra, GPT-6.1 Sol, and GPT-6.1 Terra support Chat Completions, but tool calling requires Responses."

On this endpoint, requests with tools or functions return 400 at every effort level offered. Structured outputs and streaming are documented for Chat Completions and work here.

Image input

ModalitySupported
Text in✅
Image in✅
Text out✅
Audio in / out❌
Video in❌

Images go in as image_url content parts with a public HTTP(S) URL. Image tokens count as input. Output is text only.

Troubleshooting

FailureWhat it meansWhat to do
400 naming a fieldA check in the list above failedFix the field; nothing was charged
400 "Unsupported model"model is not gpt-6.1-solSend the id exactly — gpt-6-sol is the older Sol
400 "does not support 'max'"max is not accepted on this endpointUse xhigh
400 "Unsupported parameter" / "Only the default (1) value"A sampling field the model rejectsRemove temperature, top_p, the penalties, stop or logprobs
400 "Function tools with reasoning_effort are not supported"Tools on Chat CompletionsCall GPT-6.1 Sol without tools on this endpoint
401Missing or invalid API keyCreate a key under API keys in the reAPI dashboard
402Insufficient balanceTop up your reAPI credits
413Body larger than 33,554,432 bytesShorten the conversation or send images by URL

Failures use the standard envelope: error.code, error.message, error.type and error.request_id. See the errors catalog.

Response envelope

Non-streaming (stream: false)

{
  "id": "req_...",
  "object": "chat.completion",
  "created": 1793150000,
  "model": "gpt-6.1-sol",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "..." },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 120,
    "completion_tokens": 48,
    "total_tokens": 168,
    "prompt_tokens_details": { "cached_tokens": 0 },
    "completion_tokens_details": { "reasoning_tokens": 0 }
  }
}

id is the reAPI request id (req_…), the same value as error.request_id on a failure — quote it to support. usage.completion_tokens includes reasoning tokens, and usage.prompt_tokens_details.cached_tokens is the part of the prompt billed at the cache-read rate.

Streaming (stream: true)

Server-sent events, each data: line carrying a chat.completion.chunk with the incremental text in choices[0].delta.content. The last chunk before data: [DONE] carries usage; a chunk with an empty choices array is normal and should be skipped.

Pricing

GPT-6.1 Sol bills per token, from your reAPI credit balance:

cost = input × input_rate + cache_read × cache_read_rate
     + cache_write × cache_write_rate + output × output_rate
1 credit = $0.001
$1 = 1,000 credits

1. Cache reads and writes have their own rates

Prompt tokens served from cache (usage.prompt_tokens_details.cached_tokens) bill at the cache-read rate, 5% of the input rate. The first request that writes a prefix to the cache bills those tokens at the cache-write rate. Keep a stable prefix — system message, instructions, reference documents — at the start of the conversation so repeat requests hit the cache.

Checked on 2026-10-28: a 2,683-token prompt sent twice reported cache_write_tokens: 2680 the first time and cached_tokens: 2680 the second; the second request was billed at about 7% of the first.

2. Reasoning tokens are output

usage.completion_tokens includes reasoning tokens. reasoning_effort and max_completion_tokens are the levers on cost.

3. Prompts over 272K input tokens re-price the whole request

OpenAI's rule for this model: "Prompts with more than 272K input tokens are priced at 2x input and cache rates and 1.5x output for the full request." The long-context rates are listed separately on the model page.

reAPI bills GPT-6.1 Sol at OpenAI's standard per-token rate. Current numbers are on the model page — that table is the canonical source, not this page.

Table of Contents