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
- Use one of the canonical names: sonnet45, sonnet46, gpt52, gpt54, gpt55
- Aliases also work: sonnet, claude (= sonnet45), gpt, openai (= gpt54)
- 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
- Use the short aliases (sonnet46, gpt55), never full model ids like claude-sonnet-4-6
- Validate backend strings against the FromStr list before launching long training/eval runs
- Pin provider/backend names in scripts when upgrading the CLI, since valid names change with model releases
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
- unknown provider `{provider}`. Valid options: mercury, zeta1
- unknown teacher backend or zeta format `{arg}`
- --languages and/or --extensions is required (use --list to s
- parse-output only supports Teacher and Zeta2 providers, got
- No existing predictions found. Use --provider to specify whi
AI-assisted analysis of zed-industries/zed@f4178619ac (2026-08-20).
Data as JSON: /api/errors/0d09e2d871e464e3.
Report an issue: GitHub.