zeroclaw-labs/zeroclaw · error
Voice Call channel requires the `channel-voice-call` feature
Error message
Voice Call channel requires the `channel-voice-call` feature
What it means
Raised by build_channel_by_id in the "voice-call" arm when the binary was compiled without the `channel-voice-call` feature. Voice Call uses an inner cfg block; without the feature only the bail remains. Do not confuse it with the sibling error in the feature-on arm — "Voice Call channel is not configured" (a .context on the first configured entry) — this bail fires purely on compilation flags.
Source
Thrown at crates/zeroclaw-channels/src/orchestrator/mod.rs:9671
#[cfg(not(feature = "channel-line"))]
{
anyhow::bail!("LINE channel requires the `channel-line` feature");
}
}
"voice-call" => {
#[cfg(feature = "channel-voice-call")]
{
let (alias, vc) = config
.channels
.voice_call
.iter()
.next()
.context("Voice Call channel is not configured")?;
Ok(Arc::new(VoiceCallChannel::new(alias.clone(), vc.clone())))
}
#[cfg(not(feature = "channel-voice-call"))]
{
anyhow::bail!("Voice Call channel requires the `channel-voice-call` feature");
}
}
other => Err(anyhow::Error::new(UnknownChannelId(other.to_string()))),
}
}
/// Send a one-off message to a configured channel.
pub async fn send_channel_message(
config: &Config,
channel_id: &str,
recipient: &str,
message: &str,
) -> Result<()> {
// Wrap into the canonical shared handle for the builder; this is a
// one-shot path so the snapshot is dropped immediately after send.
let config_arc = Arc::new(RwLock::new(config.clone()));
// The builder gets first refusal so families it already resolves natively
// (notably `linq.<alias>`) keep their established route and their ownView on GitHub (pinned to 88bb9c8533)
Solutions
- Rebuild with cargo build --release --features channel-voice-call
- Or use --features channels-full
- Or remove the "voice-call" binding from config
- Once compiled in, make sure at least one voice-call entry exists in config or you will hit the separate 'not configured' error
Example fix
# before cargo build --release # after cargo build --release --features channel-voice-call
Defensive patterns
Strategy: validation
Validate before calling
use zeroclaw_channels::listing::is_channel_type_compiled;
if !is_channel_type_compiled("voice-call") {
eprintln!("rebuild with --features channel-voice-call or remove the voice-call binding");
} Type guard
fn voice_call_available() -> bool {
zeroclaw_channels::listing::is_channel_type_compiled("voice-call")
} Try / catch
match build_channel_by_id(&config_arc, "voice-call") {
Ok(ch) => { /* use */ }
Err(e) if e.to_string().contains("requires the `channel-voice-call` feature") => {
// rebuild needed
}
Err(e) if e.to_string().contains("Voice Call channel is not configured") => {
// compiled in but no entry in config: add one
}
Err(e) => return Err(e),
} Prevention
- Distinguish the feature bail from the sibling 'not configured' context error in the same arm
- Keep telephony features in the build profile wherever the config may enable voice bindings
When it happens
Trigger: start_channels / build_channel_by_id selecting "voice-call" from an agent binding or channels config in a build lacking --features channel-voice-call.
Common situations: Default-feature builds (voice-call is in channels-full only); telephony-enabled configs deployed onto binaries built without it; operators who see "Voice Call channel is not configured" docs and add config when the real problem is the missing feature.
Related errors
- QQ channel requires the `channel-qq` feature
- Lark channel requires the `channel-lark` feature
- DingTalk channel requires the `channel-dingtalk` feature
- WeCom channel requires the `channel-wecom` feature
- WeCom WebSocket channel requires the `channel-wecom-ws` feat
AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23).
Data as JSON: /api/errors/e4d62e9a45f3cf98.
Report an issue: GitHub.