Async OpenAI API wrapper optimized for Jupyter notebooks with connection pooling, retry logic, and batch processing.
- 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
# Production use
pip install .
# Development (includes testing tools)
pip install ".[dev]"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)
# Custom parameters
answer = await Wurun.ask(messages, max_tokens=512, temperature=0.7)
# 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()import pandas as pd
df = pd.DataFrame({
"id": [1, 2, 3],
"messages": [
[{"role": "user", "content": "What is Python?"}],
[{"role": "user", "content": "What is JavaScript?"}],
[{"role": "user", "content": "What is Go?"}]
]
})
results = await Wurun.run_dataframe(df, "messages", concurrency=2)Wurun.setup()- Initialize client (call once per kernel)Wurun.close()- Clean up resources
Wurun.ask()- Single API call with retry logicreturn_meta=True- Include latency and retry countmax_tokens=1024- Maximum tokens in response (default: 1024)temperature=0- Response randomness (default: 0)
Wurun.run_gather()- Preserve input orderWurun.run_as_completed()- Process as results finishconcurrencyparameter controls parallel requestsmax_tokensandtemperatureavailable on all batch methods
Wurun.run_dataframe()- Process messages from DataFrame column
Wurun.print_qna_ordered()- Pretty print Q&A formatWurun.print_as_ready()- Print results as they complete
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
)# Custom retry settings
result = await Wurun.ask(
messages,
attempts=3,
initial_backoff=1.0,
max_backoff=10.0,
max_tokens=512,
temperature=0.7
)
# Get metadata
answer, meta = await Wurun.ask(messages, return_meta=True)
print(f"Latency: {meta['latency']:.2f}s, Retries: {meta['retries']}")# Install dev dependencies
pip install ".[dev]"
# Run tests
pytest test_wurun.py -v- Create PR: Make changes and create pull request to
main - Auto Draft: Release Drafter automatically creates/updates draft release
- Publish Release: Go to GitHub Releases, edit draft, and publish
- Auto Deploy: Publishing triggers automatic PyPI deployment
# Update version in pyproject.toml
python scripts/update_version.py 1.2.3Apache License 2.0