// Generated by tools/gen_tables.py from lm15-contract tables/providers.json — do not edit.
// Contract tables sha256 a30111598a9b8373e27757b7ef801424c4860c22e47239af98cd861cbb6209ec. Regenerate: python3 tools/gen_tables.py
// The receipts behind each value are cited at the reference's own table
// (lm15-python lm15/registry.py, access.py, compat.py, router.py).
use crate::auth::{
AccessPolicy, AnthropicVersionIn, AuthScheme, CredentialPolicy, EndpointSupport, HostSetting,
HostSpec, ModelPlacement, StreamFraming,
};
use crate::compat::*;
use crate::registry::{DialectId, EntryKind, ProviderDefinition};
use crate::router::RouteRule;
use crate::types::ReasoningEffort;
/// `openai`.
pub const OPENAI: AccessPolicy = AccessPolicy {
provider: "openai",
supports: EndpointSupport {
complete: true,
stream: true,
live: true,
files: true,
batches: true,
images: true,
speech: true,
video: true,
responses_api: true,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &["azure-openai"],
env_keys: &["OPENAI_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `openai-chat`.
pub const OPENAI_CHAT: AccessPolicy = AccessPolicy {
provider: "openai-chat",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["OPENAI_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `anthropic`.
pub const ANTHROPIC: AccessPolicy = AccessPolicy {
provider: "anthropic",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: true,
batches: true,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["x-api-key"],
enterprise_variants: &[],
env_keys: &["ANTHROPIC_API_KEY"],
auth_scheme: &[AuthScheme::XApiKey],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `gemini`.
pub const GEMINI: AccessPolicy = AccessPolicy {
provider: "gemini",
supports: EndpointSupport {
complete: true,
stream: true,
live: true,
files: true,
batches: true,
images: true,
speech: true,
video: true,
responses_api: false,
models: true,
caches: true,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["query-api-key", "x-goog-api-key"],
enterprise_variants: &[],
env_keys: &["GEMINI_API_KEY", "GOOGLE_API_KEY"],
auth_scheme: &[AuthScheme::XApiKey],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `xai`.
pub const XAI: AccessPolicy = AccessPolicy {
provider: "xai",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: true,
speech: false,
video: true,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::OAuthUnlessExplicit,
auth_modes: &["bearer", "xai-oauth"],
enterprise_variants: &[],
env_keys: &["XAI_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: Some(
"Log in again: run lm15.auth.login_xai() (SuperGrok / X Premium subscription auth)",
),
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.x.ai/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `typesafe`.
pub const TYPESAFE: AccessPolicy = AccessPolicy {
provider: "typesafe",
supports: EndpointSupport {
complete: true,
stream: false,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["TYPESAFE_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `claude-code`.
pub const CLAUDE_CODE: AccessPolicy = AccessPolicy {
provider: "claude-code",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::OAuth,
auth_modes: &["claude-code-oauth", "bearer-oauth"],
enterprise_variants: &[],
env_keys: &[],
auth_scheme: &[AuthScheme::Bearer],
headers: &[
("anthropic-dangerous-direct-browser-access", "true"),
("anthropic-beta", "claude-code-20250219,oauth-2025-04-20"),
("x-app", "cli"),
("user-agent", "claude-cli/2.1.285"),
],
host: None,
login_hint: Some("Log in again: run `claude` and use /login (Claude subscription auth)"),
backend: "claude-code",
backend_options: &[("client_version", "2.1.285")],
system_prefix: Some("You are Claude Code, Anthropic's official CLI for Claude."),
base_url: None,
placeholder_key: None,
backend_settings: &[HostSetting {
name: "client_version",
env: &["LM15_CLAUDE_CODE_VERSION"],
default: None,
}],
};
/// `openai-codex`.
pub const OPENAI_CODEX: AccessPolicy = AccessPolicy {
provider: "openai-codex",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::OAuth,
auth_modes: &["chatgpt-oauth", "bearer-oauth"],
enterprise_variants: &[],
env_keys: &[],
auth_scheme: &[AuthScheme::Bearer],
headers: &[
("OpenAI-Beta", "responses=experimental"),
("originator", "lm15"),
],
host: None,
login_hint: Some("Log in again: run `codex login` (ChatGPT subscription auth)"),
backend: "chatgpt-codex",
backend_options: &[("client_version", "0.147.0")],
system_prefix: Some("You are a helpful assistant."),
base_url: Some("https://chatgpt.com/backend-api/codex"),
placeholder_key: None,
backend_settings: &[HostSetting {
name: "client_version",
env: &["LM15_CODEX_CLIENT_VERSION"],
default: None,
}],
};
/// `groq`.
pub const GROQ: AccessPolicy = AccessPolicy {
provider: "groq",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["GROQ_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.groq.com/openai/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `openrouter`.
pub const OPENROUTER: AccessPolicy = AccessPolicy {
provider: "openrouter",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["OPENROUTER_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://openrouter.ai/api/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `deepseek`.
pub const DEEPSEEK: AccessPolicy = AccessPolicy {
provider: "deepseek",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["DEEPSEEK_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.deepseek.com"),
placeholder_key: None,
backend_settings: &[],
};
/// `deepseek-anthropic`.
pub const DEEPSEEK_ANTHROPIC: AccessPolicy = AccessPolicy {
provider: "deepseek-anthropic",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: false,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["x-api-key"],
enterprise_variants: &[],
env_keys: &["DEEPSEEK_API_KEY"],
auth_scheme: &[AuthScheme::XApiKey],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.deepseek.com/anthropic/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `zai`.
pub const ZAI: AccessPolicy = AccessPolicy {
provider: "zai",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["ZAI_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.z.ai/api/paas/v4"),
placeholder_key: None,
backend_settings: &[],
};
/// `moonshotai`.
pub const MOONSHOTAI: AccessPolicy = AccessPolicy {
provider: "moonshotai",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["MOONSHOTAI_API_KEY", "MOONSHOT_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.moonshot.ai/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `moonshotai-responses`.
pub const MOONSHOTAI_RESPONSES: AccessPolicy = AccessPolicy {
provider: "moonshotai-responses",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: true,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["MOONSHOTAI_API_KEY", "MOONSHOT_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.moonshot.ai/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `moonshotai-anthropic`.
pub const MOONSHOTAI_ANTHROPIC: AccessPolicy = AccessPolicy {
provider: "moonshotai-anthropic",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: false,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["MOONSHOTAI_API_KEY", "MOONSHOT_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.moonshot.ai/anthropic/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `deepinfra`.
pub const DEEPINFRA: AccessPolicy = AccessPolicy {
provider: "deepinfra",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["DEEPINFRA_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.deepinfra.com/v1/openai"),
placeholder_key: None,
backend_settings: &[],
};
/// `together`.
pub const TOGETHER: AccessPolicy = AccessPolicy {
provider: "together",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["TOGETHER_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.together.ai/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `fireworks`.
pub const FIREWORKS: AccessPolicy = AccessPolicy {
provider: "fireworks",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["FIREWORKS_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.fireworks.ai/inference/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `parasail`.
pub const PARASAIL: AccessPolicy = AccessPolicy {
provider: "parasail",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["PARASAIL_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.parasail.io/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `meta`.
pub const META: AccessPolicy = AccessPolicy {
provider: "meta",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: true,
batches: false,
images: true,
speech: false,
video: false,
responses_api: true,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["META_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.meta.ai/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `meta-chat`.
pub const META_CHAT: AccessPolicy = AccessPolicy {
provider: "meta-chat",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["META_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.meta.ai/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `meta-anthropic`.
pub const META_ANTHROPIC: AccessPolicy = AccessPolicy {
provider: "meta-anthropic",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &["META_API_KEY"],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.meta.ai/v1"),
placeholder_key: None,
backend_settings: &[],
};
/// `azure`.
pub const AZURE: AccessPolicy = AccessPolicy {
provider: "azure",
supports: EndpointSupport {
complete: true,
stream: true,
live: true,
files: true,
batches: true,
images: false,
speech: true,
video: false,
responses_api: true,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::AzureChain,
auth_modes: &["api-key", "entra-oauth"],
enterprise_variants: &[],
env_keys: &["AZURE_OPENAI_API_KEY"],
auth_scheme: &[AuthScheme::ApiKey, AuthScheme::Bearer],
headers: &[],
host: Some(HostSpec {
base_url: "https://{resource}.openai.azure.com/openai/v1",
endpoint_env: &["AZURE_OPENAI_ENDPOINT"],
settings: &[
HostSetting {
name: "resource",
env: &["AZURE_OPENAI_RESOURCE"],
default: None,
},
HostSetting {
name: "authority_host",
env: &["AZURE_AUTHORITY_HOST"],
default: Some("https://login.microsoftonline.com"),
},
HostSetting {
name: "scope",
env: &[],
default: Some("https://ai.azure.com/.default"),
},
],
paths: &[],
model_in: ModelPlacement::Body,
anthropic_version_in: AnthropicVersionIn::Header,
stream_framing: StreamFraming::Sse,
required_headers: &[],
sigv4_service: None,
}),
login_hint: None,
backend: "azure-openai",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `azure-chat`.
pub const AZURE_CHAT: AccessPolicy = AccessPolicy {
provider: "azure-chat",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::AzureChain,
auth_modes: &["api-key", "entra-oauth"],
enterprise_variants: &[],
env_keys: &["AZURE_OPENAI_API_KEY"],
auth_scheme: &[AuthScheme::ApiKey, AuthScheme::Bearer],
headers: &[],
host: Some(HostSpec {
base_url: "https://{resource}.openai.azure.com/openai/v1",
endpoint_env: &["AZURE_OPENAI_ENDPOINT"],
settings: &[
HostSetting {
name: "resource",
env: &["AZURE_OPENAI_RESOURCE"],
default: None,
},
HostSetting {
name: "authority_host",
env: &["AZURE_AUTHORITY_HOST"],
default: Some("https://login.microsoftonline.com"),
},
HostSetting {
name: "scope",
env: &[],
default: Some("https://ai.azure.com/.default"),
},
],
paths: &[],
model_in: ModelPlacement::Body,
anthropic_version_in: AnthropicVersionIn::Header,
stream_framing: StreamFraming::Sse,
required_headers: &[],
sigv4_service: None,
}),
login_hint: None,
backend: "azure-openai",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `azure-anthropic`.
pub const AZURE_ANTHROPIC: AccessPolicy = AccessPolicy {
provider: "azure-anthropic",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: false,
caches: false,
},
credential_policy: CredentialPolicy::AzureChain,
auth_modes: &["x-api-key", "entra-oauth"],
enterprise_variants: &[],
env_keys: &["ANTHROPIC_FOUNDRY_API_KEY"],
auth_scheme: &[AuthScheme::XApiKey, AuthScheme::Bearer],
headers: &[],
host: Some(HostSpec {
base_url: "https://{resource}.services.ai.azure.com/anthropic/v1",
endpoint_env: &["ANTHROPIC_FOUNDRY_BASE_URL"],
settings: &[
HostSetting {
name: "resource",
env: &["ANTHROPIC_FOUNDRY_RESOURCE"],
default: None,
},
HostSetting {
name: "authority_host",
env: &["AZURE_AUTHORITY_HOST"],
default: Some("https://login.microsoftonline.com"),
},
HostSetting {
name: "scope",
env: &[],
default: Some("https://ai.azure.com/.default"),
},
],
paths: &[],
model_in: ModelPlacement::Body,
anthropic_version_in: AnthropicVersionIn::Header,
stream_framing: StreamFraming::Sse,
required_headers: &[],
sigv4_service: None,
}),
login_hint: None,
backend: "azure-foundry",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `aws-anthropic`.
pub const AWS_ANTHROPIC: AccessPolicy = AccessPolicy {
provider: "aws-anthropic",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: false,
caches: false,
},
credential_policy: CredentialPolicy::AwsChain,
auth_modes: &["sigv4", "x-api-key"],
enterprise_variants: &[],
env_keys: &["ANTHROPIC_AWS_API_KEY"],
auth_scheme: &[AuthScheme::SigV4, AuthScheme::XApiKey],
headers: &[],
host: Some(HostSpec {
base_url: "https://aws-external-anthropic.{region}.api.aws/v1",
endpoint_env: &[
"AWS_ENDPOINT_URL_AWS_EXTERNAL_ANTHROPIC",
"AWS_ENDPOINT_URL",
],
settings: &[
HostSetting {
name: "region",
env: &["AWS_REGION", "AWS_DEFAULT_REGION"],
default: None,
},
HostSetting {
name: "workspace",
env: &["ANTHROPIC_AWS_WORKSPACE_ID"],
default: None,
},
],
paths: &[],
model_in: ModelPlacement::Body,
anthropic_version_in: AnthropicVersionIn::Header,
stream_framing: StreamFraming::Sse,
required_headers: &[("anthropic-workspace-id", "workspace")],
sigv4_service: Some("aws-external-anthropic"),
}),
login_hint: None,
backend: "aws-external-anthropic",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `bedrock-anthropic`.
pub const BEDROCK_ANTHROPIC: AccessPolicy = AccessPolicy {
provider: "bedrock-anthropic",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: false,
caches: false,
},
credential_policy: CredentialPolicy::AwsChain,
auth_modes: &["sigv4", "x-api-key"],
enterprise_variants: &[],
env_keys: &["AWS_BEARER_TOKEN_BEDROCK"],
auth_scheme: &[AuthScheme::SigV4, AuthScheme::XApiKey],
headers: &[],
host: Some(HostSpec {
base_url: "https://bedrock-mantle.{region}.api.aws/anthropic/v1",
endpoint_env: &["AWS_ENDPOINT_URL_BEDROCK_MANTLE", "AWS_ENDPOINT_URL"],
settings: &[HostSetting {
name: "region",
env: &["AWS_REGION", "AWS_DEFAULT_REGION"],
default: None,
}],
paths: &[],
model_in: ModelPlacement::Body,
anthropic_version_in: AnthropicVersionIn::Header,
stream_framing: StreamFraming::Sse,
required_headers: &[],
sigv4_service: Some("bedrock-mantle"),
}),
login_hint: None,
backend: "bedrock-mantle",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `bedrock-chat`.
pub const BEDROCK_CHAT: AccessPolicy = AccessPolicy {
provider: "bedrock-chat",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: false,
caches: false,
},
credential_policy: CredentialPolicy::AwsChain,
auth_modes: &["sigv4", "bearer"],
enterprise_variants: &[],
env_keys: &["AWS_BEARER_TOKEN_BEDROCK"],
auth_scheme: &[AuthScheme::SigV4, AuthScheme::Bearer],
headers: &[],
host: Some(HostSpec {
base_url: "https://bedrock-runtime.{region}.amazonaws.com/openai/v1",
endpoint_env: &["AWS_ENDPOINT_URL_BEDROCK_RUNTIME", "AWS_ENDPOINT_URL"],
settings: &[HostSetting {
name: "region",
env: &["AWS_REGION", "AWS_DEFAULT_REGION"],
default: None,
}],
paths: &[],
model_in: ModelPlacement::Body,
anthropic_version_in: AnthropicVersionIn::Header,
stream_framing: StreamFraming::Sse,
required_headers: &[],
sigv4_service: Some("bedrock"),
}),
login_hint: None,
backend: "bedrock-runtime",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `bedrock-mantle-chat`.
pub const BEDROCK_MANTLE_CHAT: AccessPolicy = AccessPolicy {
provider: "bedrock-mantle-chat",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::AwsChain,
auth_modes: &["sigv4", "bearer"],
enterprise_variants: &[],
env_keys: &["AWS_BEARER_TOKEN_BEDROCK"],
auth_scheme: &[AuthScheme::SigV4, AuthScheme::Bearer],
headers: &[],
host: Some(HostSpec {
base_url: "https://bedrock-mantle.{region}.api.aws/v1",
endpoint_env: &["AWS_ENDPOINT_URL_BEDROCK_MANTLE", "AWS_ENDPOINT_URL"],
settings: &[HostSetting {
name: "region",
env: &["AWS_REGION", "AWS_DEFAULT_REGION"],
default: None,
}],
paths: &[],
model_in: ModelPlacement::Body,
anthropic_version_in: AnthropicVersionIn::Header,
stream_framing: StreamFraming::Sse,
required_headers: &[],
sigv4_service: Some("bedrock-mantle"),
}),
login_hint: None,
backend: "bedrock-mantle",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `vertex`.
pub const VERTEX: AccessPolicy = AccessPolicy {
provider: "vertex",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: false,
caches: false,
},
credential_policy: CredentialPolicy::GcpChain,
auth_modes: &["x-goog-api-key", "google-oauth"],
enterprise_variants: &[],
env_keys: &[],
auth_scheme: &[AuthScheme::XApiKey, AuthScheme::Bearer],
headers: &[],
host: Some(HostSpec {
base_url:
"https://{location_host}/v1/projects/{project}/locations/{location}/publishers/google",
endpoint_env: &[],
settings: &[
HostSetting {
name: "project",
env: &["GOOGLE_CLOUD_PROJECT", "GCLOUD_PROJECT"],
default: None,
},
HostSetting {
name: "location",
env: &["GOOGLE_CLOUD_LOCATION"],
default: Some("global"),
},
],
paths: &[],
model_in: ModelPlacement::Body,
anthropic_version_in: AnthropicVersionIn::Header,
stream_framing: StreamFraming::Sse,
required_headers: &[],
sigv4_service: None,
}),
login_hint: None,
backend: "vertex",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `vertex-express`.
pub const VERTEX_EXPRESS: AccessPolicy = AccessPolicy {
provider: "vertex-express",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: false,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["query-api-key"],
enterprise_variants: &[],
env_keys: &["GOOGLE_API_KEY"],
auth_scheme: &[AuthScheme::QueryKey],
headers: &[],
host: Some(HostSpec {
base_url: "https://aiplatform.googleapis.com/v1/publishers/google",
endpoint_env: &[],
settings: &[],
paths: &[],
model_in: ModelPlacement::Body,
anthropic_version_in: AnthropicVersionIn::Header,
stream_framing: StreamFraming::Sse,
required_headers: &[],
sigv4_service: None,
}),
login_hint: None,
backend: "vertex-express",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `vertex-anthropic`.
pub const VERTEX_ANTHROPIC: AccessPolicy = AccessPolicy {
provider: "vertex-anthropic",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: false,
caches: false,
},
credential_policy: CredentialPolicy::GcpChain,
auth_modes: &["google-oauth"],
enterprise_variants: &[],
env_keys: &[],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: Some(HostSpec {
base_url: "https://{location_host}/v1/projects/{project}/locations/{location}",
endpoint_env: &[],
settings: &[
HostSetting {
name: "project",
env: &["GOOGLE_CLOUD_PROJECT", "GCLOUD_PROJECT"],
default: None,
},
HostSetting {
name: "location",
env: &["GOOGLE_CLOUD_LOCATION"],
default: Some("global"),
},
],
paths: &[
(
"messages",
"/publishers/anthropic/models/{model}:rawPredict",
),
(
"messages/stream",
"/publishers/anthropic/models/{model}:streamRawPredict",
),
],
model_in: ModelPlacement::Path,
anthropic_version_in: AnthropicVersionIn::Body("vertex-2023-10-16"),
stream_framing: StreamFraming::Sse,
required_headers: &[],
sigv4_service: None,
}),
login_hint: None,
backend: "vertex",
backend_options: &[],
system_prefix: None,
base_url: None,
placeholder_key: None,
backend_settings: &[],
};
/// `ollama`.
pub const OLLAMA: AccessPolicy = AccessPolicy {
provider: "ollama",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &[],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("http://localhost:11434/v1"),
placeholder_key: Some("ollama"),
backend_settings: &[],
};
/// `vllm`.
pub const VLLM: AccessPolicy = AccessPolicy {
provider: "vllm",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &[],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("http://localhost:8000/v1"),
placeholder_key: Some("EMPTY"),
backend_settings: &[],
};
/// `sglang`.
pub const SGLANG: AccessPolicy = AccessPolicy {
provider: "sglang",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &[],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("http://localhost:30000/v1"),
placeholder_key: Some("EMPTY"),
backend_settings: &[],
};
/// `kimi-code` (managed-login declared provider; not in ACCESS_POLICIES).
pub const KIMI_CODE: AccessPolicy = AccessPolicy {
provider: "kimi-code",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: false,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &[],
auth_scheme: &[AuthScheme::Bearer],
headers: &[],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.kimi.com/coding"),
placeholder_key: None,
backend_settings: &[],
};
/// `github-copilot` (managed-login declared provider; not in ACCESS_POLICIES).
pub const GITHUB_COPILOT: AccessPolicy = AccessPolicy {
provider: "github-copilot",
supports: EndpointSupport {
complete: true,
stream: true,
live: false,
files: false,
batches: false,
images: false,
speech: false,
video: false,
responses_api: false,
models: true,
caches: false,
},
credential_policy: CredentialPolicy::Key,
auth_modes: &["bearer"],
enterprise_variants: &[],
env_keys: &[],
auth_scheme: &[AuthScheme::Bearer],
headers: &[
("User-Agent", "GitHubCopilotChat/0.35.0"),
("Editor-Version", "vscode/1.107.0"),
("Editor-Plugin-Version", "copilot-chat/0.35.0"),
("Copilot-Integration-Id", "vscode-chat"),
],
host: None,
login_hint: None,
backend: "api",
backend_options: &[],
system_prefix: None,
base_url: Some("https://api.individual.githubcopilot.com"),
placeholder_key: None,
backend_settings: &[],
};
/// Every registry provider's access policy, in registry order.
pub const ACCESS_POLICIES: &[AccessPolicy] = &[
OPENAI,
OPENAI_CHAT,
ANTHROPIC,
GEMINI,
XAI,
TYPESAFE,
CLAUDE_CODE,
OPENAI_CODEX,
GROQ,
OPENROUTER,
DEEPSEEK,
DEEPSEEK_ANTHROPIC,
ZAI,
MOONSHOTAI,
MOONSHOTAI_RESPONSES,
MOONSHOTAI_ANTHROPIC,
DEEPINFRA,
TOGETHER,
FIREWORKS,
PARASAIL,
META,
META_CHAT,
META_ANTHROPIC,
AZURE,
AZURE_CHAT,
AZURE_ANTHROPIC,
AWS_ANTHROPIC,
BEDROCK_ANTHROPIC,
BEDROCK_CHAT,
BEDROCK_MANTLE_CHAT,
VERTEX,
VERTEX_EXPRESS,
VERTEX_ANTHROPIC,
OLLAMA,
VLLM,
SGLANG,
];
/// Registry rows in declaration (presentation) order.
pub const PROVIDERS: &[ProviderDefinition] = &[ProviderDefinition { id: "openai", dialect: DialectId::OpenaiResponses, kind: EntryKind::AdapterOwned, compat: None, placeholder_key: None, note: "OpenAI Responses API" }, ProviderDefinition { id: "openai-chat", dialect: DialectId::OpenaiChat, kind: EntryKind::AdapterOwned, compat: None, placeholder_key: None, note: "OpenAI Chat Completions dialect (the de-facto standard other servers speak)" }, ProviderDefinition { id: "anthropic", dialect: DialectId::Anthropic, kind: EntryKind::AdapterOwned, compat: None, placeholder_key: None, note: "Anthropic Messages API" }, ProviderDefinition { id: "gemini", dialect: DialectId::Gemini, kind: EntryKind::AdapterOwned, compat: None, placeholder_key: None, note: "Google Gemini API" }, ProviderDefinition { id: "xai", dialect: DialectId::OpenaiChat, kind: EntryKind::AdapterOwned, compat: None, placeholder_key: None, note: "xAI Grok (Chat Completions dialect; XAI_API_KEY or subscription OAuth)" }, ProviderDefinition { id: "typesafe", dialect: DialectId::Typesafe, kind: EntryKind::AdapterOwned, compat: None, placeholder_key: None, note: "TypeSafe System One (Jev): judgments over declared keys with probabilities; no text generation" }, ProviderDefinition { id: "claude-code", dialect: DialectId::Anthropic, kind: EntryKind::AdapterOwned, compat: None, placeholder_key: None, note: "Claude subscription through the local `claude` CLI login" }, ProviderDefinition { id: "openai-codex", dialect: DialectId::OpenaiResponses, kind: EntryKind::AdapterOwned, compat: None, placeholder_key: None, note: "ChatGPT subscription through the local `codex` CLI login" }, ProviderDefinition { id: "groq", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("groq"), placeholder_key: None, note: "Groq Cloud (Chat Completions dialect)" }, ProviderDefinition { id: "openrouter", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("openrouter"), placeholder_key: None, note: "OpenRouter (Chat Completions dialect)" }, ProviderDefinition { id: "deepseek", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("deepseek"), placeholder_key: None, note: "DeepSeek (Chat Completions dialect; thinking mode on by default)" }, ProviderDefinition { id: "deepseek-anthropic", dialect: DialectId::Anthropic, kind: EntryKind::Bound, compat: Some("deepseek"), placeholder_key: None, note: "DeepSeek over the Anthropic Messages wire (same key as `deepseek`; no model listing)" }, ProviderDefinition { id: "zai", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("zai"), placeholder_key: None, note: "Z.AI GLM (Chat Completions dialect; general endpoint, not the Coding Plan)" }, ProviderDefinition { id: "moonshotai", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("moonshotai"), placeholder_key: None, note: "Moonshot AI Kimi (Chat Completions dialect; kimi-k3 takes reasoning effort low|high|max, kimi-k2.6 takes effort off; Moonshot's docs call the key MOONSHOT_API_KEY — read after MOONSHOTAI_API_KEY)" }, ProviderDefinition { id: "moonshotai-responses", dialect: DialectId::OpenaiResponses, kind: EntryKind::Bound, compat: Some("moonshotai"), placeholder_key: None, note: "Moonshot AI Kimi over the Responses wire (same key as `moonshotai`; kimi-k3 only; stateless — reasoning replays as summary text; web_search built-in)" }, ProviderDefinition { id: "moonshotai-anthropic", dialect: DialectId::Anthropic, kind: EntryKind::Bound, compat: Some("moonshotai"), placeholder_key: None, note: "Moonshot AI Kimi over the Anthropic Messages wire (same key as `moonshotai`, bearer token; kimi-k3 only)" }, ProviderDefinition { id: "deepinfra", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("deepinfra"), placeholder_key: None, note: "DeepInfra open-model inference (Chat Completions dialect; models are vendor/name ids)" }, ProviderDefinition { id: "together", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("together"), placeholder_key: None, note: "Together AI open-model inference (Chat Completions dialect; gpt-oss refuses a forced tool choice client-side — Together answers it with HTTP 500)" }, ProviderDefinition { id: "fireworks", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("fireworks"), placeholder_key: None, note: "Fireworks AI open-model inference (Chat Completions dialect; models are accounts/fireworks/models/<name> ids)" }, ProviderDefinition { id: "parasail", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("parasail"), placeholder_key: None, note: "Parasail open-model inference (Chat Completions dialect; serverless models)" }, ProviderDefinition { id: "meta", dialect: DialectId::OpenaiResponses, kind: EntryKind::Bound, compat: Some("meta"), placeholder_key: None, note: "Meta Model API — Muse Spark over the Responses wire (reasoning replay, web_search), plus Files, Images (muse-image-1.0) and Models; Meta's docs call the key MODEL_API_KEY — export it as META_API_KEY" }, ProviderDefinition { id: "meta-chat", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("meta"), placeholder_key: None, note: "Meta Model API over the Chat Completions wire (same key as `meta`; no cross-turn reasoning)" }, ProviderDefinition { id: "meta-anthropic", dialect: DialectId::Anthropic, kind: EntryKind::Bound, compat: Some("meta"), placeholder_key: None, note: "Meta Model API over the Anthropic Messages wire (same key as `meta`; bearer token)" }, ProviderDefinition { id: "azure", dialect: DialectId::OpenaiResponses, kind: EntryKind::Hosted, compat: None, placeholder_key: None, note: "Azure OpenAI v1 Responses wire ({resource}.openai.azure.com, or AZURE_OPENAI_ENDPOINT = the Foundry root the console shows; model = deployment name; api-key or Entra token)" }, ProviderDefinition { id: "azure-chat", dialect: DialectId::OpenaiChat, kind: EntryKind::Hosted, compat: Some("openai"), placeholder_key: None, note: "Azure OpenAI v1 Chat Completions wire (same resource or AZURE_OPENAI_ENDPOINT; also Foundry-sold models such as DeepSeek, Kimi and Grok)" }, ProviderDefinition { id: "azure-anthropic", dialect: DialectId::Anthropic, kind: EntryKind::Hosted, compat: None, placeholder_key: None, note: "Claude in Microsoft Foundry ({resource}.services.ai.azure.com/anthropic or ANTHROPIC_FOUNDRY_BASE_URL; x-api-key or Entra token)" }, ProviderDefinition { id: "aws-anthropic", dialect: DialectId::Anthropic, kind: EntryKind::Hosted, compat: None, placeholder_key: None, note: "Claude Platform on AWS (Anthropic-operated; SigV4 or ANTHROPIC_AWS_API_KEY; needs AWS_REGION and ANTHROPIC_AWS_WORKSPACE_ID)" }, ProviderDefinition { id: "bedrock-anthropic", dialect: DialectId::Anthropic, kind: EntryKind::Hosted, compat: None, placeholder_key: None, note: "Claude in Amazon Bedrock (bedrock-mantle, Opus 4.7 and later; SigV4 or AWS_BEARER_TOKEN_BEDROCK; needs AWS_REGION)" }, ProviderDefinition { id: "bedrock-chat", dialect: DialectId::OpenaiChat, kind: EntryKind::Hosted, compat: Some("bedrock"), placeholder_key: None, note: "Amazon Bedrock over the OpenAI Chat Completions wire (bedrock-runtime /openai/v1; SigV4 or AWS_BEARER_TOKEN_BEDROCK)" }, ProviderDefinition { id: "bedrock-mantle-chat", dialect: DialectId::OpenaiChat, kind: EntryKind::Hosted, compat: Some("bedrock-mantle"), placeholder_key: None, note: "Amazon Bedrock Chat Completions on bedrock-mantle (un-versioned ids, GET /v1/models; SigV4 or AWS_BEARER_TOKEN_BEDROCK)" }, ProviderDefinition { id: "vertex", dialect: DialectId::Gemini, kind: EntryKind::Hosted, compat: None, placeholder_key: None, note: "Gemini on Google Cloud (Agent Platform); ADC chain; needs GOOGLE_CLOUD_PROJECT, GOOGLE_CLOUD_LOCATION defaults to global" }, ProviderDefinition { id: "vertex-express", dialect: DialectId::Gemini, kind: EntryKind::Hosted, compat: None, placeholder_key: None, note: "Agent Platform express mode: GOOGLE_API_KEY as ?key=, no project or location" }, ProviderDefinition { id: "vertex-anthropic", dialect: DialectId::Anthropic, kind: EntryKind::Hosted, compat: None, placeholder_key: None, note: "Claude on Google Cloud (rawPredict; model in the path, anthropic_version in the body)" }, ProviderDefinition { id: "ollama", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("ollama"), placeholder_key: Some("ollama"), note: "local ollama server (keyless)" }, ProviderDefinition { id: "vllm", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("vllm"), placeholder_key: Some("EMPTY"), note: "local vLLM server (keyless)" }, ProviderDefinition { id: "sglang", dialect: DialectId::OpenaiChat, kind: EntryKind::Bound, compat: Some("sglang"), placeholder_key: Some("EMPTY"), note: "local SGLang server (keyless)" }];
/// `kimi-code` declared-login compat: Kimi Code subscription over the Anthropic Messages wire (managed login only; no lm15 wire receipt yet)
pub const KIMI_CODE_COMPAT: AnthropicCompat = AnthropicCompat {
..AnthropicCompat::EMPTY
};
/// `github-copilot` declared-login compat: GitHub Copilot over the Chat Completions wire (managed login only; the account's host comes from the token; no lm15 wire receipt yet)
pub const GITHUB_COPILOT_COMPAT: OpenAIChatCompat = OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxCompletionTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
..OpenAIChatCompat::EMPTY
};
pub const OPENAI_CHAT_PRESETS: &[(&str, OpenAIChatCompat)] = &[
(
"openai",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxCompletionTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
cache_control: Some(Knob::Set(OpenAICacheControl::OpenAI)),
..OpenAIChatCompat::EMPTY
},
),
(
"ollama",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
reasoning_efforts: Some(&[
ReasoningEffort::Minimal,
ReasoningEffort::Low,
ReasoningEffort::Medium,
ReasoningEffort::High,
ReasoningEffort::Xhigh,
ReasoningEffort::Max,
]),
..OpenAIChatCompat::EMPTY
},
),
(
"lmstudio",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::None)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
..OpenAIChatCompat::EMPTY
},
),
(
"groq",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
builtin_tools: Some(Knob::Set(OpenAIChatBuiltinTools::Groq)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
..OpenAIChatCompat::EMPTY
},
),
(
"openrouter",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::Openrouter)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
cache_control: Some(Knob::Set(OpenAICacheControl::OpenAI)),
..OpenAIChatCompat::EMPTY
},
),
(
"xai",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::Deepseek)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Images)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
..OpenAIChatCompat::EMPTY
},
),
(
"vllm",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
token_scoring: Some(Knob::Set(OpenAIChatTokenScoring::LogprobTokenIds)),
..OpenAIChatCompat::EMPTY
},
),
(
"sglang",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
..OpenAIChatCompat::EMPTY
},
),
(
"deepseek",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::Deepseek)),
thinking_replay: Some(Knob::Set(OpenAIChatThinkingReplay::Native)),
assistant_reasoning_content: Some(Knob::Set(
OpenAIChatAssistantReasoningContent::IncludeEmpty,
)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
user_field: Some(Knob::Set(OpenAIChatUserField::UserId)),
..OpenAIChatCompat::EMPTY
},
),
(
"qwen",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::Qwen)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
..OpenAIChatCompat::EMPTY
},
),
(
"bedrock",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxCompletionTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
user_field: Some(Knob::Set(OpenAIChatUserField::User)),
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
json_schema: Some(Knob::Set(SendReject::Send)),
model_overrides: &[
(
"openai.gpt-oss",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Reject)),
json_schema: Some(Knob::Set(SendReject::Reject)),
..ChatModelOverride::NONE
},
),
(
"google.gemma",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Reject)),
..ChatModelOverride::NONE
},
),
],
..OpenAIChatCompat::EMPTY
},
),
(
"bedrock_mantle",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxCompletionTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
user_field: Some(Knob::Set(OpenAIChatUserField::User)),
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
json_schema: Some(Knob::Set(SendReject::Send)),
model_overrides: &[(
"openai.gpt-oss",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Reject)),
json_schema: Some(Knob::Set(SendReject::Reject)),
..ChatModelOverride::NONE
},
)],
..OpenAIChatCompat::EMPTY
},
),
(
"zai",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::Deepseek)),
thinking_replay: Some(Knob::Set(OpenAIChatThinkingReplay::Native)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Images)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
user_field: Some(Knob::Set(OpenAIChatUserField::UserId)),
forced_tool_choice: Some(Knob::Set(SendReject::Reject)),
json_schema: Some(Knob::Set(SendReject::Reject)),
..OpenAIChatCompat::EMPTY
},
),
(
"meta",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::Developer)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxCompletionTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
cache_control: Some(Knob::Set(OpenAICacheControl::OpenAIImplicit)),
user_field: Some(Knob::Set(OpenAIChatUserField::SafetyIdentifier)),
..OpenAIChatCompat::EMPTY
},
),
(
"moonshotai",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxCompletionTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::Kimi)),
thinking_replay: Some(Knob::Set(OpenAIChatThinkingReplay::Native)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Images)),
cache_control: Some(Knob::Set(OpenAICacheControl::OpenAIImplicit)),
user_field: Some(Knob::Set(OpenAIChatUserField::SafetyIdentifier)),
reasoning_efforts: Some(&[
ReasoningEffort::Low,
ReasoningEffort::High,
ReasoningEffort::Max,
]),
..OpenAIChatCompat::EMPTY
},
),
(
"deepinfra",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxCompletionTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
thinking_replay: Some(Knob::Set(OpenAIChatThinkingReplay::Native)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
forced_tool_choice: Some(Knob::Set(SendReject::Reject)),
model_overrides: &[
(
"openai/gpt-oss",
ChatModelOverride {
reasoning_off: Some(Knob::Set(OpenAIChatReasoningOff::Lowest)),
..ChatModelOverride::NONE
},
),
(
"deepseek-ai/DeepSeek-V3.2",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"deepseek-ai/DeepSeek-V4-Flash",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"deepseek-ai/DeepSeek-V4.1-Flash",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"zai-org/GLM-5.3-Flash",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"moonshotai/Kimi-K2.6",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"meta-llama/Llama-4-Scout-17B-16E-Instruct",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"Qwen/Qwen3.6-27B",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"Qwen/Qwen3-Next-80B-A3B-Instruct",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"nvidia/NVIDIA-Nemotron-3.5-Lightning",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"ibm-granite/granite-4.2-8b",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"XiaomiMiMo/MiMo-V2.6-Flash",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"tencent/Hy3",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"google/gemini-3.1-flash-lite",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
(
"anthropic/claude-haiku-4-5",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Send)),
..ChatModelOverride::NONE
},
),
],
..OpenAIChatCompat::EMPTY
},
),
(
"together",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxCompletionTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
thinking_replay: Some(Knob::Set(OpenAIChatThinkingReplay::Native)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
model_overrides: &[
(
"openai/gpt-oss",
ChatModelOverride {
forced_tool_choice: Some(Knob::Set(SendReject::Reject)),
reasoning_efforts: Some(&[
ReasoningEffort::Low,
ReasoningEffort::Medium,
ReasoningEffort::High,
]),
reasoning_off: Some(Knob::Set(OpenAIChatReasoningOff::Lowest)),
..ChatModelOverride::NONE
},
),
(
"zai-org/GLM-5.3",
ChatModelOverride {
reasoning_off: Some(Knob::Set(OpenAIChatReasoningOff::Lowest)),
..ChatModelOverride::NONE
},
),
],
..OpenAIChatCompat::EMPTY
},
),
(
"fireworks",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxCompletionTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
thinking_replay: Some(Knob::Set(OpenAIChatThinkingReplay::Native)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Images)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
..OpenAIChatCompat::EMPTY
},
),
(
"parasail",
OpenAIChatCompat {
instruction_role: Some(Knob::Set(OpenAIChatInstructionRole::System)),
max_tokens_field: Some(Knob::Set(OpenAIChatMaxTokensField::MaxCompletionTokens)),
stream_usage: Some(Knob::Set(IncludeOmit::Include)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
thinking_format: Some(Knob::Set(OpenAIChatThinkingFormat::ReasoningEffort)),
thinking_replay: Some(Knob::Set(OpenAIChatThinkingReplay::Native)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Images)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
..OpenAIChatCompat::EMPTY
},
),
];
pub const OPENAI_CHAT_PRESET_BASE_URLS: &[(&str, &str)] = &[
("openai", "https://api.openai.com/v1"),
("ollama", "http://localhost:11434/v1"),
("lmstudio", "http://localhost:1234/v1"),
("groq", "https://api.groq.com/openai/v1"),
("openrouter", "https://openrouter.ai/api/v1"),
("xai", "https://api.x.ai/v1"),
("vllm", "http://localhost:8000/v1"),
("sglang", "http://localhost:30000/v1"),
("deepseek", "https://api.deepseek.com"),
("zai", "https://api.z.ai/api/paas/v4"),
("meta", "https://api.meta.ai/v1"),
("moonshotai", "https://api.moonshot.ai/v1"),
("deepinfra", "https://api.deepinfra.com/v1/openai"),
("together", "https://api.together.ai/v1"),
("fireworks", "https://api.fireworks.ai/inference/v1"),
("parasail", "https://api.parasail.io/v1"),
];
pub const OPENAI_RESPONSES_PRESETS: &[(&str, OpenAIResponsesCompat)] = &[
(
"openai",
OpenAIResponsesCompat {
developer_role: Some(Knob::Set(OpenAIResponsesDeveloperRole::Developer)),
max_output_tokens_field: Some(Knob::Set(
OpenAIResponsesMaxOutputTokensField::MaxOutputTokens,
)),
reasoning_format: Some(Knob::Set(
OpenAIResponsesReasoningFormat::ResponsesReasoning,
)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::OpenAI)),
..OpenAIResponsesCompat::EMPTY
},
),
(
"openrouter",
OpenAIResponsesCompat {
developer_role: Some(Knob::Set(OpenAIResponsesDeveloperRole::Developer)),
max_output_tokens_field: Some(Knob::Set(
OpenAIResponsesMaxOutputTokensField::MaxTokens,
)),
reasoning_format: Some(Knob::Set(OpenAIResponsesReasoningFormat::Openrouter)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::OpenAI)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
..OpenAIResponsesCompat::EMPTY
},
),
(
"ollama",
OpenAIResponsesCompat {
developer_role: Some(Knob::Set(OpenAIResponsesDeveloperRole::System)),
max_output_tokens_field: Some(Knob::Set(
OpenAIResponsesMaxOutputTokensField::MaxTokens,
)),
reasoning_format: Some(Knob::Set(OpenAIResponsesReasoningFormat::None)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
..OpenAIResponsesCompat::EMPTY
},
),
(
"lmstudio",
OpenAIResponsesCompat {
developer_role: Some(Knob::Set(OpenAIResponsesDeveloperRole::System)),
max_output_tokens_field: Some(Knob::Set(
OpenAIResponsesMaxOutputTokensField::MaxTokens,
)),
reasoning_format: Some(Knob::Set(OpenAIResponsesReasoningFormat::None)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
..OpenAIResponsesCompat::EMPTY
},
),
(
"vllm",
OpenAIResponsesCompat {
developer_role: Some(Knob::Set(OpenAIResponsesDeveloperRole::System)),
max_output_tokens_field: Some(Knob::Set(
OpenAIResponsesMaxOutputTokensField::MaxTokens,
)),
reasoning_format: Some(Knob::Set(OpenAIResponsesReasoningFormat::ReasoningEffort)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
..OpenAIResponsesCompat::EMPTY
},
),
(
"sglang",
OpenAIResponsesCompat {
developer_role: Some(Knob::Set(OpenAIResponsesDeveloperRole::System)),
max_output_tokens_field: Some(Knob::Set(
OpenAIResponsesMaxOutputTokensField::MaxTokens,
)),
reasoning_format: Some(Knob::Set(OpenAIResponsesReasoningFormat::ReasoningEffort)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
..OpenAIResponsesCompat::EMPTY
},
),
(
"qwen",
OpenAIResponsesCompat {
developer_role: Some(Knob::Set(OpenAIResponsesDeveloperRole::System)),
max_output_tokens_field: Some(Knob::Set(
OpenAIResponsesMaxOutputTokensField::MaxTokens,
)),
reasoning_format: Some(Knob::Set(OpenAIResponsesReasoningFormat::Qwen)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
..OpenAIResponsesCompat::EMPTY
},
),
(
"deepseek",
OpenAIResponsesCompat {
developer_role: Some(Knob::Set(OpenAIResponsesDeveloperRole::System)),
max_output_tokens_field: Some(Knob::Set(
OpenAIResponsesMaxOutputTokensField::MaxTokens,
)),
reasoning_format: Some(Knob::Set(OpenAIResponsesReasoningFormat::Deepseek)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
..OpenAIResponsesCompat::EMPTY
},
),
(
"zai",
OpenAIResponsesCompat {
developer_role: Some(Knob::Set(OpenAIResponsesDeveloperRole::System)),
max_output_tokens_field: Some(Knob::Set(
OpenAIResponsesMaxOutputTokensField::MaxTokens,
)),
reasoning_format: Some(Knob::Set(OpenAIResponsesReasoningFormat::Zai)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::None)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
..OpenAIResponsesCompat::EMPTY
},
),
(
"meta",
OpenAIResponsesCompat {
developer_role: Some(Knob::Set(OpenAIResponsesDeveloperRole::Developer)),
max_output_tokens_field: Some(Knob::Set(
OpenAIResponsesMaxOutputTokensField::MaxOutputTokens,
)),
reasoning_format: Some(Knob::Set(
OpenAIResponsesReasoningFormat::ResponsesReasoning,
)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::OpenAIImplicit)),
commentary_phase: Some(Knob::Set(OpenAIResponsesCommentaryPhase::Tag)),
edit_image_field: Some(Knob::Set(OpenAIResponsesEditImageField::Indexed)),
builtin_tools: Some(Knob::Set(OpenAIResponsesBuiltinTools::Verbatim)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Native)),
..OpenAIResponsesCompat::EMPTY
},
),
(
"moonshotai",
OpenAIResponsesCompat {
developer_role: Some(Knob::Set(OpenAIResponsesDeveloperRole::Developer)),
max_output_tokens_field: Some(Knob::Set(
OpenAIResponsesMaxOutputTokensField::MaxOutputTokens,
)),
reasoning_format: Some(Knob::Set(
OpenAIResponsesReasoningFormat::ResponsesReasoning,
)),
tool_result_name: Some(Knob::Set(IncludeOmit::Omit)),
strict_tools: Some(Knob::Set(IncludeOmit::Omit)),
cache_control: Some(Knob::Set(OpenAICacheControl::OpenAIImplicit)),
builtin_tools: Some(Knob::Set(OpenAIResponsesBuiltinTools::Verbatim)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Images)),
..OpenAIResponsesCompat::EMPTY
},
),
];
pub const OPENAI_RESPONSES_PRESET_BASE_URLS: &[(&str, &str)] = &[
("openai", "https://api.openai.com/v1"),
("ollama", "http://localhost:11434/v1"),
("lmstudio", "http://localhost:1234/v1"),
("vllm", "http://localhost:8000/v1"),
("sglang", "http://localhost:30000/v1"),
("openrouter", "https://openrouter.ai/api/v1"),
("meta", "https://api.meta.ai/v1"),
("moonshotai", "https://api.moonshot.ai/v1"),
];
pub const ANTHROPIC_PRESETS: &[(&str, AnthropicCompat)] = &[
(
"anthropic",
AnthropicCompat {
..AnthropicCompat::EMPTY
},
),
(
"deepseek",
AnthropicCompat {
thinking_format: Some(Knob::Set(AnthropicThinkingFormat::Deepseek)),
cache_control: Some(Knob::Set(AnthropicCacheControl::None)),
structured_output: Some(Knob::Set(SendReject::Reject)),
parallel_tool_calls: Some(Knob::Set(SendReject::Reject)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Reject)),
model_prefixes: Some(&["deepseek-"]),
..AnthropicCompat::EMPTY
},
),
(
"meta",
AnthropicCompat {
thinking_format: Some(Knob::Set(AnthropicThinkingFormat::Adaptive)),
cache_control: Some(Knob::Set(AnthropicCacheControl::None)),
structured_output: Some(Knob::Set(SendReject::Send)),
parallel_tool_calls: Some(Knob::Set(SendReject::Send)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Native)),
..AnthropicCompat::EMPTY
},
),
(
"moonshotai",
AnthropicCompat {
thinking_format: Some(Knob::Set(AnthropicThinkingFormat::Effort)),
thinking_replay: Some(Knob::Set(AnthropicThinkingReplay::Unsigned)),
cache_control: Some(Knob::Set(AnthropicCacheControl::None)),
structured_output: Some(Knob::Set(SendReject::Send)),
parallel_tool_calls: Some(Knob::Set(SendReject::Reject)),
sampling_params: Some(Knob::Set(SendReject::Reject)),
tool_result_media: Some(Knob::Set(ToolResultMedia::Images)),
reasoning_efforts: Some(&[
ReasoningEffort::Low,
ReasoningEffort::High,
ReasoningEffort::Max,
]),
model_prefixes: Some(&["kimi-"]),
..AnthropicCompat::EMPTY
},
),
];
pub const ANTHROPIC_PRESET_BASE_URLS: &[(&str, &str)] = &[
("anthropic", "https://api.anthropic.com/v1"),
("deepseek", "https://api.deepseek.com/anthropic/v1"),
("meta", "https://api.meta.ai/v1"),
("moonshotai", "https://api.moonshot.ai/anthropic/v1"),
];
/// The deepinfra preset's model overrides that send a forced tool choice, as one list
/// (the crate's public `compat::DEEPINFRA_FORCED_TOOL_CHOICE`).
pub const DEEPINFRA_FORCED_TOOL_CHOICE: &[&str] = &[
"deepseek-ai/DeepSeek-V3.2",
"deepseek-ai/DeepSeek-V4-Flash",
"deepseek-ai/DeepSeek-V4.1-Flash",
"zai-org/GLM-5.3-Flash",
"moonshotai/Kimi-K2.6",
"meta-llama/Llama-4-Scout-17B-16E-Instruct",
"Qwen/Qwen3.6-27B",
"Qwen/Qwen3-Next-80B-A3B-Instruct",
"nvidia/NVIDIA-Nemotron-3.5-Lightning",
"ibm-granite/granite-4.2-8b",
"XiaomiMiMo/MiMo-V2.6-Flash",
"tencent/Hy3",
"google/gemini-3.1-flash-lite",
"anthropic/claude-haiku-4-5",
];
/// Preset spelling aliases, read after lowercasing and mapping `-`, `.` and spaces to `_`.
pub const PRESET_ALIASES: &[(&str, &str)] = &[
("openai_chat", "openai"),
("chat", "openai"),
("chat_completions", "openai"),
("responses", "openai"),
("openai_responses", "openai"),
("lm_studio", "lmstudio"),
("dashscope_qwen", "qwen"),
("z_ai", "zai"),
];
/// The router's built-in prefix rules; first match wins.
pub const DEFAULT_RULES: &[RouteRule] = &[RouteRule { prefix: "claude-", provider: "anthropic", note: "Anthropic Claude family" }, RouteRule { prefix: "gpt-", provider: "openai", note: "OpenAI GPT family (Responses API; use openai-chat: for Chat Completions)" }, RouteRule { prefix: "o1", provider: "openai", note: "OpenAI o1 reasoning family" }, RouteRule { prefix: "o3", provider: "openai", note: "OpenAI o3 reasoning family" }, RouteRule { prefix: "o4", provider: "openai", note: "OpenAI o4 reasoning family" }, RouteRule { prefix: "gemini-", provider: "gemini", note: "Google Gemini family" }, RouteRule { prefix: "gemma-", provider: "gemini", note: "Google Gemma open models, served by the Gemini API (live /models listing 2026-09-01)" }, RouteRule { prefix: "nano-banana", provider: "gemini", note: "Google image models on the Gemini API (live /models listing 2026-09-01)" }, RouteRule { prefix: "grok-", provider: "xai", note: "xAI Grok family (XAI_API_KEY or subscription OAuth)" }, RouteRule { prefix: "sora-", provider: "openai", note: "OpenAI Sora video generation" }, RouteRule { prefix: "veo-", provider: "gemini", note: "Google Veo video generation" }, RouteRule { prefix: "chat-latest", provider: "openai", note: "OpenAI rolling chat alias (live /models listing 2026-09-01)" }, RouteRule { prefix: "jev-", provider: "typesafe", note: "TypeSafe Jev (live /v1/models listing 2026-09-17: jev-latest, jev-preview; versioned ids jev-1.13.0 accepted)" }];
/// litellm's `provider/` spellings for the OpenAI-SDK/litellm door.
pub const LITELLM_PROVIDER_PREFIXES: &[(&str, &str)] = &[
("openai", "openai-chat"),
("anthropic", "anthropic"),
("gemini", "gemini"),
("groq", "groq"),
("openrouter", "openrouter"),
("deepseek", "deepseek"),
("xai", "xai"),
("ollama", "ollama"),
("ollama_chat", "ollama"),
("hosted_vllm", "vllm"),
("moonshot", "moonshotai"),
("azure", "azure-chat"),
("deepinfra", "deepinfra"),
("together_ai", "together"),
("fireworks_ai", "fireworks"),
("parasail", "parasail"),
];
/// AUTH-12 service labels.
pub const SERVICE_LABELS: &[(&str, &str)] = &[
("anthropic", "Anthropic"),
("claude-code", "Anthropic"),
("openai", "OpenAI"),
("openai-chat", "OpenAI"),
("openai-codex", "OpenAI"),
("gemini", "Google"),
("vertex", "Google Cloud"),
("vertex-anthropic", "Google Cloud"),
("vertex-express", "Google Cloud"),
("azure", "Microsoft Azure"),
("azure-chat", "Microsoft Azure"),
("azure-anthropic", "Microsoft Azure"),
("aws-anthropic", "AWS"),
("bedrock-anthropic", "AWS"),
("bedrock-chat", "AWS"),
("bedrock-mantle-chat", "AWS"),
("meta", "Meta"),
("meta-chat", "Meta"),
("meta-anthropic", "Meta"),
("moonshotai", "Moonshot AI"),
("moonshotai-anthropic", "Moonshot AI"),
("moonshotai-responses", "Moonshot AI"),
("kimi-code", "Moonshot AI"),
("deepseek", "DeepSeek"),
("deepseek-anthropic", "DeepSeek"),
("groq", "Groq"),
("openrouter", "OpenRouter"),
("xai", "xAI"),
("zai", "Z.AI"),
("typesafe", "TypeSafe"),
("ollama", "Local"),
("vllm", "Local"),
("sglang", "Local"),
("github-copilot", "GitHub"),
("deepinfra", "DeepInfra"),
("together", "Together AI"),
("fireworks", "Fireworks AI"),
("parasail", "Parasail"),
];