{"record":{"id":"d3e97fe556ed928b","repo":"BoundaryML/baml","slug":"args-must-be-a-map","errorCode":null,"errorMessage":"args must be a map","messagePattern":"args must be a map","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"engine/baml-lib/jinja-runtime/src/lib.rs","lineNumber":639,"sourceCode":"//                 minijinja_err += &format!(\"\\n\\ncaused by: {next_err:#}\");\n//                 err = next_err;\n//             }\n\n//             anyhow::bail!(\"Error occurred while rendering prompt: {minijinja_err}\");\n//         }\n//     }\n// }\n\npub fn render_prompt(\n    template: &str,\n    args: &BamlValue,\n    ctx: RenderContext,\n    template_string_macros: &[TemplateStringMacro],\n    ir: &IntermediateRepr,\n    env_vars: &HashMap<String, String>,\n) -> anyhow::Result<RenderedPrompt> {\n    if !matches!(args, BamlValue::Map(_)) {\n        anyhow::bail!(\"args must be a map\");\n    }\n    let eval_ctx = EvaluationContext::new(env_vars, false);\n    let minijinja_args: minijinja::Value = args.clone().to_minijinja_value(ir, &eval_ctx);\n    let default_role = ctx.client.default_role.clone();\n    let allowed_roles = ctx.client.allowed_roles.clone();\n    let remap_role = ctx.client.remap_role.clone();\n    let enum_values_by_name = ir\n        .walk_enums()\n        .map(|e| {\n            let enum_name = e.name().to_string();\n            let enum_values = e\n                .walk_values()\n                .map(|v| MinijinjaBamlEnumValue {\n                    value: v.name().to_string(),\n                    alias: v.alias(&eval_ctx).unwrap_or(None),\n                    enum_name: enum_name.clone(),\n                })\n                .collect::<Vec<_>>();","sourceCodeStart":621,"sourceCodeEnd":657,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/baml-lib/jinja-runtime/src/lib.rs#L621-L657","documentation":"The public render_prompt entry point requires its `args` parameter (the variables exposed to the template) to be a BamlValue::Map. Any other BamlValue variant — list, string, null, etc. — is rejected immediately with this anyhow bail before any rendering happens.","triggerScenarios":"Calling render_prompt (directly or via render_chat/render_completion/render_image helpers) with args constructed as a non-map BamlValue, or passing null/None where a map of named template variables is expected.","commonSituations":"Programmatic/SDK use where args are built dynamically and end up as a list or scalar; forgetting to wrap variables in a named map; deserializing args from JSON that is an array rather than an object.","solutions":["Wrap template variables in a named map: {\"var1\": value1, \"var2\": value2} before calling render_prompt.","If args come from JSON, ensure the top level is an object `{...}`, not an array or scalar.","Check helper wrappers (render_chat, render_completion) to confirm they are passed a map, not raw values."],"exampleFix":"// before\nlet args = BamlValue::List(vec![...]);\nrender_prompt(ctx, &args, ...)\n\n// after\nlet args = BamlValue::Map(vec![(\"name\".into(), BamlValue::String(\"world\".into()))].into_iter().collect());\nrender_prompt(ctx, &args, ...)","handlingStrategy":"type-guard","validationCode":"// ensure args is a map/object before calling render_prompt\nif (args === null || typeof args !== \"object\" || Array.isArray(args)) throw new Error(\"args must be a named map of template variables\");","typeGuard":"function isArgsMap(v) { return v !== null && typeof v === \"object\" && !Array.isArray(v); }","tryCatchPattern":"match render_prompt(ctx, &args, ...) { Err(e) if e.to_string().contains(\"args must be a map\") => { /* fix caller */ }, Err(e) => return Err(e) }","preventionTips":["Always construct args as a named map/object of variables.","When loading args from JSON, require a top-level object.","Wrap args construction in a helper that enforces the map shape."],"tags":["api","argument-validation","rust","prompt-rendering"],"backgroundTag":"invalid-argument-value","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}