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
- Use only registered types: chorus, reverb, delay, compressor, gain, highpass, lowpass, pitch_shift.
- Discover supported types and their param schemas at runtime via get_available_effects() (GET /effects).
- 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
- Drive the effects-chain editor from get_available_effects() so only registered types are selectable.
- Validate the chain client-side against the same registry before POSTing.
- Keep frontend and backend effect-type vocabularies in sync across releases.
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
- A preset named '{data.name}' already exists
- Effect '{effect_type}' at index {i}: param '{param_name}' mu
- Generation is not completed
- {validation error from validate_effects_chain}
- {exception message from create_preset (ValueError)}
AI-assisted analysis of jamiepine/voicebox@51f49dea19 (2026-08-12).
Data as JSON: /api/errors/58ca752d606d26ac.
Report an issue: GitHub.