Skip to content

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.

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)
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

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.

[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.