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

  1. Add at least one complete provider block, e.g. [transcription] with api_key + api_url (Groq) or [transcription.openai] / [transcription.deepgram] / [transcription.local_whisper]
  2. Check startup logs for the WARN lines 'local_whisper config invalid, provider skipped' — they name the exact reason each provider failed to register
  3. 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()
  4. 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

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


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/e8c27a26e3cd1d3a. Report an issue: GitHub.