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/yourusername/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

🔧 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.1.2.tar.gz (98.2 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.1.2-py3-none-any.whl (42.4 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for sdkgen-0.1.2.tar.gz
Algorithm Hash digest
SHA256 b7d9531b7e90548b0cf219a4597330a00157d8a7bef7b70a07cb94522050b295
MD5 95226017fe57af57902a5733d2313b98
BLAKE2b-256 0ba6458604a368c5141ccd9228ac4ce116ad7b66158b6c9467f1f1c93e7802cd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: sdkgen-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 42.4 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.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 8c6aa65d45a2696c349b11ebc863cf535d903ecfa93b7e020062c4e1403c36f4
MD5 fed084b21dc00b641af93ad5b29c274f
BLAKE2b-256 62cfc6bd3cf57b0a2697bda8cfa49e4b07d228d6edf73e8b67389d4668e021f9

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