Jambo - JSON Schema to Pydantic Converter
Jambo is a Python package that automatically converts JSON Schema definitions into Pydantic models.
It's designed to streamline schema validation and enforce type safety using Pydantic's powerful validation features.
Created to simplifying the process of dynamically generating Pydantic models for AI frameworks like LangChain, CrewAI, and others.
โจ Features
- โ Convert JSON Schema into Pydantic models dynamically;
- ๐ Supports validation for:
- strings
- integers
- floats
- booleans
- arrays
- nested objects
- allOf
- anyOf
- oneOf
- ref
- enum
- const
- โ๏ธ Enforces constraints like
minLength,maxLength,pattern,minimum,maximum,uniqueItems, and more; - ๐ฆ Zero config โ just pass your schema and get a model.
๐ฆ Installation
pip install jambo๐ Usage
from jambo import SchemaConverter
schema = {
"title": "Person",
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"},
},
"required": ["name"],
}
Person = SchemaConverter.build(schema)
obj = Person(name="Alice", age=30)
print(obj)โ Example Validations
Following are some examples of how to use Jambo to create Pydantic models with various JSON Schema features, but for more information, please refer to the documentation.
Strings with constraints
from jambo import SchemaConverter
schema = {
"title": "EmailExample",
"type": "object",
"properties": {
"email": {
"type": "string",
"minLength": 5,
"maxLength": 50,
"pattern": r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$",
},
},
"required": ["email"],
}
Model = SchemaConverter.build(schema)
obj = Model(email="user@example.com")
print(obj)Integers with bounds
from jambo import SchemaConverter
schema = {
"title": "AgeExample",
"type": "object",
"properties": {
"age": {"type": "integer", "minimum": 0, "maximum": 120}
},
"required": ["age"],
}
Model = SchemaConverter.build(schema)
obj = Model(age=25)
print(obj)Nested Objects
from jambo import SchemaConverter
schema = {
"title": "NestedObjectExample",
"type": "object",
"properties": {
"address": {
"type": "object",
"properties": {
"street": {"type": "string"},
"city": {"type": "string"},
},
"required": ["street", "city"],
}
},
"required": ["address"],
}
Model = SchemaConverter.build(schema)
obj = Model(address={"street": "Main St", "city": "Gotham"})
print(obj)References
from jambo import SchemaConverter
schema = {
"title": "person",
"$ref": "#/$defs/person",
"$defs": {
"person": {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"},
"emergency_contact": {
"$ref": "#/$defs/person",
},
},
}
},
}
model = SchemaConverter.build(schema)
obj = model(
name="John",
age=30,
emergency_contact=model(
name="Jane",
age=28,
),
)๐งช Running Tests
To run the test suite:
poe testsOr manually:
python -m unittest discover -s tests -v๐ Development Setup
To set up the project locally:
- Clone the repository
- Install uv (if not already installed)
- Install dependencies:
uv sync- Set up git hooks:
poe create-hooks๐ Roadmap / TODO
- Better error reporting for unsupported schema types
๐ค Contributing
PRs are welcome! This project uses MIT for licensing, so feel free to fork and modify as you see fit.
๐งพ License
MIT License.