Skip to main content

Multi-language SDK generator from OpenAPI specifications

Project description

SDKGen Logo

SDKGen

Multi-language SDK Generator from OpenAPI Specifications

Type-safe • Async-first • Made for developers


Python 3.12+ License: MIT Build Status

Quick StartFeaturesDocumentationContributing


✨ 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:

  1. Clean operationId - Extracts from OpenAPI operationId
  2. RPC-style actions - Detects 35+ action verbs (download, activate, export, etc.)
  3. HTTP method + response - Smart CRUD naming based on method and response type

Examples:

  • POST /api/v1/usersclient.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}/downloadclient.v1.files.download(id)
  • GET /healthclient.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

🤝 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

GitHubDocumentationIssues

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sdkgen-0.2.0.tar.gz (98.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sdkgen-0.2.0-py3-none-any.whl (42.5 kB view details)

Uploaded Python 3

File details

Details for the file sdkgen-0.2.0.tar.gz.

File metadata

  • Download URL: sdkgen-0.2.0.tar.gz
  • Upload date:
  • Size: 98.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for sdkgen-0.2.0.tar.gz
Algorithm Hash digest
SHA256 fb903e4fc1a92dcb7753ae389d7560a813a314d261a90986584ee081e5cd91de
MD5 d97f3ce53040376f9b7aea85631ac6f0
BLAKE2b-256 41efd9616959936ec24c7f010b39c2218e7e8be3f81c9c5e0767b0ab9606fa84

See more details on using hashes here.

File details

Details for the file sdkgen-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: sdkgen-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 42.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for sdkgen-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ee8312e0dc7a7130c85497484b7fd92eb18efda3b9392ca27a5fa197df20bed8
MD5 f879e80ba6622aa18cacf6499bf9baff
BLAKE2b-256 a1902156442150d2f15783cb0a64eaa8fcc3c38a980cdb73dd12044e745d9a26

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page