{"record":{"id":"f1a9875b6c5c59b1","repo":"BoundaryML/baml","slug":"default-role-must-be-in-allowed-roles-not-found-in","errorCode":null,"errorMessage":"default_role must be in allowed_roles: {}. Not found in {:?}","messagePattern":"default_role must be in allowed_roles: (.+?)\\. Not found in (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/baml-lib/llm-client/src/clientspec.rs","lineNumber":364,"sourceCode":"            .map(|remap| {\n                remap\n                    .iter()\n                    .map(|(k, v)| Ok((k.to_string(), v.resolve(ctx)?)))\n                    .collect::<Result<Vec<_>>>()\n            })\n            .transpose()?;\n\n        let remap: Option<HashMap<String, String>> = remap.map(|remap| {\n            remap\n                .into_iter()\n                .map(|(k, v)| (k.to_string(), v.to_string()))\n                .collect()\n        });\n\n        match (&allowed, &default) {\n            (Some(allowed), Some(default)) => {\n                if !allowed.contains(default) {\n                    return Err(anyhow::anyhow!(\"default_role must be in allowed_roles: {}. Not found in {:?}\", default, allowed));\n                }\n            }\n            (None, Some(default)) => {\n                match default.as_str() {\n                    \"system\" | \"user\" | \"assistant\" => {}\n                    _ => return Err(anyhow::anyhow!(\"default_role must be one of 'system', 'user' or 'assistant': {}. Please specify \\\"allowed_roles\\\" if you want to use other custom default role.\", default)),\n                }\n            }\n            _ => {}\n        }\n\n        match (&allowed, &remap) {\n            (Some(allowed), Some(remap)) => {\n                for k in remap.keys() {\n                    if !allowed.contains(k) {\n                        return Err(anyhow::anyhow!(\n                            \"remap_role must be in allowed_roles: {}. Not found in {:?}\",\n                            k,","sourceCodeStart":346,"sourceCodeEnd":382,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/baml-lib/llm-client/src/clientspec.rs#L346-L382","documentation":"When resolving a strategy/role-based client, if `default_role` is set it must appear in `allowed_roles`. If allowed_roles is absent, only system/user/assistant are permitted as defaults. Violating either rule raises this error.","triggerScenarios":"Setting `default_role \"tool\"` (or another custom role) without also specifying allowed_roles containing it; setting a default_role that is missing from the allowed_roles list.","commonSituations":"Building a role-playing/multi-LLM strategy client with custom chat roles and forgetting allowed_roles; renaming roles in allowed_roles but not updating default_role.","solutions":["Add the default role to allowed_roles in the client config.","Change default_role to one of the roles already in allowed_roles.","If the role is a standard one (system/user/assistant), drop allowed_roles and just use a standard role name."],"exampleFix":"// before\noptions {\n  default_role \"tool\"\n}\n// after\noptions {\n  allowed_roles [\"system\", \"user\", \"assistant\", \"tool\"]\n  default_role \"tool\"\n}","handlingStrategy":"validation","validationCode":"// before resolving\nif let Some(d) = &default_role {\n    let allowed = allowed_roles.as_deref().unwrap_or(&[\"system\",\"user\",\"assistant\"]);\n    if !allowed.contains(&d.as_str()) { eprintln!(\"default_role '{d}' not in allowed_roles {allowed:?}\"); }\n}","typeGuard":"fn valid_default(default: &str, allowed: Option<&[String]>) -> bool {\n    allowed.map_or(matches!(default, \"system\" | \"user\" | \"assistant\"), |a| a.iter().any(|r| r == default))\n}","tryCatchPattern":null,"preventionTips":["Whenever using custom roles, always define allowed_roles alongside default_role.","Keep allowed_roles and default_role in sync — update both together.","Add a config lint step asserting default_role is a member of allowed_roles."],"tags":["strategy","roles","config-validation"],"backgroundTag":"invalid-config-value","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}