zed-industries/zed · warning

unknown teacher backend `{s}`. Valid options: sonnet45, sonn

Error message

unknown teacher backend `{s}`. Valid options: sonnet45, sonnet46, gpt52, gpt54, gpt55

What it means

Parse failure for the TeacherBackend type, which is parsed from a CLI string via FromStr. The match is case-insensitive (input is lowercased) and accepts aliases: 'sonnet45'/'sonnet'/'claude' -> Sonnet45, 'sonnet46', 'gpt52', 'gpt54'/'gpt'/'openai' -> Gpt54, 'gpt55', plus the legacy alias 'v0114180editableregion'. Anything else bails with this message listing the canonical names.

Source

Thrown at crates/edit_prediction_cli/src/main.rs:429

            TeacherBackend::Gpt52 => write!(f, "gpt52"),
            TeacherBackend::Gpt54 => write!(f, "gpt54"),
            TeacherBackend::Gpt55 => write!(f, "gpt55"),
        }
    }
}

impl std::str::FromStr for TeacherBackend {
    type Err = anyhow::Error;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s.to_lowercase().as_str() {
            "sonnet45" | "sonnet" | "claude" => Ok(TeacherBackend::Sonnet45),
            "sonnet46" => Ok(TeacherBackend::Sonnet46),
            "gpt52" => Ok(TeacherBackend::Gpt52),
            "gpt54" | "gpt" | "openai" => Ok(TeacherBackend::Gpt54),
            "gpt55" => Ok(TeacherBackend::Gpt55),
            "v0114180editableregion" => Ok(TeacherBackend::Sonnet45),
            _ => anyhow::bail!(
                "unknown teacher backend `{s}`. Valid options: sonnet45, sonnet46, gpt52, gpt54, gpt55"
            ),
        }
    }
}

impl TeacherBackend {
    pub fn model_name(&self) -> &'static str {
        match self {
            TeacherBackend::Sonnet45 => "claude-sonnet-4-5",
            TeacherBackend::Sonnet46 => "claude-sonnet-4-6",
            TeacherBackend::Gpt52 => "gpt-5.2",
            TeacherBackend::Gpt54 => "gpt-5.4",
            TeacherBackend::Gpt55 => "gpt-5.5",
        }
    }
}

View on GitHub (pinned to f4178619ac)

Solutions

  1. Use one of the canonical names: sonnet45, sonnet46, gpt52, gpt54, gpt55
  2. Aliases also work: sonnet, claude (= sonnet45), gpt, openai (= gpt54)
  3. Case does not matter (input is lowercased) but spacing and hyphens do — use the bare alias without 'claude-'/'gpt-' prefixes

Example fix

# before
--provider teacher:claude-sonnet-4-6

# after
--provider teacher:sonnet46
Defensive patterns

Strategy: validation

Validate before calling

const VALID_BACKENDS: &[&str] = &["sonnet45", "sonnet", "claude", "sonnet46", "gpt52", "gpt54", "gpt", "openai", "gpt55", "v0114180editableregion"];

fn backend_is_valid(s: &str) -> bool {
    VALID_BACKENDS.contains(&s.to_lowercase().as_str())
}

Prevention

When it happens

Trigger: Passing a teacher backend string that is not in the accepted set, e.g. --teacher-backend gpt53, 'Sonnet 4.6' (space), or a model id like 'claude-sonnet-4-6' — the parser wants the short alias 'sonnet46', not the full model name. Note the error text lists canonical options but not the accepted aliases.

Common situations: Version skew: scripts written when only sonnet45/gpt52 existed, then a new model ships and users guess a name; copying the full model id (claude-sonnet-4-5) from the API instead of the alias; typos after renaming models.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of zed-industries/zed@f4178619ac (2026-08-20). Data as JSON: /api/errors/0d09e2d871e464e3. Report an issue: GitHub.