OpenAI Compatibility¶
Verda Inference speaks the OpenAI Chat Completions API. OpenAI SDKs and tools work with Verda once you change two settings:
| Setting | Value |
|---|---|
| Base URL | https://inference.verda.com/v1 |
| API key | Your inference API key |
If you set OPENAI_BASE_URL and OPENAI_API_KEY in your environment, the OpenAI SDKs pick them up without code changes. See Quickstart.
Endpoints¶
Verda Inference serves POST /v1/chat/completions, with and without streaming, POST /v1/responses for clients that use the Responses API, and GET /v1/models, which lists the models your project can call. See Inference Endpoint API. Other OpenAI endpoints, such as embeddings, images or audio, return 404 with the code endpoint_not_supported.
Request parameters¶
You can send the usual Chat Completions parameters, including messages, max_tokens, temperature, top_p, stop, seed, tools, tool_choice and response_format. Tool calling and JSON mode work on models that list them under features on their model page.
A few things work differently:
nmust be1. Each request returns one choice.- Send extra parameters at the top level of the JSON body. A body field named
extra_bodyis rejected with400 unsupported_parameter. The Python SDK'sextra_bodyargument is fine, because the SDK merges it into the body before sending. - Parameters the API doesn't support are ignored.
Streaming¶
Set "stream": true to receive the response as server-sent events. The stream ends with data: [DONE].
To get token usage for a streamed response, ask for it:
The last chunk before [DONE] then carries the usage object.
Timeouts¶
A request without streaming times out after 60 seconds. A streamed response can run for up to 20 minutes. For long generations, such as an agent writing a large file, set "stream": true.
Requests that time out aren't charged.
Reasoning¶
Reasoning models think before they answer. They return their thinking in reasoning_content, separate from the answer in content. When streaming, it arrives in delta.reasoning_content. Reasoning counts as output tokens and is billed like them.
Two request fields control it:
reasoning_effortsets how much the model thinks, for exampleloworhigh. Lower effort answers faster and costs less. Each model's page lists the efforts it accepts and its default.max_tokenscaps the reasoning and the answer together. If the model uses it all while reasoning,contentcomes back empty andfinish_reasonislength. Raisemax_tokens, or lowerreasoning_effort.
Some models always reason, so every request uses some reasoning tokens. The reasoning field of GET /v1/inference/models lists a model's options: supported_efforts (cheapest first), default_effort, and optional, which says whether reasoning can be turned off.
Errors¶
Errors use the OpenAI error format, with error.type, error.code and error.message, so OpenAI SDKs raise them as usual.
| Status | Code | What it means | What to do |
|---|---|---|---|
400 |
invalid_request, unsupported_parameter, upstream_error |
The model can't take the request, for example a parameter isn't supported or the prompt is too long | Fix the request. The message names the problem. |
401 |
invalid_api_key |
The API key is missing, wrong or deleted | Check the key. Use an inference API key, not a Cloud API credential. |
402 |
Inference is paused because the project balance is too low | Top up your balance. | |
403 |
subscription_required |
The model isn't enabled for your project | Enable the model. |
403 |
model_access_denied, tenant_suspended |
Your project can't use this model, or inference is suspended for it | Contact support. |
404 |
model_not_found |
No model has this ID | Check the model ID. |
404 |
endpoint_not_supported |
The endpoint isn't served | Use /v1/chat/completions. |
413 |
request_too_large |
The request body is too large | Send a smaller request. |
429 |
rate_limit_exceeded |
You reached a rate limit | Wait for Retry-After, then retry. See Rate limits. |
5xx |
A temporary problem on our side | Retry with exponential backoff. |