SDKGen
Multi-language SDK Generator from OpenAPI Specifications
Type-safe • Async-first • Made for developers
Quick Start • Features • Documentation • Contributing
✨ Features
- 🚀 Multi-language support - Python (TypeScript, Go, Rust planned)
- 🎯 Type-safe - Full type hints and TypedDict support
- ⚡ Async-first - Modern async patterns with httpx
- 🧩 Complete OpenAPI 3.x - $ref resolution, allOf/oneOf/anyOf, discriminators
- 📦 Clean SDK structure - Dataclass-based, resource-oriented
- 🔧 Smart method naming - Intelligent CRUD + RPC action detection
- 🌐 Namespace support - API versioning (v1, v2, beta)
- 🔐 Auth built-in - Bearer, API Key, OAuth2
📦 Installation
# Install from PyPI
pip install sdkgen
# Or using uv (recommended)
uv pip install sdkgen
# For development
git clone https://github.com/4thel00z/sdkgen
cd sdkgen
uv install
⚙️ Configuration
SDKGen works with any OpenAPI 3.x specification:
# From local file
sdkgen generate -i openapi.yaml -o ./my-sdk -l python
# From URL
sdkgen generate -i https://api.example.com/openapi.json -o ./my-sdk
# With custom package name
sdkgen generate -i spec.yaml -o ./sdk --package-name my_custom_sdk
🚀 Quick Start
1. Generate SDK from OpenAPI Spec
# Generate Python SDK
sdkgen generate \
--input https://api.example.com/openapi.yaml \
--output ./my-sdk \
--language python \
--package-name my_api_sdk
2. Use Generated SDK
import asyncio
from my_sdk import Client
async def main():
# Initialize client (reads from environment variables)
client = Client(
base_url="https://api.example.com",
api_key="your-api-key"
)
# List resources with type-safe parameters
users = await client.v1.users.list(page=0, size=10)
print(f"Found {len(users)} users")
# Create resource
user = await client.v1.users.create(
name="John Doe",
email="john@example.com"
)
# Get by ID
user = await client.v1.users.get(user_id="123")
# Update
updated = await client.v1.users.update(
user_id="123",
name="Jane Doe"
)
# Delete
await client.v1.users.delete(user_id="123")
# RPC-style actions
pdf = await client.v1.files.download(file_id="abc")
asyncio.run(main())
🎯 Generated SDK Structure
SDKGen creates clean, maintainable SDK code:
my_sdk/
├── __init__.py
├── client.py # Main Client dataclass
├── models.py # TypedDict models + converters
├── utils.py # Utility functions
└── resources/
├── __init__.py
├── v1.py # V1 namespace
├── users.py # Users resource
└── files.py # Files resource
🛡️ Type Safety
Generated SDKs use TypedDict for full type safety:
from my_sdk.models import CreateUserInput, User
# Type-safe input (IDE autocomplete works!)
user_data: CreateUserInput = {
"name": "John",
"email": "john@example.com",
"age": 30 # Optional field
}
user: User = await client.v1.users.create(**user_data)
📚 API Resources
Supported OpenAPI Features
- ✅ $ref resolution (local and remote with caching)
- ✅ Schema composition (allOf, oneOf, anyOf)
- ✅ Discriminators for polymorphic types
- ✅ Path, query, header, cookie parameters
- ✅ Request bodies (JSON, form-data, multipart, binary)
- ✅ Multiple response types
- ✅ Authentication schemes (Bearer, API Key, OAuth2)
- ✅ Tags for resource grouping
- ✅ API versioning namespaces (v1, beta)
- ✅ Enums (string and integer)
- ✅ Nested resources
- ✅ Pagination patterns
Method Naming Intelligence
SDKGen uses a 3-priority system for clean, intuitive method names:
- Clean operationId - Extracts from OpenAPI operationId
- RPC-style actions - Detects 35+ action verbs (download, activate, export, etc.)
- HTTP method + response - Smart CRUD naming based on method and response type
Examples:
POST /api/v1/users→client.v1.users.create()GET /api/v1/users(array) →client.v1.users.list()GET /api/v1/users/{id}(object) →client.v1.users.get(id)GET /api/v1/files/{id}/download→client.v1.files.download(id)GET /health→client.health()
🧪 Testing
# Validate OpenAPI spec
sdkgen validate -i openapi.yaml
# Show intermediate representation (debug)
sdkgen show-ir -i openapi.yaml
# Generate and test
sdkgen generate -i spec.yaml -o ./test-sdk
cd test-sdk && python -m py_compile **/*.py
# Run end-to-end test (starts API, generates SDK, tests it)
make test-e2e
🔧 Development
# See all available commands
make help
# Install dependencies
make dev
# Run all quality checks
make check
# Format code
make format
# Run linter
make lint
# Type check
make typecheck
# Test SDK generation
make test-sdk
📖 Documentation
- Architecture - System design and patterns
- Usage Guide - Comprehensive usage documentation
- Agent Guidelines - For AI agents working on this project
- Contributing - How to contribute
- API Reference - Generated SDK API reference
🤝 Contributing
Contributions welcome! See CONTRIBUTING.md for guidelines.
# Quick start
make dev
make check
📄 License
MIT License - see LICENSE file for details.
Built with ❤️ for the developer community
Metadata
Release files for sdkgen 0.2.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 | |
|---|---|---|---|
| sdkgen-0.2.0.tar.gz | 98.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sdkgen-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 140.8 kB
Release files / sdkgen-0.2.0.tar.gz
| Download URL | sdkgen-0.2.0.tar.gz |
|---|---|
| Size | 98.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fb903e4fc1a92dcb7753ae389d7560a813a314d261a90986584ee081e5cd91de
|
|
BLAKE2b-256 checksum How to use checksums |
41efd9616959936ec24c7f010b39c2218e7e8be3f81c9c5e0767b0ab9606fa84
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / sdkgen-0.2.0-py3-none-any.whl
| Download URL | sdkgen-0.2.0-py3-none-any.whl |
|---|---|
| Size | 42.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ee8312e0dc7a7130c85497484b7fd92eb18efda3b9392ca27a5fa197df20bed8
|
|
BLAKE2b-256 checksum How to use checksums |
a1902156442150d2f15783cb0a64eaa8fcc3c38a980cdb73dd12044e745d9a26
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|