# Custom Endpoint Object Structure (/docs/configuration/librechat_yaml/object_structure/custom_endpoint)

Each endpoint in the `custom` array should have the following structure:

## Example 

```yaml filename="Endpoint Object Structure"
endpoints:
    custom:
        # Example using Mistral AI API
    - name: "Mistral"
        apiKey: "${YOUR_ENV_VAR_KEY}"
        baseURL: "https://api.mistral.ai/v1"
        models: 
        default: ["mistral-tiny", "mistral-small", "mistral-medium", "mistral-large-latest"]
        titleConvo: true
        titleModel: "mistral-tiny" 
        modelDisplayLabel: "Mistral"
        # addParams:
        #   safe_prompt: true # Mistral specific value for moderating messages
        # NOTE: For Mistral, it is necessary to drop the following parameters or you will encounter a 422 Error:
        dropParams: ["stop", "user", "frequency_penalty", "presence_penalty"]
```

## name

**Key:**
<OptionTable
  options={[
    ['name', 'String', 'A unique name for the endpoint.', 'Will be used as the "title" in the Endpoints Selector'],
  ]}
/>

**Required**

**Example:**
```yaml filename="endpoints / custom / name"
name: "Mistral"
```

## apiKey

**Key:**
<OptionTable
  options={[
    ['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:**
```yaml filename="endpoints / custom / apiKey"
apiKey: "${MISTRAL_API_KEY}"
```
or
```yaml filename="endpoints / custom / apiKey"
apiKey: "your_api_key"
```
or
```yaml filename="endpoints / custom / apiKey"
apiKey: "user_provided"
```

## baseURL

**Key:**
<OptionTable
  options={[
    ['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:**
```yaml filename="endpoints / custom / baseURL"
baseURL: "https://api.mistral.ai/v1"
```
or
```yaml filename="endpoints / custom / baseURL"
baseURL: "${MISTRAL_BASE_URL}"
```
or
```yaml filename="endpoints / custom / baseURL"
baseURL: "user_provided"
```

**Notes:**

* If the `baseURL` you set is the full completions endpoint, you can set the [directEndpoint](#directendpoint) field to `true` to use it directly.
  - This is necessary because the app appends "/chat/completions" or "/completion" to the `baseURL` by default.

## iconURL

**Key:**
<OptionTable
  options={[
    ['iconURL', 'String', 'The URL to use as the Endpoint Icon.', ''],
  ]}
/>

**Default:** `""`

**Example:**
```yaml filename="endpoints / custom / iconURL"
iconURL: https://github.com/danny-avila/LibreChat/raw/main/docs/assets/LibreChat.svg
```
**Notes:**

* If you want to use existing project icons, define the endpoint `name` as one of the main endpoints (case-sensitive):
  - "openAI" | "azureOpenAI" | "google" | "anthropic" | "assistants" | "gptPlugins"
* There are also "known endpoints" (case-insensitive), which have icons provided. If your endpoint `name` matches 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:**
<OptionTable
  options={[
    ['models', 'Object', 'Configuration for models.', ''],
  ]}
/>

**Required**

**Properties:**

### default

**Key:**
<OptionTable
  options={[
    ['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:**
```yaml filename="endpoints / custom / models / default"
default:
  - "mistral-tiny"
  - "mistral-small"
  - "mistral-medium"
```

### fetch

**Key:**
<OptionTable
  options={[
    ['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:**
```yaml filename="endpoints / custom / models / fetch"
fetch: true
```

### userIdQuery

**Key:**
<OptionTable
  options={[
    ['userIdQuery', 'Boolean', 'When set to `true`, adds the LibreChat user ID as a query parameter to the API models request.', ''],
  ]}
/>

**Default:** `false`

**Example:**
```yaml filename="endpoints / custom / models / userIdQuery"
userIdQuery: true
```

## titleConvo

**Key:**
<OptionTable
  options={[
    ['titleConvo', 'Boolean', 'Enables title conversation when set to `true`.', ''],
  ]}
/>

**Default:** `false`

**Example:**
```yaml filename="endpoints / custom / titleConvo"
titleConvo: true
```

## titleMethod

**Key:**
<OptionTable
  options={[
    ['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:**
```yaml filename="endpoints / custom / titleMethod"
titleMethod: "completion"
```

## titleModel

**Key:**
<OptionTable
  options={[
    ['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:**
```yaml filename="endpoints / custom / titleModel"
titleModel: "mistral-tiny"
```

```yaml filename="endpoints / custom / titleModel"
titleModel: "current_model"
```

## titlePrompt

**Key:**
<OptionTable
  options={[
    ['titlePrompt', 'String', 'Custom prompt for title generation. Must include {convo} placeholder.', 'Allows full control over how titles are generated.'],
  ]}
/>

**Default:** 
```
Analyze this conversation and provide:
1. The detected language of the conversation
2. A concise title in the detected language (5 words or less, no punctuation or quotation)

{convo}
```

**Notes:**
- Must always include the `{convo}` placeholder
- The `{convo}` placeholder will be replaced with the formatted conversation

**Example:**
```yaml filename="endpoints / custom / titlePrompt"
titlePrompt: "Create a brief, descriptive title for the following conversation:\n\n{convo}\n\nTitle:"
```

## titlePromptTemplate

**Key:**
<OptionTable
  options={[
    ['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:**
```yaml filename="endpoints / custom / titlePromptTemplate"
titlePromptTemplate: "Human: {input}\n\nAssistant: {output}"
```

## titleEndpoint

**Key:**
<OptionTable
  options={[
    ['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:**
- `openAI`
- `azureOpenAI`
- `google`
- `anthropic`
- `bedrock`
- Another custom endpoint name

**Example:**
```yaml filename="endpoints / custom / titleEndpoint"
# Use a different custom endpoint for titles
endpoints:
  custom:
    - name: "my-chat-endpoint"
      apiKey: "${CHAT_API_KEY}"
      baseURL: "https://api.example.com/v1/chat"
      models:
        default: ["gpt-4"]
      titleEndpoint: "my-title-endpoint"
      
    - name: "my-title-endpoint"
      apiKey: "${TITLE_API_KEY}"
      baseURL: "https://api.example.com/v1/title"
      models:
        default: ["gpt-3.5-turbo"]
```

## summarize

**Key:**
<OptionTable
  options={[
    ['summarize', 'Boolean', 'Enables summarization when set to `true`.', 'This feature requires an OpenAI Functions compatible API'],
  ]}
/>

**Default:** `false`

**Example:**
```yaml filename="endpoints / custom / summarize"
summarize: false
```

## summaryModel

**Key:**
<OptionTable
  options={[
    ['summaryModel', 'String', 'Specifies the model to use if summarization is enabled.', 'Defaults to "gpt-3.5-turbo" if omitted. May cause issues if "gpt-3.5-turbo" is not available.'],
  ]}
/>

**Default:** `"gpt-3.5-turbo"`

**Example:**
```yaml filename="endpoints / custom / summaryModel"
summaryModel: "mistral-tiny"
```

## modelDisplayLabel

**Key:**
<OptionTable
  options={[
    ['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:**
```yaml filename="endpoints / custom / modelDisplayLabel"
modelDisplayLabel: "Mistral"
```

## addParams

**Key:**
<OptionTable
  options={[
    ['addParams', 'Object/Dictionary', 'Adds additional parameters to requests.', 'Adds/Overrides parameters. Useful for specifying API-specific options.'],
  ]}
/>

**Example:**
```yaml filename="endpoints / custom / addParams"
addParams:
  safe_prompt: true
  max_tokens: 2048
```
**Notes:**
- The `addParams` field allows you to include additional parameters that are not part of the default payload(see the ["Default Parameters"](/docs/configuration/librechat_yaml/object_structure/default_params) section). This is particularly useful for API-specific options.

## dropParams

**Key:**
<OptionTable
  options={[
    ['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:**
```yaml filename="endpoints / custom / dropParams"
dropParams:
  - "stop"
  - "user"
  - "frequency_penalty"
  - "presence_penalty"
```
**Note:** 
- The `dropParams` field allows you to remove ["Default Parameters"](/docs/configuration/librechat_yaml/object_structure/default_params) that are sent with every request. This is helpful when working with APIs that do not accept or recognize certain parameters.

## headers

**Key:**
<OptionTable
  options={[
    ['headers', 'Object/Dictionary', 'Adds additional headers to requests. 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:**
```yaml filename="endpoints / custom / headers"
headers:
  x-api-key: "${ENVIRONMENT_VARIABLE}"
  Content-Type: "application/json"
  X-User-ID: "{{LIBRECHAT_USER_ID}}"
  X-User-Email: "{{LIBRECHAT_USER_EMAIL}}"
```
**Note:** Supports dynamic environment variable values, which use the format: `"${VARIABLE_NAME}"`.


**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:**

```yaml filename="endpoints / custom / headers with body placeholders"
headers:
  X-Conversation-ID: "{{LIBRECHAT_BODY_CONVERSATIONID}}"
  X-Parent-Message-ID: "{{LIBRECHAT_BODY_PARENTMESSAGEID}}"
  X-Message-ID: "{{LIBRECHAT_BODY_MESSAGEID}}"
```

## directEndpoint

**Key:**
<OptionTable
  options={[
    ['directEndpoint', 'Boolean', 'When set to `true`, treats the configured `baseURL` as the completions endpoint to be used', ''],
  ]}
/>

**Default:** `false`

**Example:**
```yaml filename="endpoints / custom / directEndpoint"
directEndpoint: true
```

## titleMessageRole

**Key:**
<OptionTable
  options={[
    ['titleMessageRole', 'String', 'Specifies the role value to use in the message payload for title generation.', '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:**
```yaml filename="endpoints / custom / titleMessageRole"
titleMessageRole: "user"
```
