{"record":{"id":"f7a7ca2d73da872f","repo":"zed-industries/zed","slug":"unknown-teacher-backend-or-zeta-format-arg","errorCode":null,"errorMessage":"unknown teacher backend or zeta format `{arg}`","messagePattern":"unknown teacher backend or zeta format `(.+?)`","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"crates/edit_prediction_cli/src/main.rs","lineNumber":562,"sourceCode":"        }\n    }\n}\n\nfn parse_teacher_args(arg: Option<&str>) -> Result<(TeacherBackend, ZetaFormat), anyhow::Error> {\n    let mut backend = TeacherBackend::default();\n    let mut format = ZetaFormat::default();\n\n    for arg in arg.unwrap_or_default().split(':') {\n        if arg.is_empty() {\n            continue;\n        }\n\n        if let Ok(parsed_backend) = TeacherBackend::from_str(arg) {\n            backend = parsed_backend;\n        } else if let Ok(parsed_format) = ZetaFormat::parse(arg) {\n            format = parsed_format;\n        } else {\n            anyhow::bail!(\"unknown teacher backend or zeta format `{arg}`\");\n        }\n    }\n\n    Ok((backend, format))\n}\n\nimpl Serialize for PredictionProvider {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: Serializer,\n    {\n        serializer.serialize_str(&self.to_string())\n    }\n}\n\nimpl<'de> Deserialize<'de> for PredictionProvider {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where","sourceCodeStart":544,"sourceCodeEnd":580,"githubUrl":"https://github.com/zed-industries/zed/blob/f4178619acd0d47ea1f76a2025c42962c6d6638c/crates/edit_prediction_cli/src/main.rs#L544-L580","documentation":"Thrown by parse_teacher_args (main.rs), which parses the colon-separated suffix of teacher provider strings. Each non-empty segment must parse either as a TeacherBackend (sonnet45/sonnet46/gpt52/gpt54/gpt55 and aliases) or as a ZetaFormat version; segments that parse as neither bail here. The loop builds a (TeacherBackend, ZetaFormat) pair, defaulting both beforehand, so unknown segments mean the user asked for something that does not exist.","triggerScenarios":"Passing --provider teacher:sonnet47 or teacher:V9999_Bogus — the segment after ':' fails both TeacherBackend::from_str and ZetaFormat::parse. Also triggered by stray segments like teacher:sonnet46:extra, or separators other than ':' (teacher-sonnet46 makes the whole string an unknown root provider, error 225 instead).","commonSituations":"Guessing a newer model alias before it is added to TeacherBackend; pasting a zeta version string from a different branch; mixing up which side of the provider string carries the backend vs the format.","solutions":["Use a valid backend segment: sonnet45, sonnet46, gpt52, gpt54, gpt55 (aliases sonnet/claude/gpt/openai also parse)","Use a zeta version exactly as printed by the provider error's 'Available zeta versions' list, e.g. teacher:sonnet46:ordered","Split multiple options with ':' only, and drop empty/unknown segments"],"exampleFix":"# before\n--provider teacher:claude-sonnet-4-6\n\n# after\n--provider teacher:sonnet46:ordered","handlingStrategy":"validation","validationCode":"fn teacher_args_are_valid(spec: &str) -> bool {\n    spec.split(':')\n        .filter(|seg| !seg.is_empty())\n        .all(|seg| TeacherBackend::from_str(seg).is_ok() || ZetaFormat::parse(seg).is_ok())\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Split teacher provider specs on ':' and validate each segment as a backend or a zeta version before running","Copy zeta version strings verbatim from the 'Available zeta versions' list in the provider error","Order and duplication do not matter (later segments override), but every segment must parse"],"tags":["rust","cli","enum-parsing","edit-prediction"],"backgroundTag":"invalid-argument-value","analyzedSha":"f4178619acd0d47ea1f76a2025c42962c6d6638c","analyzedAt":"2026-08-20T19:29:52.058Z","schemaVersion":2},"datasetVersion":"2026-08-26T04:18:47.238Z"}