Model Deployments¶
Model deployments tell DeltaLLM how to reach a real provider-backed model.
A concrete chat deployment can also classify requests for one or more Model Groups without being an answer member. There is no selector-only model type or extra activation switch. Configure its own capabilities, context, token prices and RPM/TPM limits, then choose it in the group's routing policy. Published references protect it against deletion or incompatible metadata changes; switch/remove those references first. See model router administration.
In simple terms:
- clients call a public model name such as
gpt-4o-mini - DeltaLLM resolves that name to one or more concrete deployments
- each deployment contains the provider details, credentials, mode, and optional pricing metadata
Quick Success Path¶
For most teams, use this model lifecycle:
- Keep
general_settings.model_deployment_source: db_only - Create deployments through the Admin UI or Admin API
- Use one-time config bootstrap only to seed the first models into the database
- After models exist in the database, manage them there instead of editing
config.yaml
First Working Example¶
model_list:
- model_name: gpt-4o-mini
deltallm_params:
provider: openai
model: openai/gpt-4o-mini
api_key: os.environ/OPENAI_API_KEY
api_base: https://api.openai.com/v1
timeout: 60
This creates one public model name, gpt-4o-mini, backed by one OpenAI deployment.
Choose a Storage Mode¶
Runtime deployments are stored in the deltallm_modeldeployment table. DeltaLLM can read model definitions from the database, from config.yaml, or both.
| Mode | What it does | When to use it |
|---|---|---|
db_only |
Read deployments only from the database | Recommended for normal runtime operations |
hybrid |
Prefer database, fall back to model_list if the DB is empty or unavailable |
Transitional setups |
config_only |
Read only from model_list |
Static or file-managed setups |
Bootstrap Behavior¶
Use config bootstrap only when you want to seed model_list into an empty database.
After the initial seed, set model_deployment_bootstrap_from_config back to false.
Fields You Usually Need¶
| Field | Status | What it means |
|---|---|---|
model_name |
Required | Public model name clients send in API requests |
named_credential_id |
Optional | Shared provider credential to merge into this deployment |
deltallm_params.provider |
Recommended for new config; required by the admin UI/API | Authoritative provider identity for routing visibility, dashboards, spend, callbacks, and metrics |
deltallm_params.model |
Required | Upstream model ID sent to the provider; provider prefixes remain supported as legacy/import fallback |
deltallm_params.api_key |
Required unless supplied by named_credential_id |
Provider API key |
deltallm_params.api_base |
Optional | Custom provider base URL |
deltallm_params.auth_header_name |
Optional | Custom upstream auth header key for supported OpenAI-compatible providers |
deltallm_params.auth_header_format |
Optional | Custom upstream auth header value template, must include {api_key} |
deltallm_params.timeout |
Optional | Upstream timeout in seconds |
deltallm_params.weight |
Optional | Relative weight when multiple deployments share one public model |
model_info.mode |
Optional | Runtime workload type such as chat, embedding, or rerank |
model_info.access_groups |
Optional | Authorization groups attached to the public callable target |
model_info.tags |
No | Routing tags for deployment selection; not authorization |
routing_state_incarnation |
Server-managed | Stable opaque identity used to fence provider-health generations; admin-created config deployments populate it automatically |
Database-backed deployments derive their routing-state incarnation from the immutable creation timestamp.
For config_only deployments created through the admin API, DeltaLLM stores an opaque incarnation.
Ordinary updates keep that value.
Existing entries written by hand without this field use their deployment ID as a compatibility incarnation.
If you manually recreate an otherwise identical config-only deployment with the same ID, set a new opaque routing_state_incarnation.
Do not change this value for metadata-only edits.
Model-router Capability and Price Metadata¶
Selector-enabled Route Groups require explicit operator-qualified model_info.chat_capabilities
on every enabled member. An empty object declares the plain text-chat floor. Optional features
default to false; DeltaLLM does not guess capabilities from model names. Set only features the
specific provider/deployment can honor. Unknown keys and non-boolean flags are rejected.
model_info:
mode: chat
max_tokens: 32768 # Illustrative; use the deployment's actual context capacity.
chat_capabilities:
tools: true
json_object: true
json_schema: true
image: false
audio: false
file: false
streaming: true
multiple_choices: false
rpm_limit: 100 # Required positive limits for the classifier.
tpm_limit: 1000000
input_cost_per_token: 0.000001 # Illustrative provider prices, not customer tier prices.
output_cost_per_token: 0.000002
Context capacity must include a known positive max_tokens or max_input_tokens. The classifier
supports input/output token prices, optional input_cost_per_token_cache_hit, and optional
cost_per_request. Unsupported nonzero real-time billing dimensions fail qualification; separate
Batch token rates do not affect this real-time call. Configure zero prices explicitly only when
the provider call is truly free. Customers pay the frozen selector provider cost without markup.
File configuration and the admin model API accept this metadata. Existing model-form saves preserve these fields; configure the flags through the API or file until guided editing is delivered. Changes affecting an active selector are revalidated, and updated capabilities participate in response-cache identity. See model-router activation for required outbox, context policy, capacity, data handling and soft-budget settings.
Custom Upstream Auth Headers¶
These deltallm_params fields are available for the OpenAI-compatible providers that support custom upstream auth headers:
openaiopenroutergroqtogetherfireworksdeepinfraperplexityvllmlmstudioollama
Use:
auth_header_namefor the header key, such asX-API-Keyauth_header_formatfor the value template, such asToken {api_key}
If you omit both fields, DeltaLLM uses the default Authorization: Bearer {api_key} upstream auth pattern.
Example config-file deployment for a vLLM gateway that expects X-API-Key:
model_list:
- model_name: support-vllm
deltallm_params:
provider: vllm
model: vllm/meta-llama/Llama-3.1-8B-Instruct
api_key: os.environ/VLLM_GATEWAY_KEY
api_base: https://vllm.example/v1
auth_header_name: X-API-Key
auth_header_format: "{api_key}"
model_info:
mode: chat
Validation rules:
auth_header_formatmust contain the exact{api_key}placeholder- extra placeholders, format specifiers, and conversions are rejected
- reserved header names such as
Content-Typeare rejected
Multiple Deployments Behind One Public Model¶
You can attach more than one deployment to the same public model name by repeating model_name.
model_list:
- model_name: gpt-4o
deltallm_params:
provider: openai
model: openai/gpt-4o
api_key: os.environ/OPENAI_API_KEY
- model_name: gpt-4o
deltallm_params:
provider: azure_openai
model: azure/gpt-4o-deployment
api_key: os.environ/AZURE_API_KEY
api_base: https://your-resource.openai.azure.com
DeltaLLM then routes requests for gpt-4o across those deployments using the active routing strategy.
For day-to-day operations, the preferred workflow is still to manage explicit route groups in the Admin UI.
Set the Workload Type¶
DeltaLLM supports several runtime modes. Use model_info.mode when the deployment is not a standard chat model.
| Mode | Used by |
|---|---|
chat |
/v1/chat/completions, /v1/completions, /v1/responses |
embedding |
/v1/embeddings |
image_generation |
/v1/images/generations |
audio_speech |
/v1/audio/speech |
audio_transcription |
/v1/audio/transcriptions |
rerank |
/v1/rerank |
model_list:
- model_name: whisper-large
deltallm_params:
provider: groq
model: groq/whisper-large-v3-turbo
api_key: os.environ/GROQ_API_KEY
model_info:
mode: audio_transcription
ElevenLabs Audio Examples¶
ElevenLabs is a native audio provider. Public clients still call the OpenAI-compatible DeltaLLM routes, while DeltaLLM translates upstream calls to ElevenLabs native endpoints with xi-api-key auth.
Text-to-speech deployment with inline credentials:
model_list:
- model_name: elevenlabs-tts
deltallm_params:
provider: elevenlabs
model: elevenlabs/eleven_multilingual_v2
api_key: os.environ/ELEVENLABS_API_KEY
api_base: https://api.elevenlabs.io/v1
model_info:
mode: audio_speech
default_params:
voice_id: 21m00Tcm4TlvDq8ikWAM
output_format: mp3_44100_128
Speech-to-text deployment with inline credentials:
model_list:
- model_name: elevenlabs-stt
deltallm_params:
provider: elevenlabs
model: elevenlabs/scribe_v2
api_key: os.environ/ELEVENLABS_API_KEY
api_base: https://api.elevenlabs.io/v1
model_info:
mode: audio_transcription
default_params:
timestamps_granularity: word
diarize: true
Named-credential-backed deployments keep connection fields out of deltallm_params. Create the ElevenLabs named credential first, then reference it from each deployment:
model_list:
- model_name: elevenlabs-tts
named_credential_id: cred-elevenlabs-prod
deltallm_params:
provider: elevenlabs
model: elevenlabs/eleven_multilingual_v2
model_info:
mode: audio_speech
default_params:
voice_id: 21m00Tcm4TlvDq8ikWAM
- model_name: elevenlabs-stt
named_credential_id: cred-elevenlabs-prod
deltallm_params:
provider: elevenlabs
model: elevenlabs/scribe_v2
model_info:
mode: audio_transcription
For TTS, request voice overrides model_info.default_params.voice_id. For STT, public language and temperature override matching provider defaults. Add pricing fields such as input_cost_per_character for TTS or input_cost_per_second for STT only when you want DeltaLLM spend estimates for those deployments.
Access Groups and Routing Tags¶
Use model_info.access_groups when you want to grant model access by group instead of binding every model name separately.
model_list:
- model_name: gpt-4o-mini
deltallm_params:
provider: openai
model: openai/gpt-4o-mini
api_key: os.environ/OPENAI_API_KEY
model_info:
mode: chat
access_groups:
- beta
- support
tags:
- low-latency
In this example, the beta or support access group can make gpt-4o-mini visible to a scope.
The scope can be an organization, team, key, or runtime user.
The low-latency tag is separate routing metadata.
Requests can use metadata.tags to prefer matching deployments.
Tags do not grant access.
Important behavior:
- Access groups grant callable targets such as
gpt-4o-mini, not individual deployments. - Access group keys are normalized to lowercase and may contain letters, digits,
.,_, and-. - If multiple deployments share one
model_name, give every deployment the samemodel_info.access_groups; conflicting values disable group expansion for that public model. - Route groups are callable targets too. Keep route-group keys and public model names unique so grants are unambiguous.
- Newly added models become available to scopes already granted a matching access group after the runtime reloads its model and governance snapshots.
- In Kubernetes, admin writes publish governance invalidation events so other replicas refresh their in-memory snapshots asynchronously.
- Organization-level grants can reference an access group before any model currently belongs to it. This is useful when you want a tenant to receive future models as they are added to that group.
Recommended rollout:
- Label models with access groups that describe authorization intent, such as
support,finance, orbeta. - Grant access groups to organizations first; organizations define the parent access universe.
- Use team, key, or user
restrictmode only when you need to narrow access below the organization. - Do not migrate routing tags blindly into access groups. Tags describe routing preferences; access groups describe who can call a target.
Embedding Batch Worker Micro-batching¶
model_info.upstream_max_batch_inputs only applies to compatible embedding items
processed by the async batch worker. It does not change synchronous
/v1/embeddings behavior or make realtime embedding requests batch together.
model_list:
- model_name: text-embedding-3-large
deltallm_params:
provider: openai
model: openai/text-embedding-3-large
api_key: os.environ/OPENAI_API_KEY
model_info:
mode: embedding
output_vector_size: 3072
upstream_max_batch_inputs: 8
Rollout guidance:
- leave the field unset or set it to
1to disable batch-worker micro-batching - start with small values such as
4or8 - validate provider behavior, error rates, and throughput before increasing further
Operational note:
- when DeltaLLM groups multiple embedding items into one upstream request, the provider usually returns usage at the grouped-call level
- DeltaLLM allocates per-item usage and cost from that aggregate usage so total usage and total cost stay consistent
- per-item usage is therefore allocated from aggregate upstream usage, not exact provider-native attribution for each grouped item
Chat Batch Worker Execution¶
Chat batch jobs default to concurrent execution when deltallm_params.chat_batching
is omitted. That means the worker sends one ordinary upstream chat request per
batch item, bounded by worker concurrency. This is the recommended default for
vLLM because vLLM performs continuous batching inside the serving engine.
model_list:
- model_name: llama-3.1-8b
deltallm_params:
provider: vllm
model: meta-llama/Llama-3.1-8B-Instruct
api_base: https://vllm.example/v1
api_key: os.environ/VLLM_API_KEY
chat_batching:
mode: concurrent
max_in_flight: 32
Supported modes:
disabled: execute each chat item as an ordinary upstream request; no microbatch groupingconcurrent: execute per-item upstream requests with worker and deployment concurrency limitssync_microbatch: group compatible items into one upstream provider call when a microbatch executor is available
native_async_batch is reserved for a future provider-managed async batch API and
is not accepted by config validation.
For providers with a proven sync chat microbatch API, opt in explicitly:
model_list:
- model_name: provider-chat
deltallm_params:
provider: example_provider
model: example-chat-model
api_base: https://provider.example/v1
api_key: os.environ/PROVIDER_API_KEY
chat_batching:
mode: sync_microbatch
upstream_max_batch_size: 8
max_total_input_tokens: 32000
require_homogeneous_params: true
Sync chat microbatching is conservative:
- grouping happens after routing, so only items resolved to the same deployment can be batched
- non-message request parameters must match exactly;
require_homogeneous_paramsmust remaintruewhen provided - streaming, MCP tools, function tools, complex response formats, and multiple choices fall back to per-item execution
- Whole microbatch calls use the normal failover path.
Each served deployment must have
mode: sync_microbatchand a synchronous microbatch executor. It must support the chunk size and token cap. - A served deployment can fail to meet these requirements. Without an earlier retryable microbatch failure that affects health, the worker uses bounded per-item execution for that chunk. It does not mark the unsupported deployment unhealthy.
- A primary microbatch failure can be retryable and affect health. If failover then gets to an unsupported deployment, the worker keeps the primary failure and queues the chunk again. It does not hide that failure with per-item fallback.
- successful provider results must include per-item usage; aggregate-only usage is rejected for chat billing
- For mixed provider results, the worker stores successful items.
It fails or retries only the failed items.
Structured per-item
429,408, and5xxprovider errors permit retry under the normal batch retry policy.
max_in_flight is enforced per worker replica. When running multiple Kubernetes
replicas, multiply the configured value by the worker replica count when sizing
provider limits and vLLM capacity.
Add Pricing and Defaults¶
Pricing metadata powers spend tracking.
model_list:
- model_name: gpt-4o-mini
deltallm_params:
provider: openai
model: openai/gpt-4o-mini
api_key: os.environ/OPENAI_API_KEY
model_info:
input_cost_per_token: 0.00000015
output_cost_per_token: 0.0000006
Default parameters let you inject request defaults for a deployment.
model_list:
- model_name: gpt-4o-mini
deltallm_params:
provider: openai
model: openai/gpt-4o-mini
api_key: os.environ/OPENAI_API_KEY
model_info:
default_params:
temperature: 0.7
max_tokens: 1024
User-supplied request values still take priority over these defaults.
Provider Prefix Fallback¶
For new deployments, set deltallm_params.provider. Provider prefixes in deltallm_params.model remain supported for legacy config/import fallback, but they are not the source of truth when provider is present. The admin UI/API requires an explicit provider for created or updated deployments.
| Provider | Prefix | Example |
|---|---|---|
| OpenAI | openai/ |
openai/gpt-4o |
| Anthropic | anthropic/ |
anthropic/claude-3-5-sonnet-latest |
| Azure OpenAI | azure/ or azure_openai/ |
azure/gpt-4o-deployment |
| OpenRouter | openrouter/ |
openrouter/openai/gpt-4o-mini |
| Groq | groq/ |
groq/llama-3.1-8b-instant |
| Together AI | together/ |
together/meta-llama/Llama-3.1-8B-Instruct-Turbo |
| Fireworks AI | fireworks/ |
fireworks/accounts/fireworks/models/llama-v3p1-8b-instruct |
| DeepInfra | deepinfra/ |
deepinfra/meta-llama/Meta-Llama-3.1-8B-Instruct |
| Perplexity | perplexity/ |
perplexity/sonar |
| Gemini | gemini/ |
gemini/gemini-2.0-flash |
| AWS Bedrock | bedrock/ |
bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0 |
| ElevenLabs | elevenlabs/ |
elevenlabs/eleven_multilingual_v2 |
| vLLM | vllm/ |
vllm/meta-llama/Llama-3.1-8B-Instruct |
| LM Studio | lmstudio/ |
lmstudio/qwen2.5-7b-instruct |
| Ollama | ollama/ |
ollama/llama3.1 |
Capability Matrix¶
| Provider | Chat | Embedding | Image | TTS | STT | Rerank |
|---|---|---|---|---|---|---|
| OpenAI | Y | Y | Y | Y | Y | N |
| Anthropic | Y | N | N | N | N | N |
| Azure OpenAI | Y | Y | Y | Y | Y | N |
| OpenRouter | Y | Y | Y | N | N | N |
| Groq | Y | Y | N | Y | Y | N |
| Together AI | Y | Y | Y | N | N | N |
| Fireworks AI | Y | Y | Y | N | N | N |
| DeepInfra | Y | Y | Y | N | N | N |
| Perplexity | Y | N | N | N | N | N |
| Gemini | Y | N | N | N | N | N |
| AWS Bedrock | Y | N | N | N | N | N |
| ElevenLabs | N | N | N | Y | Y | N |
| vLLM | Y | Y | Y | Y | Y | Y |
| LM Studio | Y | Y | N | N | N | N |
| Ollama | Y | Y | N | N | N | N |
Note
vLLM rerank deployments use the OpenAI-compatible /rerank endpoint. Providers not marked as rerank-capable are excluded before routing attempts.