Providers
Every model provider the LLM Service Daemon (LSD) speaks to natively is configured under [models."<name>".providers.<provider_key>], with a type field selecting the provider and the rest of the fields specific to it. Unless noted otherwise, credentials default to an environment variable named <PROVIDER>_API_KEY (e.g. OPENAI_API_KEY) and can be overridden per provider with api_key_location using the syntax below.
Credential location syntax
Section titled “Credential location syntax”api_key_location (and similar *_location fields) accept:
| Syntax | Meaning |
|---|---|
env::VAR_NAME |
Read from environment variable VAR_NAME |
path_from_env::VAR_NAME |
VAR_NAME holds a path to a credential file |
path::/abs/path |
Read directly from a file path |
dynamic::name |
Resolved dynamically (e.g. supplied per-request) |
sdk |
Defer to the provider’s own SDK credential chain (AWS, GCP) |
Providers
Section titled “Providers”type |
Key fields | Notes |
|---|---|---|
openai |
model_name, api_base, api_key_location, api_type (chat_completions or responses), include_encrypted_reasoning, provider_tools |
api_type = "responses" switches to OpenAI’s Responses API; provider_tools and include_encrypted_reasoning only apply there |
anthropic |
model_name, api_base, api_key_location, beta_structured_outputs, provider_tools |
|
azure |
deployment_id, endpoint, api_key_location |
Defaults to AZURE_API_KEY; legacy AZURE_OPENAI_API_KEY still works with a deprecation warning |
aws_bedrock |
model_id, region, endpoint_url, api_key (bearer token, alternative to IAM), access_key_id, secret_access_key, session_token |
Set region = "sdk" to auto-detect via the AWS SDK chain instead of IAM keys |
aws_sagemaker |
endpoint_name, model_name, region, hosted_provider (openai or tgi), plus the same AWS credential fields as aws_bedrock |
Targets a self-hosted model behind a SageMaker endpoint |
gcp_vertex_anthropic |
model_id, location, project_id, credential_location, provider_tools |
|
gcp_vertex_gemini |
model_id or endpoint_id, location, project_id, credential_location |
|
google_ai_studio_gemini |
model_name, api_key_location |
|
groq |
model_name, api_key_location, reasoning_format |
|
mistral |
model_name, api_key_location, prompt_mode |
|
fireworks |
model_name, api_key_location, parse_think_blocks |
|
together |
model_name, api_key_location, parse_think_blocks |
|
deepseek |
model_name, api_key_location |
|
xai |
model_name, api_key_location |
|
openrouter |
model_name, api_key_location |
|
hyperbolic |
model_name, api_key_location |
|
vllm |
model_name, api_base (required), api_key_location |
Self-hosted, OpenAI-compatible |
sglang |
model_name, api_base (required), api_key_location |
Self-hosted, OpenAI-compatible |
tgi |
api_base (required), api_key_location |
Self-hosted; no model_name, the endpoint serves one model |
Example: a mixed roster
Section titled “Example: a mixed roster”Nothing ties you to one provider. A typical lsd.toml mixes frontier and open-weight models across several providers:
[models."claude-sonnet-5"]routing = ["anthropic"]
[models."claude-sonnet-5".providers.anthropic]type = "anthropic"model_name = "claude-sonnet-5"
[models."grok-4p3"]routing = ["xai"]
[models."grok-4p3".providers.xai]type = "xai"model_name = "grok-4.3"
[models."kimi-k2p6"]routing = ["together"]
[models."kimi-k2p6".providers.together]type = "together"model_name = "moonshotai/Kimi-K2.6"
[models."glm-5p2"]routing = ["together"]
[models."glm-5p2".providers.together]type = "together"model_name = "zai-org/GLM-5.2"
[models."minimax-m3"]routing = ["openrouter"]
[models."minimax-m3".providers.openrouter]type = "openrouter"model_name = "minimax/minimax-m3"together and openrouter are the usual routes to open-weight models (Kimi, GLM, MiniMax, and similar) that don’t have a dedicated provider type; check each aggregator’s model catalog for the exact model_name slug.
Example: cost tracking
Section titled “Example: cost tracking”[models."gpt-5p4-mini"]routing = ["openai"]
[models."gpt-5p4-mini".providers.openai]type = "openai"model_name = "gpt-5.4-mini"cost = [ { pointer = "/usage/prompt_tokens", cost_per_million = 0.15, required = true }, { pointer = "/usage/completion_tokens", cost_per_million = 0.60, required = true },]See Operations for how recorded costs are used for usage tracking.