https://api.veri.studio/v1/deployments/{deployment_id}. Anything that already speaks OpenAI works — point base_url at the deployment and pass your Veri API key.
Use the full URL
https://api.veri.studio/v1/deployments/{dep.id} as base_url. The OpenAI client appends /chat/completions for you. The dep.endpoint_url field on the SDK response is the absolute chat URL (it already ends in /chat/completions), authenticated with your Veri API key: use it for direct curl-style calls, not as the OpenAI SDK’s base_url.What works
Basic chat with one or more messages, returning a completion. Works in:- OpenAI Python SDK
- OpenAI Node SDK
- LangChain (
ChatOpenAI(base_url=...)) - LlamaIndex (
OpenAILike(api_base=..., is_chat_model=True)) - Vercel AI SDK
- curl with the standard OpenAI request shape
- Anything else that targets
/chat/completions
Streaming
Streaming works: setstream=true and vLLM’s SSE events are forwarded through unchanged, so for chunk in oai.chat.completions.create(..., stream=True) behaves exactly as it does against OpenAI. Veri meters token usage for every stream server-side. Your client receives the final usage-only chunk (empty choices, populated usage) only when it asks for it with stream_options: {"include_usage": true}, matching OpenAI’s behaviour; without it the stream ends after the last content chunk, so loops that index choices[0] keep working.
Long generations
Usestream=true for any answer that can take more than a minute to generate (a large max_tokens, a reasoning model, a small GPU). A stream sends tokens as they are produced, so the connection is never idle and there is no time limit beyond your client’s own.
Non-streaming requests work for long generations too. A request that finishes within 60 seconds is answered exactly as described below. One that is still generating after 60 seconds changes in three ways:
- The response starts early. The
200status and headers are sent at 60 seconds, then a newline every 15 seconds until the answer is ready, and then the completion JSON. This keeps proxies and the API’s network edge (which closes a connection that sends nothing for about 100 seconds) from cutting the request and making your client retry the whole generation. JSON allows leading whitespace: the OpenAI Python and Node SDKs,httpx,requests, andJSON.parseparse the body unchanged. - A late failure is in the body. The status is already
200, so an error after that point comes back as{"error": {"code": ..., "message": ...}}with nochoices, the same error object a non-200response carries (for example codeupstream_unavailablewhen the model server fails). If you parse responses yourself, check for anerrorkey. With the OpenAI Python SDK,response.choicesisNoneand the error is inresponse.model_extra["error"]; the Veri SDK raises it as aVeriError. - Ten-minute limit. A non-streaming request still running after 600 seconds is stopped and answered with error code
generation_timeout. Sending the same request again hits the same limit, so switch tostream=true.
Everything else is a passthrough
The proxy keeps a few typed fields (model, messages, temperature, max_tokens, stream) and forwards everything else the client sends — top_p, stop, seed, frequency_penalty, presence_penalty, logit_bias, response_format, tools, tool_choice, … — to vLLM untouched. vLLM is the schema authority: it applies its own defaults for omitted fields and rejects what it doesn’t support.
Caveats:
- Tool calling (
tools,tool_choice) rides through, but the deployment’s vLLM must have tool parsing enabled — passvllm_extra_argsat create time (for example--enable-auto-tool-choice --tool-call-parser hermes). Without those flags vLLM rejects tool requests. - Reasoning (Qwen3). Veri starts vLLM with
--reasoning-parser qwen3for the hybrid-thinkingQwen/Qwen3-*checkpoints (0.6Bto235B-A22B, their-FP8,-AWQand-GPTQquants, and-Thinking-2507). The model’s thinking comes back inmessage.reasoning(streaming:delta.reasoning), never insidecontent; on the Anthropic/v1/messagesroute it is athinkingblock. To pick another parser, pass your own--reasoning-parserinvllm_extra_args. To skip thinking, sendchat_template_kwargs: {"enable_thinking": false}per request, or set--default-chat-template-kwargs '{"enable_thinking": false}'at create. A request withreasoning_effort(on/v1/messages:output_config.effort, which Claude Code sends) turns thinking back on for that request. - Structured outputs (
response_format) are handled by vLLM’s guided decoding; support depends on the engine version and model. - Vision / audio inputs depend on the served model being multimodal; text-only models reject them.
Request shape
model field accepts any string: the proxy rewrites it to the deployment’s served name (its name) before forwarding, so the response’s model is the served name rather than whatever you sent. On a multi-adapter fleet (beta) (see also Model versions) model selects the adapter to route to, and an unknown name is rejected with the list of valid names.
Response shape
finish_reason values: stop (normal end), length (hit max_tokens), tool_calls (when tool calling is enabled). Extra top-level fields vLLM returns (system_fingerprint, …) are preserved in the response.
Scaled-to-zero deployments
If the deployment scaled to zero, the first request triggers a wake and returns503 with a Retry-After header and error code deployment_waking while the GPU boots (a few minutes). The OpenAI client’s built-in retries give up well before that, so either retry on 503 yourself until the cold start completes, or pre-warm with veri deployments wake <id> before sending traffic. The Veri SDK’s chat() handles this retry loop for you.
Upstream failures
Transient upstream failures use the same shape. If the model server is unreachable, answers5xx or 429, or no replica is serving, the proxy returns 503 with a Retry-After header and error code upstream_unavailable. Treat it like deployment_waking: retry after Retry-After seconds rather than failing the request.
LangChain example
LlamaIndex example
LlamaIndex’sOpenAI class only accepts OpenAI model names, so use OpenAILike (pip install llama-index-llms-openai-like):
curl
Responses API
Every deployment also serves the OpenAI Responses API athttps://api.veri.studio/v1/deployments/{deployment_id}/responses, for clients that speak only Responses, such as the Codex CLI. Point the client’s base URL at the deployment (/responses is appended for you) and authenticate with your Veri API key or a model access key for that deployment.
~/.codex/config.toml
- The request goes to the deployment’s own vLLM
/v1/responses, the same model server as/chat/completions. Tool calls (tools,function_callitems) go through the deployment’s--tool-call-parser, so launch the deployment with--enable-auto-tool-choice --tool-call-parser <parser>for your model (for examplehermesfor Qwen). A deployment on its ownvllm_imageneeds a vLLM that serves/v1/responses. modelis rewritten to the deployment’s served name; the rest of the body is passed through.stream: truestreams the Responses events (response.created…response.completed) as server-sent events, untouched.- Clients that append
/v1/responsesto a base without the version can usehttps://api.veri.studio/v1/deployments/{deployment_id}/v1/responses, the same route. - Every call lands in the deployment’s request log with its tokens (
prompt_tokens= the response’sinput_tokens, cached tokens included;cached_prompt_tokens=input_tokens_details.cached_tokens;completion_tokens=output_tokens). - The same wake and retry contract as chat: a parked deployment answers
503deployment_wakingwhile it boots, and503upstream_unavailablecovers a replica that cannot be reached; both carryRetry-After. Errors from vLLM itself (a prompt longer than the served context, say) come back as vLLM sent them. Request bodies are capped at 8 MB. - vLLM does not store responses (
storeis ignored), soprevious_response_idis not available: send the conversation ininput, as Codex does.
What about embeddings?
Not supported — Veri serves chat completions only, not embeddings. Use a dedicated embeddings provider or run a local model for that surface.Where to go next
Deployments API
create / chat / stop endpoint reference.Deployment observability
Request, token, latency, and replica metrics.
Hosting & GPU sizing
Pick the right GPU for the model.
Quickstart
First-time deployment in ~10 minutes.

