Skip to main content

Python SDK

pip install openproxy-ai

Requires Python 3.9+.

Synchronous

from openproxy import OpenProxy

client = OpenProxy(api_key="opai_your_key_here")

response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Summarize this contract in plain English."}],
)
print(response.choices[0].message.content)
print(f"Cost: ${response.gateway.cost_usd:.6f} | Latency: {response.gateway.latency_ms}ms")

Asynchronous

import asyncio
from openproxy import AsyncOpenProxy

async def main():
async with AsyncOpenProxy(api_key="opai_your_key_here") as client:
response = await client.chat.completions.create(
model="anthropic/claude-3-5-sonnet",
messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)

asyncio.run(main())

Streaming

from openproxy import OpenProxy

client = OpenProxy(api_key="opai_your_key_here")

with client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Write a poem about APIs."}],
stream=True,
) as stream:
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)

Async streaming works the same way with AsyncOpenProxy and async for.

Configuration

ParameterDefaultDescription
api_keyrequiredYour OpenProxyAI API key (opai_...)
base_urlhttps://api.openproxyai.comOverride for local dev (http://localhost:8000)
timeout60.0Request timeout in seconds
client = OpenProxy(api_key="opai_dev_key", base_url="http://localhost:8000")

Error handling

from openproxy import OpenProxy
from openproxy._exceptions import (
AuthError,
PolicyViolationError,
RateLimitError,
BudgetExceededError,
ProviderError,
)

client = OpenProxy(api_key="opai_your_key_here")

try:
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Hello"}],
)
except AuthError:
print("Invalid API key")
except PolicyViolationError as e:
print(f"Blocked by policy: {e.reason_code} — rules: {e.triggered_rules}")
except BudgetExceededError as e:
print(f"Daily budget exceeded. Retry after {e.retry_after}s")
except RateLimitError as e:
print(f"Rate limited ({e.limit_type}). Retry after {e.retry_after}s")
except ProviderError as e:
print(f"Upstream provider error ({e.provider})")

Resources

client.chat.completions

MethodDescription
.create(model, messages, stream=False, **kwargs)Create a chat completion

client.embeddings

MethodDescription
.create(model, input, **kwargs)Generate embeddings

client.api_keys

MethodDescription
.list()List all API keys
.create(name, permissions=None, expires_at=None)Create a new API key
.delete(key_id)Delete an API key

client.analytics

MethodDescription
.overview(period_days=30)Get usage overview
.logs(page=1, page_size=50, **filters)Query request logs

Gateway metadata

Every ChatCompletion response includes a .gateway attribute with request-level telemetry:

response.gateway.request_id # str — unique request ID
response.gateway.cost_usd # float — cost in USD
response.gateway.latency_ms # int — total latency in milliseconds
response.gateway.provider # str — upstream provider used
response.gateway.model # str — model actually used
response.gateway.policy_action # str | None — e.g. "redacted", "flagged"
response.gateway.policy_reason # str | None — human-readable policy note