Jambo - JSON Schema to Pydantic Converter
Swiss AI Hub fork. This is a fork of
jambo(MIT, by Vitor Hideyoshi) published asswiss-ai-hub-jamboand imported asswiss_ai_hub.jambo. It adds binary and file-path string-format support on top of upstream. The API is otherwise identical — the upstream docs apply.
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 validation features.
Created to simplify 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 swiss-ai-hub-jambo
🚀 Usage
There are two ways to build models with Jambo:
- The original static API:
SchemaConverter.build(schema)doesn't persist any reference cache between calls and doesn't require any configuration. - The new instance API: use a
SchemaConverter()instance and callbuild_with_cache, which exposes and persists a reference cache and helper methods.
The instance API is useful when you want to reuse generated subtypes, inspect cached models, or share caches between converters; all leveraging namespaces via the $id property in JSON Schema. See the docs for full details: https://jambo.readthedocs.io/en/latest/usage.ref_cache.html
Static (compatibility) example
from swiss_ai_hub.jambo import SchemaConverter
schema = {
"title": "Person",
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"},
},
"required": ["name"],
}
# Old-style convenience API (kept for compatibility)
Person = SchemaConverter.build(schema)
obj = Person(name="Alice", age=30)
print(obj)
Instance API (recommended for cache control)
from swiss_ai_hub.jambo import SchemaConverter
converter = SchemaConverter()
schema = {
"title": "Person",
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"},
"address": {"type": "object", "properties": {"street": {"type": "string"}}},
},
"required": ["name"],
}
# build_with_cache populates the converter's instance-level ref cache
Person = converter.build_with_cache(schema)
# you can retrieve cached subtypes by name/path
cached_person = converter.get_cached_ref("Person")
# clear the instance cache when needed
converter.clear_ref_cache()
✅ 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 swiss_ai_hub.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 swiss_ai_hub.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 swiss_ai_hub.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 swiss_ai_hub.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 tests
Or 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.
Metadata
Release files for swiss-ai-hub-jambo 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| swiss_ai_hub_jambo-0.5.0.tar.gz | 138.8 kB | Without provenance | Details for swiss_ai_hub_jambo-0.5.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| swiss_ai_hub_jambo-0.5.0-py3-none-any.whl | Python 3 | none | any | Details for swiss_ai_hub_jambo-0.5.0-py3-none-any.whl |
Total release size: 164.1 kB
Release files / swiss_ai_hub_jambo-0.5.0.tar.gz
| Download URL | swiss_ai_hub_jambo-0.5.0.tar.gz |
|---|---|
| Size | 138.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7a5bebc9f894196045094823e2f7bebacfbd7f62ea81e5ecd8a9a6b52a6b5651
|
|
BLAKE2b-256 checksum How to use checksums |
c43079b00ac8f4f1fd696b1f8ebfd60ce5825d7f5dd3d1284cd80a023f729010
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.15 {"installer":{"name":"uv","version":"0.9.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / swiss_ai_hub_jambo-0.5.0-py3-none-any.whl
| Download URL | swiss_ai_hub_jambo-0.5.0-py3-none-any.whl |
|---|---|
| Size | 25.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7fe7fdd467b4b4ab27433646a9743c956f9b1a834b2a231b0052911a30bb15ba
|
|
BLAKE2b-256 checksum How to use checksums |
d7fbf96e2d8382b6e3aa2584e6d230ff186f8054384adec7179718c13596932c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.15 {"installer":{"name":"uv","version":"0.9.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for swiss-ai-hub-jambo 0.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.