{"record":{"id":"dd61bbdaea611075","repo":"BoundaryML/baml","slug":"env-get-argument-must-be-a-string","errorCode":null,"errorMessage":"env.get argument must be a string","messagePattern":"env\\.get argument must be a string","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/baml-compiler/src/thir/interpret.rs","lineNumber":1785,"sourceCode":"                        if args.len() != 1 {\n                            bail!(\"env.get expects exactly one argument\");\n                        }\n\n                        let key_val = expect_value(\n                            evaluate_expr(\n                                &args[0],\n                                scopes,\n                                thir,\n                                run_llm_function,\n                                watch_handler,\n                                function_name,\n                            )\n                            .await?,\n                        )?;\n\n                        let key = match key_val {\n                            BamlValueWithMeta::String(value, _) => value,\n                            _ => bail!(\"env.get argument must be a string\"),\n                        };\n\n                        let env_map = lookup(scopes, \"__env_vars__\")\n                            .ok_or_else(|| anyhow!(\"environment context missing\"))?;\n\n                        let map = match env_map {\n                            BamlValueWithMeta::Map(ref entries, _) => entries,\n                            _ => bail!(\"environment context corrupted\"),\n                        };\n\n                        if let Some(value) = map.get(&key) {\n                            return Ok(EvalValue::Value(value.clone()));\n                        } else {\n                            bail!(\"Environment variable '{}' not found\", key);\n                        }\n                    }\n                }\n","sourceCodeStart":1767,"sourceCodeEnd":1803,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/baml-compiler/src/thir/interpret.rs#L1767-L1803","documentation":"`env.get` evaluates its single argument and requires the resulting BAML value to be a `String`. Passing any other type (int, bool, list, map) bails with `env.get argument must be a string`, since environment variable names are looked up as string keys in the `__env_vars__` map.","triggerScenarios":"`env.get(123)` or `env.get(someNonStringValue)` — the key expression evaluates to a non-string BamlValue.","commonSituations":"Passing an integer constant or enum instead of a quoted name; the argument expression resolving to null/other type at runtime; forgetting quotes around the variable name.","solutions":["Pass a string literal, e.g. `env.get(\"MY_VAR\")`","Convert the value to a string before passing it to `env.get`","Check that any variable used as the key actually holds a string at runtime","Add a guard/`String()` conversion around dynamically computed keys"],"exampleFix":"// before\nlet v = env.get(42);\n// after\nlet v = env.get(\"PORT\");","handlingStrategy":"type-guard","validationCode":"// ensure the key is a string before calling env.get\nlet key = \"PORT\"; // string literal\nlet v = env.get(key);","typeGuard":"fn is_string(v: &BamlValue) -> bool { matches!(v, BamlValue::String(_)) }","tryCatchPattern":"// host-side\nmatch result {\n    Err(e) if e.to_string().contains(\"argument must be a string\") => {\n        // stringify the argument and retry\n    }\n    other => other?,\n}","preventionTips":["Always pass quoted names to env.get","Convert dynamic keys to strings first","Avoid numeric/enum constants as env keys"],"tags":["baml","env","type-mismatch","builtin"],"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-14T11:17:12.474Z"}