danny-avila/LibreChat · warning

Multiple providers are set. Please set only one provider.

Error message

Multiple providers are set. Please set only one provider.

What it means

getProviderSchema filters sttSchema entries (excluding `allowedAddresses`) for objects with at least one key and requires exactly one. If two or more providers (e.g. openai AND azureOpenAI) are populated, it throws because the dispatcher cannot choose between them.

Source

Thrown at api/server/services/Files/Audio/STTService.js:165

      req.config ??
      (await getAppConfig({
        role: req?.user?.role,
        userId: req?.user?.id,
        tenantId: req?.user?.tenantId,
      }));
    const sttSchema = appConfig?.speech?.stt;
    if (!sttSchema) {
      throw new Error(
        'No STT schema is set. Did you configure STT in the custom config (librechat.yaml)?',
      );
    }

    const providers = Object.entries(sttSchema).filter(
      ([key, value]) => key !== 'allowedAddresses' && Object.keys(value).length > 0,
    );

    if (providers.length !== 1) {
      throw new Error(
        providers.length > 1
          ? 'Multiple providers are set. Please set only one provider.'
          : 'No provider is set. Please set a provider.',
      );
    }

    const [provider, schema] = providers[0];
    return [provider, schema, sttSchema.allowedAddresses];
  }

  /**
   * Recursively removes undefined properties from an object.
   * @param {Object} obj - The object to clean.
   * @returns {void}
   */
  removeUndefined(obj) {
    Object.keys(obj).forEach((key) => {
      if (obj[key] && typeof obj[key] === 'object') {

View on GitHub (pinned to 5ff282f900)

Solutions

  1. Keep only one populated provider under speech.stt and remove or empty the others.
  2. Reload the config / restart the API server.

Example fix

# before
speech:
  stt:
    openai: { apiKey: '...' }
    azureOpenAI: { instanceName: '...', deploymentName: '...' }

# after
speech:
  stt:
    azureOpenAI: { instanceName: '...', deploymentName: '...', apiKey: '...' }
Defensive patterns

Strategy: validation

Validate before calling

const providers = Object.entries(appConfig.speech.stt || {})
  .filter(([k, v]) => k !== 'allowedAddresses' && v && Object.keys(v).length > 0);
if (providers.length > 1) {
  throw new Error(`Multiple STT providers configured: ${providers.map(p => p[0]).join(', ')}`);
}

Prevention

When it happens

Trigger: librechat.yaml `speech.stt` has more than one provider block populated with at least one field each.

Common situations: Copy-pasted example config leaving two providers filled in; migrated from openai to azureOpenAI without removing the old block; both a default and an override active.

Related errors


AI-assisted analysis of danny-avila/LibreChat@5ff282f900 (2026-08-12). Data as JSON: /api/errors/5b9a5436a83d6a71. Report an issue: GitHub.