A Python SDK library for the NovelAI API with validation powered by Pydantic
Project description
NovelAI Python SDK
A modern, type-safe Python SDK for NovelAI's image generation API. Features robust validation with Pydantic v2 and complete type hints.
Features
- Python 3.10+ with full type hints and Pydantic v2 validation
- High-level convenience API with automatic validation
- Built-in PIL/Pillow support for easy image operations
- SSE streaming for real-time progress monitoring
- Precise reference(Character reference), ControlNet, and multi-character positioning
Comparison with Alternatives
| Feature | novelai-sdk | novelai-api | novelai-python |
|---|---|---|---|
| Type Safety (Pydantic v2) | ✅ | ❌ | ✅ |
| Async Support | ✅ | ✅ | ✅ |
| Image Generation | ✅ | ✅ | ✅ |
| Text Generation | 🚧 | ✅ | ✅ |
| Precise Reference(Character Reference) | ✅ | ❌ | ❌ |
| Multi-Character Positioning | ✅ | ❌ | ✅ |
| ControlNet / Vibe Transfer | ✅ | ❌ | ✅ |
| SSE Streaming | ✅ | ❌ | ✅ |
| Python 3.10+ | ✅ | ❌ | ❌ |
| Active Maintenance | ✅ | ✅ | ⚠️ |
✅ Supported | ❌ Not supported | 🚧 Planned | ⚠️ Limited maintenance
Documentation
For detailed guides and advanced usage, visit our Documentation Site.
Quick Start
Installation
# Using pip
pip install novelai-sdk
# Using uv (recommended)
uv add novelai-sdk
Basic Usage
from novelai import NovelAI
from novelai.types import GenerateImageParams
# Initialize client (API key from NOVELAI_API_KEY environment variable)
client = NovelAI()
# Generate an image
params = GenerateImageParams(
prompt="1girl, cat ears, masterpiece, best quality",
model="nai-diffusion-4-5-full",
size="portrait", # or (832, 1216)
steps=23,
scale=5.0,
)
images = client.image.generate(params)
images[0].save("output.png")
CLI Usage
# Basic generation
python -m novelai "1girl, cat ears, maid" -o output.png
# Interactive mode
python -m novelai --interactive --model nai-diffusion-4-5-full
# Generate from request JSON (high-level params)
python -m novelai --request-json examples/request_user.json -o output
# Generate from request JSON (stdin)
cat examples/request_user.json | python -m novelai --request-json-stdin -o output
Authentication
Provide your NovelAI API key via environment variable or direct initialization:
# Using .env file (recommended)
from dotenv import load_dotenv
load_dotenv()
client = NovelAI()
# Environment variable
import os
os.environ["NOVELAI_API_KEY"] = "your_api_key_here"
client = NovelAI()
# Direct initialization
client = NovelAI(api_key="your_api_key_here")
Data Model Architecture
The library is designed with two distinct layers of data models:
- User Model (Recommended): User-friendly models with sensible defaults and automatic validation.
- API Model: Direct 1:1 mapping to NovelAI's API endpoints, primarily used internally.
High-Level API
from novelai import NovelAI
from novelai.types import GenerateImageParams
client = NovelAI()
params = GenerateImageParams(
prompt="a beautiful landscape",
model="nai-diffusion-4-5-full",
size="landscape",
quality=True,
)
images = client.image.generate(params)
Advanced Features
Character Reference
Maintain consistent character appearances with reference images:
from novelai.types import CharacterReference
character_references = [
CharacterReference(
image="reference.png",
type="character",
fidelity=0.75,
)
]
params = GenerateImageParams(
prompt="1girl, standing",
model="nai-diffusion-4-5-full",
character_references=character_references,
)
Multi-Character Positioning
Position multiple characters individually with separate prompts:
from novelai.types import Character
characters = [
Character(
prompt="1girl, red hair, blue eyes",
enabled=True,
position=(0.2, 0.5),
),
Character(
prompt="1boy, black hair, green eyes",
enabled=True,
position=(0.8, 0.5),
),
]
params = GenerateImageParams(
prompt="two people standing",
model="nai-diffusion-4-5-full",
characters=characters,
)
ControlNet (Vibe Transfer)
Control composition and pose with reference images:
from novelai.types import ControlNet, ControlNetImage, GenerateImageParams
controlnet_image = ControlNetImage(image="pose_reference.png", strength=0.6)
controlnet = ControlNet(images=[controlnet_image])
params = GenerateImageParams(
prompt="1girl, standing",
model="nai-diffusion-4-5-full",
controlnet=controlnet,
)
Streaming Generation
Monitor generation progress in real-time:
from novelai.types import GenerateImageStreamParams
from base64 import b64decode
params = GenerateImageStreamParams(
prompt="1girl, standing",
model="nai-diffusion-4-5-full",
stream="sse",
)
for chunk in client.image.generate_stream(params):
image_data = b64decode(chunk.image)
print(f"Received {len(image_data)} bytes")
Image-to-Image
Transform existing images with text prompts:
from novelai.types import GenerateImageParams, I2iParams
i2i_params = I2iParams(
image="input.png",
strength=0.5, # 0.0-1.0
noise=0.0,
)
params = GenerateImageParams(
prompt="cyberpunk style",
model="nai-diffusion-4-5-full",
i2i=i2i_params,
)
Batch Generation
Generate multiple variations efficiently:
params = GenerateImageParams(
prompt="1girl, various poses",
model="nai-diffusion-4-5-full",
n_samples=4,
)
images = client.image.generate(params)
for i, img in enumerate(images):
img.save(f"output_{i}.png")
Estimate Anlas
Estimate the generation cost before sending the request:
from novelai.types import GenerateImageParams
params = GenerateImageParams(
prompt="1girl, night city",
model="nai-diffusion-4-5-full",
size=(1024, 1024),
steps=28,
)
estimate = params.calculate_anlas(is_opus=True)
print(estimate.total_anlas)
calculate_anlas() is a best-effort estimate based on the current web UI and
documentation. It is useful for previews, but it is not guaranteed to be a
100% accurate billing source of truth.
Examples
For practical usage examples, see the Examples Documentation or the examples/ directory.
Roadmap
- Async support
- FastAPI integration example
- Vibe transfer file support (
.naiv4vibe,.naiv4vibebundle) - Anlas consumption calculator
- Image metadata extraction
- Text generation API support
Development
Setup
git clone https://github.com/caru-ini/novelai-sdk.git
cd novelai-sdk
uv sync
Code Quality
# Format code
uv run poe fmt
# Lint code
uv run poe lint
# Type checking
uv run poe check
# Install poe globally for easier access
uv tool install poe
# Run all checks before committing
uv run poe pre-commit
Testing
Tests will be added in future releases.
Requirements
- Python 3.10+
- httpx (HTTP client)
- Pillow (image processing)
- Pydantic v2 (validation and type safety)
- python-dotenv (environment variables)
- rich (CLI output rendering)
Contributing
Contributions are welcome. For major changes, please open an issue first.
Please see CONTRIBUTING.md for details on how to contribute, including development setup, code quality checks, and pull request guidelines.
{feat|fix|docs|style|refactor|test|chore}: Short description
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Run code quality checks (
uv run poe pre-commit) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
License
MIT License. See LICENSE file for details.
Links
Disclaimer
This is an unofficial client library. Not affiliated with NovelAI. Requires an active NovelAI subscription.
Acknowledgments
Thanks to the NovelAI team and all contributors.
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 novelai_sdk-0.9.0.tar.gz.
File metadata
- Download URL: novelai_sdk-0.9.0.tar.gz
- Upload date:
- Size: 1.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
02c33e4aa950766bce5126ae48fea2d29aa210ea63d515e924a726194750fda7
|
|
| MD5 |
9f15efa6571503262da5e1ea5d54e5aa
|
|
| BLAKE2b-256 |
97595c0bcac4d65f3d798122402758019323ae973ed0cd841b33293c97a45be3
|
Provenance
The following attestation bundles were made for novelai_sdk-0.9.0.tar.gz:
Publisher:
ci.yaml on caru-ini/novelai-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
novelai_sdk-0.9.0.tar.gz -
Subject digest:
02c33e4aa950766bce5126ae48fea2d29aa210ea63d515e924a726194750fda7 - Sigstore transparency entry: 1614107748
- Sigstore integration time:
-
Permalink:
caru-ini/novelai-sdk@39e6522c50a3c36ad0e01b8f84ad072690841551 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/caru-ini
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@39e6522c50a3c36ad0e01b8f84ad072690841551 -
Trigger Event:
push
-
Statement type:
File details
Details for the file novelai_sdk-0.9.0-py3-none-any.whl.
File metadata
- Download URL: novelai_sdk-0.9.0-py3-none-any.whl
- Upload date:
- Size: 47.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2710071db155e1f9f41859d41b2580a905ecd46ba30cfda416bfb53c8280c6af
|
|
| MD5 |
d16fe2220f46b9bbc976ddacaea0f6e4
|
|
| BLAKE2b-256 |
f93c3ee83601ce8f91edf816f431b5c2d7ccfa837ba86b1e24954cf46661ee94
|
Provenance
The following attestation bundles were made for novelai_sdk-0.9.0-py3-none-any.whl:
Publisher:
ci.yaml on caru-ini/novelai-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
novelai_sdk-0.9.0-py3-none-any.whl -
Subject digest:
2710071db155e1f9f41859d41b2580a905ecd46ba30cfda416bfb53c8280c6af - Sigstore transparency entry: 1614107809
- Sigstore integration time:
-
Permalink:
caru-ini/novelai-sdk@39e6522c50a3c36ad0e01b8f84ad072690841551 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/caru-ini
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@39e6522c50a3c36ad0e01b8f84ad072690841551 -
Trigger Event:
push
-
Statement type: