Unified multi-provider AI image generation library (Gemini, OpenAI, xAI)
Project description
pixbridge
Multi-provider AI image generation library supporting Gemini, OpenAI, and xAI.
Features
- Unified
ImageClientAPI across providers - Image generation from structured YAML prompts
- Style transfer (Gemini)
- Reference image support for identity consistency (Gemini)
- Consistency checking (generate N images from the same prompt for comparison)
- Image integrity checks (transparency, corruption, truncation)
- Thread-safe usage logging (JSONL)
Setup
uv sync
CLI
pixbridge providers # List available providers
pixbridge generate prompt.yaml # Generate from YAML prompt
pixbridge style-transfer img.png --style anime-dark
pixbridge consistency-check anime-dark -n 5
pixbridge check output/ # Check image integrity
Usage as library
from pixbridge.client import ImageClient
from pixbridge.models import ImagePrompt, GenerationNotes
client = ImageClient(provider="gemini")
prompt = ImagePrompt(
full_prompt="A mountain landscape at sunset",
generation_notes=GenerationNotes(
aspect_ratio="16:9",
key_requirements=["photorealistic"],
),
)
path = client.generate_image(prompt, output_dir="output")
Providers
| Provider | Models | Style Transfer | Reference Images |
|---|---|---|---|
| Gemini | gemini-3-pro-image-preview | yes | yes |
| OpenAI | gpt-image-2 (default), gpt-image-1.5, gpt-image-1, gpt-image-1-mini | no | no |
| xAI | grok-imagine-image | no | no |
Any model can be selected at runtime with --model. The CLI also accepts size presets 720p, 1080p, 2160p, or a raw WxH string (resolved per-provider). OpenAI (gpt-image-2) validates sizes by rule — any WxH where both dimensions are divisible by 16, the ratio is within [1:3, 3:1], and max(W, H) ≤ 3840 — so true 9:16 (1152x2048) and 16:9 (2048x1152) work; 1024x1024, 1024x1536, 1536x1024, 2560x1440, 3840x2160 are recommended values surfaced for autocompletion.
Provider capability surface
Each provider exposes a uniform capability surface via provider.capabilities (a ProviderCapabilities), so callers can reason about size rules without branching on the provider name:
| Method | Returns | OpenAI | Gemini / Vertex | xAI |
|---|---|---|---|---|
validate_size(size) |
raises ValueError if invalid |
rule-based (÷16, ratio, max-dim) | must be 1K/2K |
no-op (unconstrained) |
recommended_sizes() |
list[str] for docs/autocomplete |
7 sizes incl. true 9:16/16:9 | ["1K", "2K"] |
[] |
aspect_to_size(ratio) |
str | None (named ratio → WxH) |
e.g. "9:16" → "1152x2048" |
None (ratio passed to API) |
None |
max_dim() |
int | None (px ceiling) |
3840 |
None |
None |
native_size(w, h) |
str | None (raw WxH → native size) |
validates + passes WxH through |
buckets to 1K/2K |
None |
To read a provider's capabilities without instantiating it or supplying credentials (e.g. for offline size resolution), use the registry:
from pixbridge.providers import get_capabilities
caps = get_capabilities("openai") # also "gemini", "xai", "vertex"; None if unknown
caps.validate_size("1152x2048") # passes; raises ValueError on invalid sizes
caps.native_size(2048, 1152) # -> "2048x1152"
get_capabilities("vertex") returns Gemini's surface (Vertex shares it) and never requires GOOGLE_CLOUD_PROJECT.
Configuration
Per-provider defaults live in model_config.yaml (auto-discovered from the current working directory, or pass --config path/to/file.yaml). Resolution order: --model CLI flag > config file > hardcoded provider default.
providers:
openai:
default_model: gpt-image-2
gemini:
default_model: gemini-3.1-flash-image-preview
Testing
just test
Contributing
Contributions are welcome — see CONTRIBUTING.md for the development setup and PR guidelines. To report a security issue, see SECURITY.md.
License
Licensed under the Apache License 2.0. See the NOTICE file for attribution requirements.
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 pixbridge-0.1.0.tar.gz.
File metadata
- Download URL: pixbridge-0.1.0.tar.gz
- Upload date:
- Size: 63.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","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 |
42b5b257b723c26cc0764cc12a47e83b56b09f77e8d1a503af13cbfe40e55a59
|
|
| MD5 |
84bc38d73d177e7ac0a0f8c7f1571f5b
|
|
| BLAKE2b-256 |
493e8d1b66d372e53093ff13a2de5885fc2f8517a1ec76ff0ef68eeabcdbb7a5
|
File details
Details for the file pixbridge-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pixbridge-0.1.0-py3-none-any.whl
- Upload date:
- Size: 40.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","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 |
86dd9109867fbb71b739b2cc216ff439296d0436acf8d9c21204d856cc0642c6
|
|
| MD5 |
5cc68c7c9ac79dd2f82bd54368e79b71
|
|
| BLAKE2b-256 |
a389003a5dbcf9d3fbbab760297d369ce3dd6d654ceb866534df7a8cb4695314
|