bytedance/deer-flow · error · RuntimeError
The Buzz channel requires the 'buzz' extra: run `uv sync --e
Error message
The Buzz channel requires the 'buzz' extra: run `uv sync --extra buzz` (installs coincurve for BIP-340 signing).
What it means
buzz_nostr keeps the coincurve import lazy so the rest of DeerFlow works without it; _require_coincurve() is called only when BIP-340 signing/parsing is actually needed (BuzzChannel.start -> parse_private_key etc.). If `import coincurve` raises ImportError, it raises this RuntimeError with the exact install command, because coincurve is an optional dependency gated behind the 'buzz' extra.
Source
Thrown at backend/app/channels/buzz_nostr.py:24
"""
from __future__ import annotations
import hashlib
import json
from dataclasses import dataclass
from typing import Any
_BECH32_CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
COINCURVE_INSTALL_HINT = "The Buzz channel requires the 'buzz' extra: run `uv sync --extra buzz` (installs coincurve for BIP-340 signing)."
def _require_coincurve():
try:
import coincurve
except ImportError as exc: # pragma: no cover - exercised via BuzzChannel.start
raise RuntimeError(COINCURVE_INSTALL_HINT) from exc
return coincurve
@dataclass(frozen=True)
class NostrKeys:
secret: bytes
pubkey_hex: str
def _bech32_polymod(values: list[int]) -> int:
gen = [0x3B6A57B2, 0x26508E6D, 0x1EA119FA, 0x3D4233DD, 0x2A1462B3]
chk = 1
for v in values:
b = chk >> 25
chk = (chk & 0x1FFFFFF) << 5 ^ v
for i in range(5):
chk ^= gen[i] if ((b >> i) & 1) else 0
return chkView on GitHub (pinned to 1dd6ba1acb)
Solutions
- Run `uv sync --extra buzz` in backend/ (installs coincurve), then restart the Gateway.
- For Docker deployments, rebuild with a target/profile that includes the buzz extra.
- If you did not mean to use Buzz, set channels.buzz.enabled to false or remove the block.
- If coincurve fails to compile, ensure a C toolchain and libsecp256k1 headers are available, or use a prebuilt wheel for your platform.
Example fix
# before uv sync # after uv sync --extra buzz
Defensive patterns
Strategy: try-catch
Validate before calling
def buzz_extra_available() -> bool:
try:
import coincurve # noqa: F401
return True
except ImportError:
return False
if config.buzz_enabled and not buzz_extra_available():
logger.error('enable channels.buzz only after `uv sync --extra buzz`') Try / catch
try:
channel.start()
except RuntimeError as e:
if 'buzz' extra' in str(e):
logger.error('%s — disabling buzz channel', e)
else:
raise Prevention
- Document `uv sync --extra buzz` wherever buzz is enabled in config.
- Build deployment images with the buzz extra when the feature is planned.
- Fail config validation at startup if buzz is enabled without coincurve importable, so it never fails lazily at first message.
When it happens
Trigger: channels.buzz is enabled in config.yaml but the backend environment was synced without the buzz extra (plain `uv sync`), or the deployment image was built without `--extra buzz`. The error surfaces when the Buzz channel starts and first tries to derive keys.
Common situations: Enabling Buzz on an existing installation that predates it; a Docker/CI image built from a bare requirements install; switching virtualenvs and forgetting the extra; pip-installed coincurve failing to build on exotic platforms.
Related errors
- not bech32: {value!r}
- expected {expected_hrp!r} bech32, got {hrp!r}
- invalid bech32 character in {value!r}
- bad bech32 checksum in {value!r}
- expected 32-byte payload in {value!r}
AI-assisted analysis of bytedance/deer-flow@1dd6ba1acb (2026-08-14).
Data as JSON: /api/errors/d395506750e0a916.
Report an issue: GitHub.