Overview
GoModel exposes OpenAI-compatible Responses API endpoints under/v1/responses.
Create requests use the translated model routing pipeline, so virtual models,
workflows, guardrails, failover, usage logging, and response caching continue to
apply. Lifecycle and utility endpoints use native provider capabilities when
available, and return explicit compatibility errors when the selected provider
does not support the requested operation.
For feature-level behavior, including hosted tools and chat-translated
providers, see Responses compatibility.
Supported endpoints
Stored responses
ForPOST /v1/responses calls, unless the request sets store: false,
GoModel stores the normalized response body and the normalized input items
of the request as the client sent them (before guardrails edit them, and
without the history a previous_response_id or conversation added). A streamed response is stored from its terminal event
(response.completed, response.incomplete, or response.failed). The snapshot is written in the background after
the response is returned, so storage latency never delays the client. A
GET /v1/responses/{id} issued immediately after the POST can arrive before
the snapshot is stored; graceful shutdown waits
for pending snapshot writes, but a hard process exit can lose one that has not
finished. A snapshot write that fails is logged and counted in the
gomodel_response_snapshot_store_failures_total metric.
This enables:
GET /v1/responses/{id}for responses created through GoModel.GET /v1/responses/{id}/input_itemsfor the original normalized input.DELETE /v1/responses/{id}even when the provider does not expose native response deletion.previous_response_idon chat-translated providers such as Anthropic and Gemini: GoModel follows the stored response and each response it was chained from, and prepends their input items and output to the new input, so the provider receives the whole chain each turn. The response names its predecessor inprevious_response_id, streamed or not. On these providers an id that is not stored (the previous response was sent withstore: false), or belongs to another tenant, returns 404. Native Responses providers receive the id itself and resolve it on their side, so they need no GoModel snapshot.
conversation, is
merged into the input before the prompt-phase guardrails
run, so they check and rewrite it like any other input: a stored response
holds what its client saw, and a presidio
guardrail anonymizes the values it restored there again before the next turn
reaches the provider. When guardrails run and a failover target is
chat-translated, a native primary receives the replayed history instead of
the id as well.
Background responses
background: true returns immediately with a queued snapshot. Because that
snapshot is not final, GET /v1/responses/{id} re-reads it from the provider
that created it on every poll and stores the result once the response reaches
a terminal status (completed, incomplete, failed, or cancelled), so the
usual SDK loop — poll until the status is terminal, then read output — works
through the gateway. Terminal snapshots are served from the store without an
upstream call. If the refresh fails, the stored snapshot is returned unchanged.
Background creates are never served from the response
cache: a queued body carries an id that belongs to
one caller’s response.
Native provider lookup
When a response was not created through the current GoModel process or response store, lifecycle endpoints can still use a native provider lookup. Specify the provider when the response ID is not stored locally:Input items
GoModel normalizes stored input into OpenAI-compatible response input items. String input becomes a user message with aninput_text content item:
Compatibility errors
Some providers do not support every Responses lifecycle or utility endpoint. When the selected provider cannot perform an operation, GoModel returns an OpenAI-compatible error with:invalid_request_error type for unsupported operations
so the public error type set stays closed. The unsupported_response_operation
code identifies the unsupported operation, returned with HTTP 501 Not Implemented.