{"record":{"id":"80f102bce842f692","repo":"danny-avila/LibreChat","slug":"no-provider-is-set-please-set-a-provider","errorCode":null,"errorMessage":"No provider is set. Please set a provider.","messagePattern":"No provider is set\\. Please set a provider\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","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":"The `speech.stt` block exists (so it passed the line-154 falsy check) but after filtering out `allowedAddresses` and empty provider objects, zero providers remain. This means the schema shell is present but every provider entry is an empty object — e.g. `stt: { openai: {} }`.","triggerScenarios":"speech.stt is a non-falsy object whose only entries are `allowedAddresses` and/or provider keys mapped to empty objects.","commonSituations":"Placeholder config committed without values; provider subfields commented out leaving `{}`; YAML indentation producing an empty mapping.","solutions":["Populate at least one provider with its required fields (e.g. openai.apiKey, or azureOpenAI.instanceName + deploymentName + apiKey).","Reload the config / restart the API server."],"exampleFix":"# before\nspeech:\n  stt:\n    openai: {}\n\n# after\nspeech:\n  stt:\n    openai:\n      apiKey: '${STT_API_KEY}'\n      model: 'whisper-1'","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 === 0) {\n  throw new Error('STT schema present but no provider populated');\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["After editing the config, hit GET on a config-introspection endpoint or a test STT call to confirm a provider resolves.","Reject empty placeholder provider objects in a config validator."],"tags":["stt","config","provider","empty-schema"],"backgroundTag":null,"analyzedSha":"5ff282f9006c436e561de1afd39a481bea1ef0d8","analyzedAt":"2026-08-12T21:38:08.145Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}