jamiepine/voicebox · error · ValueError

Unknown effect type '{effect_type}' at index {i}. Available:

Error message

Unknown effect type '{effect_type}' at index {i}. Available: {list(EFFECT_REGISTRY.keys())}

What it means

validate_effects_chain() (backend/utils/effects.py) walks each effect dict; if effect['type'] is not a key in EFFECT_REGISTRY it returns this message. create_preset() and update_preset() call validate_effects_chain and raise ValueError with whatever it returns (effects.py:61, effects.py:102). Registered types are: chorus, reverb, delay, compressor, gain, highpass, lowpass, pitch_shift.

Source

Thrown at backend/services/effects.py:61

        return None
    return _preset_response(p)


def get_preset_by_name(name: str, db: Session) -> Optional[EffectPresetResponse]:
    """Get a preset by name."""
    p = db.query(DBEffectPreset).filter_by(name=name).first()
    if not p:
        return None
    return _preset_response(p)


def create_preset(data: EffectPresetCreate, db: Session) -> EffectPresetResponse:
    """Create a new user effect preset."""

    chain_dicts = [e.model_dump() for e in data.effects_chain]
    error = validate_effects_chain(chain_dicts)
    if error:
        raise ValueError(error)

    # Check for duplicate name before insert
    existing = db.query(DBEffectPreset).filter_by(name=data.name).first()
    if existing:
        raise ValueError(f"A preset named '{data.name}' already exists")

    preset = DBEffectPreset(
        id=str(uuid.uuid4()),
        name=data.name,
        description=data.description,
        effects_chain=json.dumps(chain_dicts),
        is_builtin=False,
    )
    db.add(preset)
    try:
        db.commit()
    except IntegrityError:
        db.rollback()

View on GitHub (pinned to 51f49dea19)

Solutions

  1. Use only registered types: chorus, reverb, delay, compressor, gain, highpass, lowpass, pitch_shift.
  2. Discover supported types and their param schemas at runtime via get_available_effects() (GET /effects).
  3. Update the backend if a new effect type is legitimately required.

Example fix

// before
{"type": "echo", "enabled": true, "params": {"delay_seconds": 0.3}}

// after — 'delay' is the registered name
{"type": "delay", "enabled": true, "params": {"delay_seconds": 0.3, "feedback": 0.3, "mix": 0.3}}
Defensive patterns

Strategy: validation

Validate before calling

from backend.utils.effects import EFFECT_REGISTRY

def all_types_known(chain):
    return all(isinstance(e, dict) and e.get("type") in EFFECT_REGISTRY for e in chain)

Type guard

from backend.utils.effects import EFFECT_REGISTRY

def is_known_effect_type(t) -> bool:
    return isinstance(t, str) and t in EFFECT_REGISTRY

Try / catch

try:
    create_preset(data, db)
except ValueError as e:
    if "Unknown effect type" in str(e):
        # show user available types from get_available_effects()
        ...
    raise

Prevention

When it happens

Trigger: POST /presets or PUT /presets/{id} with an effects_chain entry whose 'type' is something like 'echo', 'distortion', or a typo. Also a newer frontend sending an effect name the running backend's EFFECT_REGISTRY doesn't yet know.

Common situations: Frontend/backend version skew; hand-edited preset JSON; copy-pasting a raw pedalboard plugin name that isn't wrapped by the registry.

Related errors


AI-assisted analysis of jamiepine/voicebox@51f49dea19 (2026-08-12). Data as JSON: /api/errors/58ca752d606d26ac. Report an issue: GitHub.