{"record":{"id":"69c19306a60c02df","repo":"tinyhumansai/openhuman","slug":"voice-provider-does-not-support-tts-capabili","errorCode":null,"errorMessage":"voice provider '{}' does not support TTS (capability: {})","messagePattern":"voice provider '(.+?)' does not support TTS \\(capability: (.+?)\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/voice/factory/helpers.rs","lineNumber":159,"sourceCode":"/// Create a TTS provider by looking up a slug in `config.voice_providers`.\npub(super) fn create_tts_provider_by_slug(\n    slug: &str,\n    voice: &str,\n    config: &Config,\n) -> anyhow::Result<Box<dyn TtsProvider>> {\n    let entry = config\n        .voice_providers\n        .iter()\n        .find(|p| p.slug == slug)\n        .ok_or_else(|| {\n            anyhow::anyhow!(\n                \"no voice provider with slug '{}' found in voice_providers\",\n                slug\n            )\n        })?;\n\n    if !entry.capability.supports_tts() {\n        return Err(anyhow::anyhow!(\n            \"voice provider '{}' does not support TTS (capability: {})\",\n            slug,\n            entry.capability.as_str()\n        ));\n    }\n\n    let effective_voice = if voice.trim().is_empty() {\n        entry.default_tts_voice.as_deref().unwrap_or(\"default\")\n    } else {\n        voice\n    };\n\n    let api_key = crate::openhuman::inference::provider::factory::lookup_key_for_slug(slug, config)\n        .unwrap_or_default();\n\n    debug!(\n        \"{LOG_PREFIX} creating external TTS provider slug={slug} voice={effective_voice} \\\n         endpoint={} key_present={}\",","sourceCodeStart":141,"sourceCodeEnd":177,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/voice/factory/helpers.rs#L141-L177","documentation":"TTS counterpart of the capability check: the slug exists in voice_providers but the entry does not declare TTS (e.g. an STT-only provider chosen for speech synthesis), so no TTS client can be built.","triggerScenarios":"Thrown at src/openhuman/voice/factory/helpers.rs:159 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Select a provider whose capability includes TTS","Or declare tts capability on the entry in config.toml"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}