{"record":{"id":"5b9a5436a83d6a71","repo":"danny-avila/LibreChat","slug":"multiple-providers-are-set-please-set-only-one-pr","errorCode":null,"errorMessage":"Multiple providers are set. Please set only one provider.","messagePattern":"Multiple providers are set\\. Please set only one provider\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"api/server/services/Files/Audio/STTService.js","lineNumber":165,"sourceCode":"      req.config ??\n      (await getAppConfig({\n        role: req?.user?.role,\n        userId: req?.user?.id,\n        tenantId: req?.user?.tenantId,\n      }));\n    const sttSchema = appConfig?.speech?.stt;\n    if (!sttSchema) {\n      throw new Error(\n        'No STT schema is set. Did you configure STT in the custom config (librechat.yaml)?',\n      );\n    }\n\n    const providers = Object.entries(sttSchema).filter(\n      ([key, value]) => key !== 'allowedAddresses' && Object.keys(value).length > 0,\n    );\n\n    if (providers.length !== 1) {\n      throw new Error(\n        providers.length > 1\n          ? 'Multiple providers are set. Please set only one provider.'\n          : 'No provider is set. Please set a provider.',\n      );\n    }\n\n    const [provider, schema] = providers[0];\n    return [provider, schema, sttSchema.allowedAddresses];\n  }\n\n  /**\n   * Recursively removes undefined properties from an object.\n   * @param {Object} obj - The object to clean.\n   * @returns {void}\n   */\n  removeUndefined(obj) {\n    Object.keys(obj).forEach((key) => {\n      if (obj[key] && typeof obj[key] === 'object') {","sourceCodeStart":147,"sourceCodeEnd":183,"githubUrl":"https://github.com/danny-avila/LibreChat/blob/5ff282f9006c436e561de1afd39a481bea1ef0d8/api/server/services/Files/Audio/STTService.js#L147-L183","documentation":"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.","triggerScenarios":"librechat.yaml `speech.stt` has more than one provider block populated with at least one field each.","commonSituations":"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.","solutions":["Keep only one populated provider under speech.stt and remove or empty the others.","Reload the config / restart the API server."],"exampleFix":"# before\nspeech:\n  stt:\n    openai: { apiKey: '...' }\n    azureOpenAI: { instanceName: '...', deploymentName: '...' }\n\n# after\nspeech:\n  stt:\n    azureOpenAI: { instanceName: '...', deploymentName: '...', apiKey: '...' }","handlingStrategy":"validation","validationCode":"const providers = Object.entries(appConfig.speech.stt || {})\n  .filter(([k, v]) => k !== 'allowedAddresses' && v && Object.keys(v).length > 0);\nif (providers.length > 1) {\n  throw new Error(`Multiple STT providers configured: ${providers.map(p => p[0]).join(', ')}`);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep exactly one provider block populated; comment out or delete the others.","Add a CI lint step that fails when more than one STT provider is non-empty.","Document the single-provider constraint next to the speech.stt example."],"tags":["stt","config","misconfiguration","provider"],"backgroundTag":null,"analyzedSha":"5ff282f9006c436e561de1afd39a481bea1ef0d8","analyzedAt":"2026-08-12T21:38:08.145Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}