Mintplex-Labs/anything-llm · error · Error
ENV: No TTS_PROVIDER value found in environment!
Error message
ENV: No TTS_PROVIDER value found in environment!
What it means
Thrown by getTTSProvider() when process.env.TTS_PROVIDER contains a string that matches none of the switch cases. Important nuance: an unset TTS_PROVIDER never reaches this branch — the code applies `|| "openai"` first — so this error always means the variable IS set but spelled/cased/valued wrong. Supported values are exactly: openai, elevenlabs, generic-openai, kokoro (lowercase).
Solutions
- Set TTS_PROVIDER to one of the exact supported lowercase values: openai, elevenlabs, generic-openai, or kokoro.
- Check for stray whitespace, quotes, or capitalization in the value (the switch is case-sensitive).
- If you intended a provider your version doesn't list (e.g. kokoro), upgrade AnythingLLM to a version that includes it.
- Leave TTS_PROVIDER unset entirely if you want the openai default, then set TTS_OPEN_AI_KEY.
Example fix
# before (.env) TTS_PROVIDER=OpenAI-Generic # unrecognized -> Error # after (.env) TTS_PROVIDER=generic-openai TTS_OPEN_AI_COMPATIBLE_ENDPOINT=http://localhost:8080/v1
Defensive patterns
Strategy: validation
Validate before calling
const SUPPORTED_TTS_PROVIDERS = ["openai", "elevenlabs", "generic-openai", "kokoro"];
function assertTtsProviderConfigured() {
const p = process.env.TTS_PROVIDER || "openai";
if (!SUPPORTED_TTS_PROVIDERS.includes(p))
throw new Error(
`TTS_PROVIDER '${p}' is invalid. Supported: ${SUPPORTED_TTS_PROVIDERS.join(", ")}`
);
return p;
} Type guard
/** @param {string} p */
function isSupportedTtsProvider(p) {
return ["openai", "elevenlabs", "generic-openai", "kokoro"].includes(p);
} Try / catch
try {
tts = getTTSProvider();
} catch (e) {
if (/No TTS_PROVIDER value found/.test(e.message))
return respondConfigError(`TTS_PROVIDER '${process.env.TTS_PROVIDER}' is not recognized`);
throw e;
} Prevention
- Validate TTS_PROVIDER against the allowlist at boot, not on first use, so bad values surface in deploy logs.
- Remember unset is safe (defaults to openai) — this error always means a set-but-unrecognized value.
- Re-check the allowlist after upgrading AnythingLLM; providers are added over time.
When it happens
Trigger: Setting TTS_PROVIDER to anything outside {openai, elevenlabs, generic-openai, kokoro} — e.g. "generic openai" (space), "openai-generic", "OpenAI" (capitalized), "azure", "browser", or a provider name from a different/newer AnythingLLM version — and then invoking any text-to-speech path.
Common situations: Copy-pasting a provider name with different casing or word order; leftover value from an older config; expecting a provider that only exists in a newer release (kokoro was added later than openai/elevenlabs); whitespace or quotes around the value in .env; Docker env var typoed so a stale default from a mounted .env wins.
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- ENV: No valid LLM_PROVIDER value found in environment! Using
- No ElevenLabs API key was set.
- No Kokoro endpoint was set. Please set TTS_KOKORO_ENDPOINT…
- No OpenAI API key was set.
- No OpenAI compatible endpoint was set. Please set this to…
AI-assisted analysis of Mintplex-Labs/anything-llm@3aec848f28 (2026-08-18).
Data as JSON: /api/errors/fde95891badf2310.
Report an issue: GitHub.
Appendix: source
Thrown at server/utils/TextToSpeech/index.js:17
function getTTSProvider() {
const provider = process.env.TTS_PROVIDER || "openai";
switch (provider) {
case "openai":
const { OpenAiTTS } = require("./openAi");
return new OpenAiTTS();
case "elevenlabs":
const { ElevenLabsTTS } = require("./elevenLabs");
return new ElevenLabsTTS();
case "generic-openai":
const { GenericOpenAiTTS } = require("./openAiGeneric");
return new GenericOpenAiTTS();
case "kokoro":
const { KokoroTTS } = require("./kokoro");
return new KokoroTTS();
default:
throw new Error("ENV: No TTS_PROVIDER value found in environment!");
}
}
module.exports = { getTTSProvider };
View on GitHub (pinned to 3aec848f28)