BoundaryML/baml · critical
pythonize_checks
Error message
pythonize_checks
What it means
In pythonize_strict (Rust/PyO3), when an LLM response value has checks, the code calls pythonize_checks to build Python validation expressions and unwraps with expect("pythonize_checks"). A panic here means check generation failed — typically the Checked class or model_validate target is missing/misconfigured in the BAML Python runtime.
Solutions
- Reinstall/upgrade the baml Python package so baml_py.Checked exists
- Align BAML client codegen version with the engine version
- Remove or fix custom checks in the BAML schema causing generation failure
- File a bug with the schema if pythonize_checks panics on valid input
Defensive patterns
Strategy: type-guard
Validate before calling
import baml_py assert hasattr(baml_py, "Checked"), "baml runtime missing Checked support"
Type guard
def runtime_supports_checks() -> bool:
import baml_py
return hasattr(baml_py, "Checked") Prevention
- Keep engine and baml-py versions in lockstep
- Regenerate clients after upgrades
- Test check-bearing schemas in CI
- Avoid hand-editing generated client modules
When it happens
Trigger: Parsing an LLM response that includes checks when the corresponding Python module lacks the expected Checked infrastructure, or cls_module/model_validate_method is invalid.
Common situations: Mismatched baml-py runtime and Rust client versions; custom class modules that don't provide Checked; corrupted or partial installation of the baml package.
Understand the failure class
Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.
Related errors
- get_item
- getattr(Checked)
- PyTuple::new
- ai.Prompt._data must contain baml_builtins2::PromptAst
- ai.Prompt.messages receiver must be an ai.Prompt instance
AI-assisted analysis of BoundaryML/baml@bd85ce9dee (2026-09-12).
Data as JSON: /api/errors/36bf93f8801bc87a.
Report an issue: GitHub.
Appendix: source
Thrown at engine/language_client_python/src/types/function_results.rs:313
Ok(instance.into())
}
BamlValueWithMeta::Null(_) => Ok(py.None()),
}?;
let ResponseValueMeta(_, checks, completion_state, _) = meta;
if checks.is_empty() && !completion_state.display {
return Ok(py_value_without_constraints);
}
// Import the necessary modules and objects
let typing = py.import("typing").expect("typing");
let literal = typing.getattr("Literal").expect("Literal");
let value_with_possible_checks = if !checks.is_empty() {
// Generate the Python checks
let python_checks = pythonize_checks(py, cls_module, &checks, model_validate_method)
.expect("pythonize_checks");
// Get the type of the original value
let value_type = py_value_without_constraints.bind(py).get_type();
// Collect check names as &str and turn them into a Python tuple
let check_names: Vec<&str> = checks.iter().map(|check| check.name.as_str()).collect();
let literal_args = PyTuple::new(py, check_names)?;
// Call Literal[...] dynamically
let literal_check_names = literal.get_item(literal_args).expect("get_item");
let class_checked_type_constructor =
cls_module.getattr("Checked").expect("getattr(Checked)");
// Prepare type parameters for Checked[...]
let type_parameters_tuple =
PyTuple::new(py, [value_type.as_ref(), &literal_check_names]).expect("PyTuple::new");
View on GitHub (pinned to bd85ce9dee)