Skip to main content

Async OpenAI API wrapper for Jupyter notebooks

Project description

Wurun

Async OpenAI API wrapper optimized for Jupyter notebooks with connection pooling, retry logic, and batch processing.

Features

  • HTTP/2 Connection Pooling - Shared client for efficient API calls
  • Robust Retry Logic - Exponential backoff for rate limits and errors
  • Batch Processing - Concurrent API calls with semaphore control
  • Jupyter Optimized - Clean notebook output and error handling
  • Zero Configuration - Simple setup, works with OpenAI and Azure OpenAI

Installation

# Production use
pip install .

# Development (includes testing tools)
pip install .[dev]

Quick Start

from wurun import Wurun

# Setup once per kernel
await Wurun.setup(
    endpoint="https://api.openai.com/v1",
    api_key="your-api-key",
    deployment_name="gpt-3.5-turbo"
)

# Single question
messages = [{"role": "user", "content": "Explain asyncio"}]
answer = await Wurun.ask(messages)
print(answer)

# Batch processing
questions = [
    [{"role": "user", "content": "What is Python?"}],
    [{"role": "user", "content": "What is JavaScript?"}]
]
answers = await Wurun.run_gather(questions, concurrency=2)

# Cleanup
await Wurun.close()

API Reference

Setup

  • Wurun.setup() - Initialize client (call once per kernel)
  • Wurun.close() - Clean up resources

Single Calls

  • Wurun.ask() - Single API call with retry logic
  • return_meta=True - Include latency and retry count

Batch Processing

  • Wurun.run_gather() - Preserve input order
  • Wurun.run_as_completed() - Process as results finish
  • concurrency parameter controls parallel requests

Notebook Helpers

  • Wurun.print_qna_ordered() - Pretty print Q&A format
  • Wurun.print_as_ready() - Print results as they complete

Configuration

await Wurun.setup(
    endpoint="https://api.openai.com/v1",
    api_key="your-key",
    deployment_name="gpt-3.5-turbo",
    timeout=30.0,
    max_connections=32,
    max_keepalive=16,
    http2=True,
    max_retries=2
)

Error Handling

# Custom retry settings
result = await Wurun.ask(
    messages,
    attempts=3,
    initial_backoff=1.0,
    max_backoff=10.0
)

# Get metadata
answer, meta = await Wurun.ask(messages, return_meta=True)
print(f"Latency: {meta['latency']:.2f}s, Retries: {meta['retries']}")

Development

# Install dev dependencies
pip install .[dev]

# Run tests
pytest test_wurun.py -v

Release Process

  1. Create PR: Make changes and create pull request to main
  2. Auto Draft: Release Drafter automatically creates/updates draft release
  3. Publish Release: Go to GitHub Releases, edit draft, and publish
  4. Auto Deploy: Publishing triggers automatic PyPI deployment

Manual Version Update

# Update version in pyproject.toml
python scripts/update_version.py 1.2.3

License

MIT

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

wurun-0.1.0.tar.gz (10.2 kB view details)

Uploaded Source

Built Distribution

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

wurun-0.1.0-py3-none-any.whl (13.2 kB view details)

Uploaded Python 3

File details

Details for the file wurun-0.1.0.tar.gz.

File metadata

  • Download URL: wurun-0.1.0.tar.gz
  • Upload date:
  • Size: 10.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for wurun-0.1.0.tar.gz
Algorithm Hash digest
SHA256 3766ac8dc60d966ac9646646284660b209c5aed1695a9de8c85b4caa756203ec
MD5 61e042b1fea3de7ea7b0155979e94d69
BLAKE2b-256 58e27132c003c63d9701271257e684b1515adac8e1382b826d98df95f5cbd47a

See more details on using hashes here.

Provenance

The following attestation bundles were made for wurun-0.1.0.tar.gz:

Publisher: publish.yml on Aisuko/wurun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wurun-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: wurun-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for wurun-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 329fb835f20a4b1d280a7d62eea854256b3f2506c54f4226fb70dd942cb7dbd9
MD5 dac223e4c0805886a0efe4b25982d8fc
BLAKE2b-256 7d1c428f0c29fa02bec3dbcf3355f60a76ee63eb60e0b7159ce8fc845633e724

See more details on using hashes here.

Provenance

The following attestation bundles were made for wurun-0.1.0-py3-none-any.whl:

Publisher: publish.yml on Aisuko/wurun

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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