Ozwald is a multi-tool for container provisioning.
Project description
Ozwald
There is a chasm between being an LLM consumer and being an enterprise "LLM puppeteer." Enterprises have the talent and capital to stitch together game-changing AI services; small businesses and individual developers simply don't.
Ozwald is an effort to bridge that void and unlock the multiverse of opportunity that AI-enabled services represent for smaller teams/budgets.
Current status
Right now, Ozwald is a provisioner for container-based systems, with a primary focus on making the provisioner useful for my own AI experiments first.
The goal is to move the project toward closing the gap between the casual LLM user and the enterprise-scale orchestrator. It's about making it possible to give a machine a well-defined task in a narrow domain and having it simply "do the thing."
Ozwald handles the real-world friction of provisioning LLM containers across mixed hardware (different GPUs or CPU-only) with varying runtime parameters. It focuses on the glue: a small, well-typed config, a provisioner API, and a CLI to make starting and stopping services predictable.
Key Ideas
- Varieties and Profiles: A clear model for describing services across different hardware (nvidia, amdgpu, cpu-only) and parameter sets that specify model type, context window size, etc.
- ** CLI and API:** A simple CLI tool for iterating on service configurations and an API for changing the set of provisioned services.
Why not Docker or Docker Compose?
Calling raw docker commands in a bash script got to be tough to maintain after a time or two. Docker compose ended up being the sort of thing where I would need a large yaml file to configure a ton of very similar services or I would need a different yaml file for every configuration I might want to use.
Ozwald uses a similar configuration language to that of Docker Compose, but it's designed to be more expressive for defining AI-related services that perform predictably across mixed hardware.
Why not call external APIs?
Sometimes calling an external API isn't an option for cost, privacy, or lack of connectivity.
Ozwald is designed to be a standalone service that can run local LLMs and/or other containers in a predictable way that takes into account the available hardware.
With Ozwald, you will be able to build your own LLM-puppeteer apps in a way that can accommodate the variety of hardware and runtime parameters developers are asked to support.
Installation
Install Ozwald and/or add ozwald to your project's Python dependencies:
pip install ozwald
Ozwald can used as an API by another project (like an orchestrator service) or it can be invoked directly by end users.
Quick start
- Provide a settings file
Create a YAML configuration (settings.yml) that declares hosts,
provisioners, and services:
---
hosts:
- name: localhost
ip: 127.0.0.1
provisioners:
- name: local
host: localhost
cache:
type: redis
parameters:
host: ozwald-provisioner-redis
port: 6379
db: 0
services:
- name: qwen1.5-vllm
type: container
description: DeepSeek Qwen 1.5B via vLLM
varieties:
nvidia:
image: openai-api-vllm.nvidia
environment:
GPU: true
amdgpu:
image: openai-api-vllm.amdgpu
environment:
GPU: true
cpu-only:
image: openai-api-vllm.cpu-only
environment:
GPU: false
environment:
MODEL_NAME: deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
profiles:
no-gpu:
environment:
MAX_MODEL_LEN: 45000
fast-gpu:
environment:
GPU_MEMORY_UTILIZATION: 0.9
CPU_OFFLOAD_GB: ""
- Set the mandatory environment variables
The OZWALD_SYSTEM_KEY environment variable is required for authentication
between the CLI and the Provisioner API.
The OZWALD_PROVISIONER environment variable is required for the CLI to know
which provisioner to use (usually the name of the host or "localhost").
The OZWALD_FOOTPRINT_DATA environment variable is required for the CLI to
know where to store footprint data.
export OZWALD_SYSTEM_KEY="your-long-random-token"
export OZWALD_PROVISIONER="daneel"
export OZWALD_FOOTPRINT_DATA="/tmp/footprint.yml"
- Start the provisioner
Use the CLI to spin up the provisioner network and containers:
ozwald start_provisioner
ozwald footprint_services my_service[some_profile][some_variety]
ozwald status
- Call the API
Query configured or active services:
curl -H "Authorization: Bearer $OZWALD_SYSTEM_KEY" \
http://127.0.0.1:8000/srv/services/configured/
Configuration reference
hosts[]: Named machines and their IPs.provisioners[]: Defines where the provisioner runs and its state cache (Redis).services[]: Descriptions of services, including hardwarevarietiesand runtimeprofiles.
CLI usage
The ozwald command handles local development and inspection:
start_provisioner: Start local provisioner network and containers.stop_provisioner: Stop provisioner containers.status: Check provisioner health.list_active_services: See what's currently running.list_configured_services: See list of configured services.show_host_resources: Inspect CPU/RAM/GPU/VRAM.update_services: Update the desired set of services.footprint_services: Measure resource consumption of configured services.get_footprint_logs: Show footprint logs.get_service_launch_logs: Show service launch logs.get_service_logs: Show service logs.
Example:
ozwald start_provisioner
ozwald status
ozwald stop_provisioner
Provisioner API
All non-health endpoints require a bearer token:
Authorization: Bearer <OZWALD_SYSTEM_KEY>
GET /health: Basic health check (no auth required).GET /srv/services/active/: List services currently active or transitioning.POST /srv/services/active/update/: Update the desired set of services.GET /srv/host/resources: Structured summary of CPU, RAM, GPU, and VRAM.POST /srv/services/footprint: Queue a footprinting request.
Example:
curl -H "Authorization: Bearer $OZWALD_SYSTEM_KEY" \
http://127.0.0.1:8000/srv/services/active/
Roadmap
The provisioner is the first building block. The compass needle is pointing toward filling the void between LLM-consumer and LLM-enabled service:
- Multi-host Orchestration: Coordinating multiple provisioners.
- AI Pipelines: Composable services for ingest, chunking, and indexing.
- Declarative Ops: Dry-run planning and explainers for service changes.
License & Contributing
Ozwald is open source, designed for adoption while keeping the core free.
- The Core (AGPLv3): The Ozwald engine, orchestrator, and provisioner.
- Your Apps (Apache 2.0): Client SDKs and public interfaces. Build your proprietary apps without fear of being forced to open source them.
- Contributing: Requires a signed CLA to ensure sustainability.
For commercial licensing or questions, contact fred@frameworklabs.us.
Author: Fred McDavid
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ozwald-0.0.2.tar.gz.
File metadata
- Download URL: ozwald-0.0.2.tar.gz
- Upload date:
- Size: 51.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6662630b08ceb65c766eef2abd7245742705bfb0eb5b0ad77af6a957cbb99781
|
|
| MD5 |
9c95577786193521e25f5c6bf399dfe5
|
|
| BLAKE2b-256 |
598b6dfe1dbbd92db2c458f713641e7d23df264a511e3bfd7459e37b63ae336a
|
File details
Details for the file ozwald-0.0.2-py3-none-any.whl.
File metadata
- Download URL: ozwald-0.0.2-py3-none-any.whl
- Upload date:
- Size: 54.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4bf03032af150592955259f2825da4f3d0c58361679eadab499a39fba9cb994d
|
|
| MD5 |
ccb18a3b3cb5ffa08f552a9d5be3218a
|
|
| BLAKE2b-256 |
c5cc75e221b7bf479995cccca6253d42dc6768827192a1cf1fa70c93dbbce23f
|