{"record":{"id":"1b170adb51bba041","repo":"Mintplex-Labs/anything-llm","slug":"no-openai-api-key-was-set-1b170a","errorCode":null,"errorMessage":"No OpenAI API key was set.","messagePattern":"No OpenAI API key was set\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"server/utils/TextToSpeech/openAi/index.js","lineNumber":4,"sourceCode":"class OpenAiTTS {\n  constructor() {\n    if (!process.env.TTS_OPEN_AI_KEY)\n      throw new Error(\"No OpenAI API key was set.\");\n    const { OpenAI: OpenAIApi } = require(\"openai\");\n    this.openai = new OpenAIApi({\n      apiKey: process.env.TTS_OPEN_AI_KEY,\n    });\n    this.voice = process.env.TTS_OPEN_AI_VOICE_MODEL ?? \"alloy\";\n  }\n\n  async ttsBuffer(textInput) {\n    try {\n      const result = await this.openai.audio.speech.create({\n        model: \"tts-1\",\n        voice: this.voice,\n        input: textInput,\n      });\n      return Buffer.from(await result.arrayBuffer());\n    } catch (e) {\n      console.error(e);\n    }","sourceCodeStart":1,"sourceCodeEnd":22,"githubUrl":"https://github.com/Mintplex-Labs/anything-llm/blob/3aec848f2885144aa8f1e53b9731a04310d5d558/server/utils/TextToSpeech/openAi/index.js#L1-L22","documentation":"Thrown by the OpenAiTTS constructor when TTS_OPEN_AI_KEY is unset. This is a separate variable from OPEN_AI_KEY (used by STT) and from the LLM provider keys — AnythingLLM deliberately scopes TTS credentials to TTS_OPEN_AI_*, so having a working chat/STT key does not satisfy this check. The voice defaults to 'alloy' via TTS_OPEN_AI_VOICE_MODEL and the model is hardcoded to tts-1.","triggerScenarios":"TTS_PROVIDER=openai (the default) and any speech-generation request while TTS_OPEN_AI_KEY is missing from the server environment.","commonSituations":"User sets OPEN_AI_KEY for chat, assumes TTS inherits it, and never sets TTS_OPEN_AI_KEY; .env updated but container not restarted; key placed under the generic-openai variables (TTS_OPEN_AI_COMPATIBLE_KEY) by mistake.","solutions":["Set TTS_OPEN_AI_KEY=sk-... explicitly in the server environment and restart.","Confirm you are not relying on OPEN_AI_KEY — the TTS class only reads TTS_OPEN_AI_KEY.","Optionally set TTS_OPEN_AI_VOICE_MODEL (e.g. nova, shimmer) — defaults to alloy if omitted.","Verify the key has access to the tts-1 model on your OpenAI account."],"exampleFix":"# before (.env)\nTTS_PROVIDER=openai\nOPEN_AI_KEY=sk-abc        # wrong var for TTS\n# -> Error: No OpenAI API key was set.\n\n# after (.env)\nTTS_PROVIDER=openai\nTTS_OPEN_AI_KEY=sk-abc    # correct var\nTTS_OPEN_AI_VOICE_MODEL=alloy","handlingStrategy":"validation","validationCode":"const canUseOpenAiTTS = () => Boolean(process.env.TTS_OPEN_AI_KEY);\n\nif ((process.env.TTS_PROVIDER || \"openai\") === \"openai\" && !canUseOpenAiTTS()) {\n  throw new Error(\"openai TTS requires TTS_OPEN_AI_KEY (OPEN_AI_KEY is NOT used for TTS)\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  tts = getTTSProvider();\n} catch (e) {\n  if (/No OpenAI API key was set/.test(e.message) && (process.env.TTS_PROVIDER || \"openai\") === \"openai\")\n    return respondConfigError(\"TTS_OPEN_AI_KEY missing\");\n  throw e;\n}","preventionTips":["Don't assume key reuse: chat (LLM provider key), STT (OPEN_AI_KEY), and TTS (TTS_OPEN_AI_KEY) are separate variables in this codebase.","Add a deploy-time assertion listing all three OpenAI-related vars and which subsystem each unlocks.","Restart the process after .env changes; Node reads env once at boot."],"tags":["env","configuration","tts","openai","missing-api-key"],"backgroundTag":"missing-env-var","analyzedSha":"3aec848f2885144aa8f1e53b9731a04310d5d558","analyzedAt":"2026-08-18T10:02:21.017Z","contentChangedAt":"2026-08-18T10:02:21.017Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}