Eterial Docs
API reference

OpenAI compatibility

What is served, what is passed through, and what does not exist here.

Eterial speaks the OpenAI protocol. The official SDKs work against it unmodified, as does anything built on them — LangChain, LlamaIndex, the Vercel AI SDK, Cline, OpenWebUI.

This page is the exact extent of that.

Endpoints

EndpointServed
POST /v1/chat/completionsYes
GET /v1/modelsYes
POST /v1/embeddingsNo
POST /v1/completionsNo
POST /v1/responsesNo
Images, audio, filesNo
Assistants, batch, moderationsNo

Two endpoints, and nothing else. A call to any of the others is a 404.

Request fields

FieldBehaviour
modelRequired. Rejected with 404 if unknown.
messagesRequired, including multimodal content parts.
streamSupported.
stream_optionsSupported; usage is always returned regardless.
max_tokensSupported. Also sets the balance reserved.
tools, tool_choice, functionsSupported, on models with the capability.
reasoning, reasoning_effortSupported, on models with the capability.
response_formatPassed through; not enforced by us.
temperature, top_p, stop, n, seed, logprobs, logit_bias, presence_penalty, frequency_penalty, userPassed through to the model as sent.

Passed through means exactly that

A field in the last row is neither rejected nor guaranteed. It reaches the model, and the model decides what to do with it. If your code depends on one, test it against the model you intend to use — and re-test when you change models.

Response fields

id, object, created, model, choices and usage are always present and have their usual shapes. Inside usage, prompt_tokens_details and completion_tokens_details appear when the model reports them.

system_fingerprint is not something to rely on here.

Behavioural differences

  • Output is not reproducible. A model is served by more than one backend, so identical requests can produce different answers. seed does not change that. See Routing.
  • Capabilities are checked before the request runs. Asking for tools, reasoning, image or file input on a model without them is a 400, not a silently ignored field. Web search needs tools — see Web search.
  • Error bodies use the OpenAI envelope, and add a stable error.code to it. Branch on that rather than on error.message. See Errors.
  • Mid-stream failures are events, not statuses. See Streaming.

Things OpenAI does not have

  • Idempotency-Key on chat completions, for non-streamed requests.
  • capabilities on each entry of /v1/models.
  • Automatic failover between backends inside a single request.

On this page