Custom Endpoint Object Structure
Each endpoint in the custom array should have the following structure:
Example
name
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| name | String | A unique name for the endpoint. | Will be used as the "title" in the Endpoints Selector |
Required
Example:
apiKey
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| apiKey | String (apiKey | "user_provided") | Your API key for the service. Can reference an environment variable, or allow user to provide the value. | It's highly recommended to use the env. variable reference for this field, i.e. `${YOUR_VARIABLE}` |
Required
Example:
or
or
baseURL
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| baseURL | String (baseURL | "user_provided") | Base URL for the API. Can reference an environment variable, or allow user to provide the value. | It's highly recommended to use the env. variable reference for this field, i.e. `${YOUR_VARIABLE}` |
Required
Example:
or
or
Notes:
- If the
baseURLyou set is the full completions endpoint, you can set the directEndpoint field totrueto use it directly.- This is necessary because the app appends "/chat/completions" or "/completion" to the
baseURLby default.
- This is necessary because the app appends "/chat/completions" or "/completion" to the
- When using
provider: anthropic, setbaseURLto the API root that the Anthropic SDK should call, such ashttps://api.anthropic.comor your gateway root. LibreChat uses the native Anthropic/v1/messagespath for that provider.
provider
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| provider | String | Routes a custom endpoint through a native provider client instead of the default OpenAI-compatible client. | Currently supports `anthropic`. |
Default: omitted, which uses the OpenAI-compatible custom endpoint path.
Supported Values:
"anthropic"- Uses the native Anthropic/v1/messagesclient with this endpoint'sbaseURL,apiKey,headers,addParams,dropParams, andcustomParams.paramDefinitions.
Example:
Notes:
- Use
provider: anthropicfor Anthropic itself or Anthropic-compatible gateways that speak the native Messages API. - List models explicitly under
models.default; OpenAI-stylemodels.fetchis not used for native Anthropic custom endpoints. - The provider implies Anthropic UI parameters unless you explicitly set a different
customParams.defaultParamsEndpoint. - Endpoints without
providerkeep the OpenAI-compatible behavior.
iconURL
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| iconURL | String | Image URL, public asset path, or built-in endpoint icon key to use as the endpoint icon. |
Default: ""
Example:
or reuse a built-in endpoint icon:
Notes:
- Do not set a custom endpoint
nameto a built-in endpoint name just to reuse an icon. Custom endpoint names must be unique and should not use default endpoint values such as:- "openAI" | "azureOpenAI" | "google" | "anthropic" | "assistants" | "azureAssistants" | "agents" | "bedrock"
- To use a project-included endpoint icon, keep the custom endpoint
nameunique and seticonURLto one of the built-in endpoint keys instead.- "openAI" | "azureOpenAI" | "google" | "anthropic" | "assistants" | "azureAssistants" | "agents" | "bedrock"
- To use a custom image, set
iconURLto an image URL or a path served by LibreChat, such as/assets/my-icon.svg. - There are also "known endpoints" (case-insensitive), which have icons provided. If your endpoint
namematches the following names, you should omit this field:- "Anyscale"
- "APIpie"
- "Cohere"
- "Deepseek"
- "Fireworks"
- "groq"
- "Helicone"
- "Huggingface"
- "Mistral"
- "MLX"
- "Moonshot"
- "ollama"
- "OpenRouter"
- "Perplexity"
- "Qwen"
- "ShuttleAI"
- "together.ai"
- "Unify"
- "xai"
models
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| models | Object | Configuration for models. |
Required
Properties:
default
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| default | Array of Strings | An array of strings indicating the default models to use. | If fetching models fails, these defaults are used as a fallback. |
Required
Example:
fetch
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| fetch | Boolean | When set to `true`, attempts to fetch a list of models from the API. | May cause slowdowns during initial use of the app if the response is delayed. Defaults to `false`. |
Default: false
Example:
userIdQuery
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| userIdQuery | Boolean | When set to `true`, adds the LibreChat user ID as a query parameter to the API models request. |
Default: false
Example:
titleConvo
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| titleConvo | Boolean | Enables title conversation when set to `true`. |
Default: false
Example:
titleTiming
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| titleTiming | String | Controls when conversation titles are generated. Valid values: "immediate" or "final". | Defaults to "immediate". |
Default: "immediate"
Available Values:
"immediate"- Generates the title as soon as the request starts, in parallel with the model response, using the user's first message."final"- Defers title generation until the full response completes. This preserves the legacy behavior.
Example:
titleMethod
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| titleMethod | String | Controls the method used for generating conversation titles. | Valid values: "completion" (default), "structured", "functions" (legacy alias for "structured") |
Default: "completion"
Available Methods:
"completion"- Uses standard completion API without tools/functions. Compatible with most LLMs."structured"- Uses structured output for title generation. Requires provider/model support."functions"- Legacy alias for "structured". Functionally identical.
Example:
titleModel
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| titleModel | String | Specifies the model to use for titles. | Defaults to "gpt-3.5-turbo" if omitted. May cause issues if "gpt-3.5-turbo" is not available. You can also dynamically use the current conversation model by setting it to "current_model". |
Default: "gpt-3.5-turbo"
Example:
titlePrompt
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| titlePrompt | String | Custom prompt for title generation. Must include {convo} placeholder. | Allows full control over how titles are generated. |
Default:
Notes:
- Must always include the
{convo}placeholder - The
{convo}placeholder will be replaced with the formatted conversation
Example:
titlePromptTemplate
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| titlePromptTemplate | String | Template for formatting the conversation content that replaces {convo} in titlePrompt. | Must include {input} and {output} placeholders. |
Default: "User: {input}\nAI: {output}"
Notes:
- Must include both
{input}and{output}placeholders - Controls how the conversation is formatted when inserted into
titlePrompt
Example:
titleEndpoint
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| titleEndpoint | String | Specifies an alternative endpoint to use for title generation. | Allows using a different model/endpoint for titles. |
Default: Uses the current custom endpoint
Accepted Values:
openAIazureOpenAIgoogleanthropicbedrock- Another custom endpoint name
Example:
modelDisplayLabel
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| modelDisplayLabel | String | The label displayed in messages next to the Icon for the current AI model. | The display order is: 1. Custom name set via preset (if available), 2. Label derived from the model name (if applicable), 3. This value is used if the above are not specified. Defaults to "AI". |
Default: "AI"
Example:
addParams
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| addParams | Object/Dictionary | Adds additional parameters to requests. Values can be strings, numbers, booleans, arrays, or nested objects. Supports `web_search: true` for enabling web search in requests. | Adds/Overrides parameters. Useful for specifying API-specific options. |
Example:
Notes:
- The
addParamsfield allows you to include additional parameters that are not part of the default payload(see the "Default Parameters" section). This is particularly useful for API-specific options.
dropParams
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| dropParams | Array/List of Strings | Removes default parameters from requests. | Excludes specified default parameters. Useful for APIs that do not accept or recognize certain parameters. |
Example:
Note:
- The
dropParamsfield allows you to remove "Default Parameters" that are sent with every request. This is helpful when working with APIs that do not accept or recognize certain parameters.
customParams
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| customParams | Object/Dictionary | Defines custom endpoint behavior and settings metadata that are not part of the provider request body. | Used for endpoint-specific configuration such as reasoning parameter shape. |
Sub-keys:
| Key | Type | Description | Example |
|---|---|---|---|
| defaultParamsEndpoint | String | Endpoint defaults used for request parameter metadata. Defaults to `custom`. When `provider: anthropic` is set and this field is omitted, LibreChat uses the Anthropic parameter set. | defaultParamsEndpoint: custom |
| reasoningFormat | String | Controls how reasoning parameters are sent to OpenAI-compatible custom endpoints. Valid values: `reasoning_effort`, `reasoning_object`, `disabled`. | reasoningFormat: reasoning_object |
| reasoningKey | String | Controls which response key is read for provider reasoning content. Valid values: `reasoning` or `reasoning_content`. | reasoningKey: reasoning_content |
| paramDefinitions | Array/List | Custom setting definitions for this endpoint. | See default parameter definitions. |
Reasoning Formats:
reasoning_effort- Sends the legacyreasoning_effortparameter.reasoning_object- Sends areasoningobject, such as{ effort, summary }, for providers that follow the newer OpenAI-compatible shape.disabled- Suppresses reasoning parameters even when a user or model spec selects reasoning.
Anthropic provider note:
Use provider: anthropic when the custom endpoint should use the native Anthropic Messages API. Use customParams.defaultParamsEndpoint: anthropic without provider only when you still need the OpenAI-compatible custom endpoint path but want Anthropic-style parameter metadata and request adaptation.
Example:
tokenConfig
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| tokenConfig | Object/Dictionary | Defines model-specific context windows and per-million-token rates for this custom endpoint. | Used by context usage, visible cost breakdowns, balance transactions, and multi-endpoint agent billing. |
Each key is a model name. Each model entry supports:
| Key | Type | Description | Example |
|---|---|---|---|
| prompt | Number | Prompt/input token rate per million tokens. | Required |
| completion | Number | Completion/output token rate per million tokens. | Required |
| context | Number | Maximum context window for the model. | Required |
| cacheRead | Number | Cached input read rate per million tokens. | Optional |
| cacheWrite | Number | Cached input write rate per million tokens. | Optional |
Example:
Notes:
- Rates are expressed per million tokens in USD before any
interface.currencyconversion is applied for display. - The model name must match the model value sent through the custom endpoint.
- For Agents using multiple endpoints, the matching endpoint/model token config is used when recording usage and cost.
headers
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| headers | Object/Dictionary | Adds additional headers to requests. All header values must be strings. Supports dynamic user field substitution with `{{LIBRECHAT_USER_*}}`, request body placeholders with `{{LIBRECHAT_BODY_*}}`, and environment variables with `${ENV_VAR}`. | The `headers` object specifies custom headers for requests. Useful for authentication and setting content types. |
Example:
Note: Supports dynamic environment variable values, which use the format: "${VARIABLE_NAME}".
When models.fetch: true is used, these headers are also resolved and forwarded to the model-list request for admin-controlled base URLs. A configured Authorization header takes precedence over the endpoint apiKey fallback, which is useful for auth-aware proxies that return per-user model lists. If baseURL: "user_provided" is configured, LibreChat does not forward configured header templates to the user-provided destination. For provider: anthropic, headers are forwarded through the native Anthropic client instead of the OpenAI-compatible client.
Available User Field Placeholders:
| Placeholder | User Field | Type | Description |
|---|---|---|---|
{{LIBRECHAT_USER_ID}} | id | String | User's unique identifier |
{{LIBRECHAT_USER_NAME}} | name | String | User's display name |
{{LIBRECHAT_USER_USERNAME}} | username | String | User's username |
{{LIBRECHAT_USER_EMAIL}} | email | String | User's email address |
{{LIBRECHAT_USER_PROVIDER}} | provider | String | Authentication provider (e.g., "email", "google", "github") |
{{LIBRECHAT_USER_ROLE}} | role | String | User's role (e.g., "user", "admin") |
{{LIBRECHAT_USER_GOOGLEID}} | googleId | String | Google account ID |
{{LIBRECHAT_USER_FACEBOOKID}} | facebookId | String | Facebook account ID |
{{LIBRECHAT_USER_OPENIDID}} | openidId | String | OpenID account ID |
{{LIBRECHAT_USER_SAMLID}} | samlId | String | SAML account ID |
{{LIBRECHAT_USER_LDAPID}} | ldapId | String | LDAP account ID |
{{LIBRECHAT_USER_GITHUBID}} | githubId | String | GitHub account ID |
{{LIBRECHAT_USER_DISCORDID}} | discordId | String | Discord account ID |
{{LIBRECHAT_USER_APPLEID}} | appleId | String | Apple account ID |
{{LIBRECHAT_USER_EMAILVERIFIED}} | emailVerified | Boolean → String | Email verification status ("true" or "false") |
{{LIBRECHAT_USER_TWOFACTORENABLED}} | twoFactorEnabled | Boolean → String | 2FA status ("true" or "false") |
{{LIBRECHAT_USER_TERMSACCEPTED}} | termsAccepted | Boolean → String | Terms acceptance status ("true" or "false") |
Available Request Body Placeholders:
| Placeholder | Body Field | Type | Description |
|---|---|---|---|
{{LIBRECHAT_BODY_CONVERSATIONID}} | conversationId | String | Current conversation identifier |
{{LIBRECHAT_BODY_PARENTMESSAGEID}} | parentMessageId | String | Parent message identifier |
{{LIBRECHAT_BODY_MESSAGEID}} | messageId | String | Current message identifier |
Example using request body placeholders:
directEndpoint
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| directEndpoint | Boolean | When set to `true`, treats the configured `baseURL` as the completions endpoint to be used |
Default: false
Example:
titleMessageRole
- Options:
"system"|"user"|"assistant"
Key:
| Key | Type | Description | Example |
|---|---|---|---|
| titleMessageRole | String | Specifies the role value to use in the message payload for title generation. Must be one of: `"system"`, `"user"`, `"assistant"`. | Defaults to "system" if omitted. May cause issues if "system" is not a valid value, which is sometimes the case for single message payloads, as it is for title generation. |
Default: "system"
Example:
How is this guide?