One Chat interface in the app, with Inroi Chat first and Requesty Responses as fallback

Production relay verification of OpenAI's GPT-5.6 Luna and Terra: Foreverse keeps one Chat interface, routes first to Inroi Chat, and falls back once to Requesty Responses before any upstream frame is exposed. Continuation, expansion, two-step agent tools, a 32K output envelope, cache hits, and normalized pricing are documented with real traces.

An API key resting between two parallel pipes labeled Chat and Responses, both joining an open novel at the far end

The hardest part of using a relay is rarely a missing comma. It is keeping three separate questions separate: what protocol the app speaks to Foreverse, what protocol Foreverse speaks to each relay, and which price table settles the result. The Luna/Terra production route now has a clean answer. The client always sends OpenAI Chat; Inroi is the primary Chat upstream; only a pre-frame primary failure is converted into a Requesty Responses call.

Why keep one app-facing Chat API and two upstream protocols?

Android and iOS do not need to know which relay is carrying a request. They continue to send Chat Completions SSE to Foreverse. The backend performs the provider-specific conversion, so continuation, expansion, roleplay, and agent traffic keep one client message path instead of scattering vendor branches through the UI.

Official OpenAI model IDApp → ForeversePrimary: InroiFallback: Requesty
gpt-5.6-lunaOpenAI Chat SSEgpt-5.6-luna · Chatopenai-responses/gpt-5.6-luna · Responses
gpt-5.6-terraOpenAI Chat SSEgpt-5.6-terra · Chatopenai-responses/gpt-5.6-terra · Responses

Inroi's API base is https://www.inroi.shop/v1. Requesty's API base ishttps://router.requesty.ai/v1; https://app.requesty.ai/ is a dashboard and returns a web page or 404 when treated as an API host. The working Requesty path is not an openai/ model forced through Chat. It is /responses with the openai-responses/ catalog prefix.

Failover policy: one primary attempt, one fallback attempt—not three retries

Text generation is a paid, long-running write. Retrying the same broken route three times multiplies delay and may multiply upstream cost. The safe boundary is whether the user has received an upstream frame: before that point, switching is possible; after it, replay is prohibited.

Observed stateSwitch to Requesty?Why and how it settles
Inroi streams normallyNoPrimary completes; fallback is untouched
Connection failure or connection/first-frame timeoutYes, once immediatelyNo upstream frame has reached the app
401/402/403, 408/409/425, 429, or 5xxYes, once immediatelyOnly before the first upstream frame
Retryable top-level SSE error inside HTTP 200Yes, once immediatelyThe error has not been exposed as prose or a tool frame
Any Inroi frame was forwarded, then the stream breaksNoPrevents duplicate partial prose, tools, and cost
The client cancelsNoCancellation does not start another paid request
Requesty also failsNo further retryReturn a safe error; both routes share one hold and one settlement

If both routes fail with zero output, the hold is refunded. If Inroi fails and Requesty succeeds, the request settles once from final usage. The failed primary attempt still enters channel-health telemetry so fallback success does not erase it, but deliberately injected production checks are not a relay SLA sample.

What actually passed in production?

The final matrix went beyond a hello-world prompt. Both routes exercised normal continuation, one-shot expansion, the first agent turn that emits a tool call, the second turn that returns a final answer after tool output, and a repeated-prefix cache probe. Earlier timeout, partial-stream, and Requesty tool-shape failures remain part of the record; the table describes the fixed final path.

ScenarioInroi ChatRequesty ResponsesFinal result
Luna / Terra plain text and streamed continuationCompletedCompletedProse and usage settled
One-shot expansionCompletedCompletedNo client protocol branch
Agent turn 1 emits a tool callCompletedCompletedIncludes a high-reasoning case
Tool output returns a final answerCompletedCompletedTwo-request tool loop closed
Repeated-prefix cache probeHit observedHit observedCache reads only

The earlier Requesty agent 400 came from sending Chat's nested named-function selector unchanged into Responses. A direct A/B isolated the required flat function-name shape. Once the conversion was fixed, both Luna and Terra completed the tool call and tool-result turn. “Supports tools” and “accepts every compatibility parameter shape” are not the same claim.

An older screening run also produced an xhigh response with output_tokens=8192,reasoning_tokens=8192, and no prose. Those direct Requesty calls explicitly used an 8K benchmark cap and did not traverse Foreverse. The old server and Agent / Reader defaults nevertheless used the same 8K envelope, so the product route had the same failure mode. Reasoning, tool arguments, and visible prose share the output budget; 8K was a billing-hold guardrail, not the model's capability limit.

How much cache was observed—and why is cache write still unknown?

A direct Requesty repeat first established automatic prefix caching. Production then tested Inroi with an explicit stable route key and Requesty through the forced Responses fallback. These are token observations, not a promise of a permanent hit rate.

Route / official modelFirst requestFirst observed hitcache_write_tokens
Requesty direct · Luna3,142 input / 0 cachedRequest 2: 3,139 cachednull
Requesty direct · Terra3,142 input / 0 cachedRequest 2: 3,139 cachednull
Inroi production · Luna3,924 input / 0 cachedRequest 2: 2,816 cachednull
Inroi production · Terra3,924 input / 0 cachedRequest 3: 2,816 cachednull
Requesty production · Luna1,840 input / 0 cachedRequest 2: 1,837 cachednull
Requesty production · Terra1,904 input / 0 cachedRequest 2: 1,901 cachednull

A separate explicit 5,247-token probe hit 5,244 cached tokens on both official model IDs. Inroi did not report cache hits for repeated large prefixes until the request received a stable prompt_cache_key and explicit cache mode. That key is a hash derived from user and public model scope; it contains no prompt, email address, or raw user ID.

Neither relay currently exposes cache_write_tokens. The honest value is therefore null, not zero. The backend understands both the standard field and Requesty's compatibility alias and can price writes at 1.25x, but it does not reverse-engineer writes from a miss or from a relay cost field.

Keep base short-context rates separate from App prices with a 50% markup

The normalized price source is the OpenAI Standard short-context table and prompt-caching rules as observed on July 31, 2026—not either relay's usage.cost. OpenAI's July 30 changelog also records an 80% price cut for Luna and a 20% cut for Terra; the table below uses those post-cut official short-context rates.

ModelBase input $/MBase cache read $/MBase cache write $/MBase output $/MApp +50%: input / read / write / output credits/M
Luna$0.20$0.02$0.25$1.203,000 / 300 / 3,750 / 18,000
Terra$2.00$0.20$2.50$12.0030,000 / 3,000 / 37,500 / 180,000

1 credit = $0.0001. The base dollar rate is converted to credits, multiplied by 1.5, and the whole request is rounded up. Ordinary input, cache writes, and cache reads are mutually exclusive slices of prompt tokens; cached tokens are not charged twice, and the cache-write rate is exactly 1.25x ordinary input. Foreverse currently caps relayed prompts for these two official models at 200k tokens so a request cannot enter a more expensive long-context tier while being sold at the short-tier rate.

Example usageLuna App priceTerra App price
9 input + 5 output tokens1 credit2 credits
10,000 input + 2,000 output66 credits660 credits
50,000 input + 5,000 output240 credits2,400 credits
2k ordinary + 2k write + 6k read + 2k output52 credits513 credits

Inroi and Requesty can have different internal acquisition costs, and a relay may report an older rate or its own multiplier. Foreverse does not pass that difference to the user: both routes settle from the normalized table above. Conversely, when usage is incomplete, one internal cost number is not enough to invent a token breakdown.

What this production test proves—and what it does not

It proves that these two official OpenAI model IDs completed continuation, expansion, agent tools, cache reads, failover, and normalized billing through two production relay paths. It does not turn relayed traffic into a direct-OpenAI test, turn forced-failure checks into an SLA, or substitute interface success for a fiction-quality benchmark.

Catalogs and prices change; every number on this page is dated July 31, 2026. For the mechanics behind repeated-prefix discounts, read our prompt-caching bill post-mortem. For the difference between a hosted route and your own key, see what BYOK actually means. The longer market view lives in our token-price trend memo.

Writing quality has its own evidence trail: the 548-completion Luna/Terra fiction benchmark and the DeepSeek/Luna/Terra buying comparison. The unedited Chinese round 1 and round 20 outputsare published separately so readers can choose before seeing the model names.

Protocol references: Requesty Responses,OpenAI changelog,Standard pricing, andprompt caching.

FAQ

Are gpt-5.6-luna and gpt-5.6-terra official OpenAI model names?

Yes. OpenAI's official changelog launched the GPT-5.6 family, positioning Luna for efficient high-volume work and Terra for a balance of intelligence and cost; the official pricing table lists both model IDs directly. This test sent traffic through Inroi and Requesty relays, so it is not a claim that Foreverse called OpenAI directly.

What is the correct Requesty API host?

Use https://router.requesty.ai/v1. The URL https://app.requesty.ai/ is the management dashboard, not an API host. The Luna/Terra fallback calls /v1/responses and maps the official model IDs to openai-responses/gpt-5.6-luna or openai-responses/gpt-5.6-terra.

Does Foreverse retry Inroi three times before failing over?

No. Inroi gets one attempt. A connection failure, first-frame timeout, rate limit, authentication-class error, or 5xx before any upstream frame reaches the app triggers one immediate Requesty attempt. Once any frame has been forwarded, failover is forbidden to prevent duplicate prose, tools, and upstream charges.

Do Luna and Terra tool calls work in agents now?

In the final production matrix, both official model IDs completed the first tool-call turn and the final answer after tool output through both Inroi and Requesty. Requesty must use the Responses route and flatten named Chat tool choice into the Responses shape. An earlier Chat-shaped combination returned 400; that did not mean the models lacked agent capability.

Do both relays support prompt-cache hits?

Cache reads were observed on both. Repeated prefixes hit on the second Requesty request; Inroi began reporting hits after these official model IDs received a stable cache key and explicit cache mode. Neither relay currently reports cache_write_tokens, so the evidence proves reads, not observable cache writes.

Why list a 1.25x cache-write rate when cache_write_tokens is null?

The billing path supports the GPT-5.6 cache-write tier, but applies it only when authoritative cache_write_tokens arrive. A null field remains unknown. Foreverse does not infer writes from a cache miss, relay usage.cost, or ordinary prompt tokens.

Does the user price change when traffic falls back to Requesty?

No. Foreverse settles both routes from token usage and one normalized price table while ignoring relay-reported usage.cost for user billing. Luna and Terra differ by 10x in the normalized model rates; failover itself adds no user surcharge.

Why did Luna once spend all 8,192 output tokens on reasoning?

Reasoning and visible text share one output allowance. An older benchmark runner and the old Foreverse path both used an 8K envelope, which xhigh could exhaust before producing prose. On July 31, 2026, the production backend raised the default and hard cap for large-window models such as Luna, Terra, and DeepSeek V4 to 32,768. That is a ceiling, not fixed usage. An older store app that explicitly requests 8,192 is still respected until its client update ships.

Questions or ideas? Join our Discord →