zeroclaw-labs/zeroclaw · error
Transcription is enabled but no transcription provider regis
Error message
Transcription is enabled but no transcription provider registered successfully. Configure at least one of: [transcription] (Groq) with api_key + api_url; [transcription.openai]; [transcription.deepgram]; [transcription.assemblyai]; [transcription.google]; [transcription.local_whisper]; or [providers.transcription.<type>.<alias>].
What it means
TranscriptionManager::new() bails when transcription is enabled but the legacy provider registration produced zero providers. Registration is best-effort: each provider whose config is missing or invalid (including local_whisper) is silently skipped with a WARN log, and only the final 'is the map empty' check fails loudly. Note that new() registers only the legacy [transcription.*] blocks — typed [providers.transcription.<type>.<alias>] entries are not seen here (use from_config_for_agent or with_typed_providers for those).
Source
Thrown at crates/zeroclaw-channels/src/transcription.rs:948
}
}
/// Build a `TranscriptionManager` from a `TranscriptionConfig`. The
/// resolved agent alias starts empty; orchestrators that wire the
/// manager to a specific agent should call
/// `with_agent_transcription_provider` to set it.
pub fn new(config: &TranscriptionConfig) -> Result<Self> {
if matches!(config.max_audio_bytes, Some(0)) {
bail!("transcription.max_audio_bytes must be greater than zero");
}
let mut transcription_providers: HashMap<String, Box<dyn TranscriptionProvider>> =
HashMap::new();
Self::register_legacy_providers(&mut transcription_providers, config);
if config.enabled && transcription_providers.is_empty() {
bail!(
"Transcription is enabled but no transcription provider registered \
successfully. Configure at least one of: [transcription] (Groq) \
with api_key + api_url; [transcription.openai]; [transcription.deepgram]; \
[transcription.assemblyai]; [transcription.google]; [transcription.local_whisper]; \
or [providers.transcription.<type>.<alias>]."
);
}
Ok(Self {
transcription_providers,
max_audio_bytes: config.max_audio_bytes,
agent_transcription_provider: String::new(),
})
}
pub fn from_config_for_agent(config: &Config, agent_alias: Option<&str>) -> Result<Self> {
if matches!(config.transcription.max_audio_bytes, Some(0)) {
bail!("transcription.max_audio_bytes must be greater than zero");View on GitHub (pinned to 88bb9c8533)
Solutions
- Add at least one complete provider block, e.g. [transcription] with api_key + api_url (Groq) or [transcription.openai] / [transcription.deepgram] / [transcription.local_whisper]
- Check startup logs for the WARN lines 'local_whisper config invalid, provider skipped' — they name the exact reason each provider failed to register
- If you only use typed [providers.transcription.<type>.<alias>] config, build the manager via from_config_for_agent (or empty().with_typed_providers(...)) instead of new()
- If transcription is not actually wanted, set transcription.enabled = false
Example fix
# before [transcription] enabled = true # no provider blocks -> error # after [transcription] enabled = true api_key = "gsk_..." api_url = "https://api.groq.com/openai/v1/audio/transcriptions"
Defensive patterns
Strategy: validation
Validate before calling
// Fail fast with a clearer message than the constructor's
fn transcription_startup_ok(cfg: &TranscriptionConfig) -> bool {
!cfg.enabled || provider_config_present(cfg)
}
fn provider_config_present(cfg: &TranscriptionConfig) -> bool {
cfg.api_key.as_deref().is_some_and(|k| !k.is_empty())
|| cfg.openai.is_some() || cfg.deepgram.is_some()
|| cfg.assemblyai.is_some() || cfg.google.is_some()
|| cfg.local_whisper.is_some()
} Prevention
- Run config validation before startup and report missing provider blocks explicitly
- Watch startup WARN logs — skipped providers explain why the map ends up empty
- If you use typed [providers.transcription.*] config only, do not construct via new()
When it happens
Trigger: transcription.enabled = true while every provider registration returned Err or its config block is absent: no [transcription] Groq api_key/api_url, no openai/deepgram/assemblyai/google/local_whisper blocks, or their configs are invalid (e.g. local_whisper with a bad config — it is skipped with the WARN 'local_whisper config invalid, provider skipped').
Common situations: Enabling transcription but supplying the key under a different block name than the provider expects; only [providers.transcription.*] typed config present while constructing via new(); a typo'd api_key field so from_config returns Err and the provider is skipped; local_whisper URL malformed so it never registers.
Understand the failure class
Background: Config validation failed: what "invalid value for {key}" and settings-rejection errors mean across 19 open-source libraries — this error's family across 19 libraries.
Related errors
- Transcription is enabled but no transcription provider regis
- transcription.max_audio_bytes must be greater than zero
- Agent has no transcription_provider configured. Set `agent.<
- matrix: `homeserver` is required
- Audio file too large ({} bytes, local_whisper max {})
AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23).
Data as JSON: /api/errors/e8c27a26e3cd1d3a.
Report an issue: GitHub.