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 chk

View on GitHub (pinned to 1dd6ba1acb)

Solutions

  1. Run `uv sync --extra buzz` in backend/ (installs coincurve), then restart the Gateway.
  2. For Docker deployments, rebuild with a target/profile that includes the buzz extra.
  3. If you did not mean to use Buzz, set channels.buzz.enabled to false or remove the block.
  4. 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

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


AI-assisted analysis of bytedance/deer-flow@1dd6ba1acb (2026-08-14). Data as JSON: /api/errors/d395506750e0a916. Report an issue: GitHub.