Official Python SDK for Onlist, the AI API marketplace. Access GPT, Claude, Gemini, DeepSeek and 40+ models through one OpenAI-compatible API.
Project description
Onlist Python SDK
The official Python client for Onlist, the AI API marketplace.
Onlist aggregates 40+ AI model providers behind a single OpenAI-compatible API. This SDK is a drop-in replacement for the OpenAI Python client, so you can switch with one line of code.
Installation
pip install onlist
Quick Start
from onlist import Onlist
client = Onlist(api_key="sk-...") # or set ONLIST_API_KEY env var
response = client.chat.completions.create(
model="anthropic/claude-sonnet-4",
messages=[{"role": "user", "content": "What is Onlist?"}],
)
print(response.choices[0].message.content)
Get your API key at onlist.io.
Authentication
The client reads your API key from:
- The
api_keyparameter - The
ONLIST_API_KEYenvironment variable - The
OPENAI_API_KEYenvironment variable (fallback, for easy migration)
export ONLIST_API_KEY="sk-..."
Provider Routing
Onlist's marketplace lets you choose which provider serves your request.
Use the provider field via extra_body:
# Pin to a specific provider
response = client.chat.completions.create(
model="anthropic/claude-sonnet-4",
messages=[{"role": "user", "content": "Hello"}],
extra_body={"provider": "alice-shop"},
)
# Route to the cheapest provider
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Hello"}],
extra_body={"provider": {"sort": "price"}},
)
# Full routing control
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Hello"}],
extra_body={
"provider": {
"allow": ["alice-shop", "bob-relay"],
"sort": "price",
"allow_fallbacks": True,
"max_price": {"prompt": 0.000003, "completion": 0.000015},
}
},
)
You can also use the typed helper:
from onlist import ProviderRouting
routing = ProviderRouting(
allow=["alice-shop", "bob-relay"],
sort="price",
)
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Hello"}],
extra_body={"provider": routing.model_dump(exclude_none=True)},
)
Streaming
stream = client.chat.completions.create(
model="anthropic/claude-sonnet-4",
messages=[{"role": "user", "content": "Write a haiku about APIs"}],
stream=True,
)
for chunk in stream:
content = chunk.choices[0].delta.content
if content:
print(content, end="", flush=True)
Async Usage
import asyncio
from onlist import AsyncOnlist
async def main():
client = AsyncOnlist(api_key="sk-...")
response = await client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)
asyncio.run(main())
Marketplace API
Query the Onlist marketplace for models and providers:
from onlist import Onlist
client = Onlist(api_key="sk-...")
# List available models with pricing
models = client.marketplace.models.list(limit=10)
for m in models.data:
print(f"{m['id']} - input: {m.get('pricing', {}).get('prompt', 'N/A')}")
# Get detailed model info with all provider offers
detail = client.marketplace.models.get("anthropic/claude-sonnet-4")
print(f"{detail.id} - {len(detail.providers)} providers")
# Browse providers
providers = client.marketplace.providers.list()
for p in providers.data:
print(f"{p.slug} - score: {p.score}")
# Get a specific provider's profile
provider = client.marketplace.providers.get("alice-shop")
print(f"{provider.display_name} - {provider.model_count} models")
Other APIs
Since Onlist is fully OpenAI-compatible, all standard endpoints work:
# Embeddings
embedding = client.embeddings.create(
model="openai/text-embedding-3-small",
input="Hello world",
)
# Image generation
image = client.images.generate(
model="openai/gpt-image-2",
prompt="A sunset over Tokyo",
)
# Text-to-speech
audio = client.audio.speech.create(
model="openai/tts-1",
voice="alloy",
input="Welcome to Onlist.",
)
Error Handling
For OpenAI-compatible API calls (chat.completions, embeddings, etc.), the
standard openai exceptions are raised:
import openai
from onlist import Onlist
client = Onlist(api_key="sk-...")
try:
response = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Hello"}],
)
except openai.AuthenticationError:
print("Invalid API key")
except openai.RateLimitError as e:
print(f"Rate limited: {e.message}")
For marketplace API calls (client.marketplace.*), Onlist-specific exceptions
are raised:
from onlist import Onlist, AuthenticationError, APIError
client = Onlist(api_key="sk-...")
try:
providers = client.marketplace.providers.list()
except AuthenticationError:
print("Invalid API key for marketplace")
except APIError as e:
print(f"API error {e.status_code}: {e.message}")
Migrate from OpenAI or OpenRouter
Already using the OpenAI SDK? Change one line:
- from openai import OpenAI
- client = OpenAI(api_key="sk-...")
+ from onlist import Onlist
+ client = Onlist(api_key="sk-...")
Or, if you prefer to keep using openai directly:
from openai import OpenAI
client = OpenAI(
api_key="your-onlist-key",
base_url="https://onlist.io/v1",
)
Routing Metadata
Onlist returns routing information in response headers. Access them to see which provider actually served your request:
# Use the with_raw_response pattern from the openai SDK:
raw_response = client.chat.completions.with_raw_response.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Hello"}],
)
print(raw_response.headers.get("x-onlist-route-id"))
print(raw_response.headers.get("x-onlist-provider"))
# Parse the completion as usual:
response = raw_response.parse()
print(response.choices[0].message.content)
Links
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file onlist-0.1.0.tar.gz.
File metadata
- Download URL: onlist-0.1.0.tar.gz
- Upload date:
- Size: 11.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8368c436cf15c0db30891cf7de57316ade294bea0102c35a8aa20668aadaa632
|
|
| MD5 |
180a0fd5f619c12114a0bdb07ce9e70a
|
|
| BLAKE2b-256 |
997ecee2f331a68321f6d012e1aba4c2733cc62b1211503a74ba766a9a2679bd
|
Provenance
The following attestation bundles were made for onlist-0.1.0.tar.gz:
Publisher:
publish.yml on OnlistTeam/onlist-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
onlist-0.1.0.tar.gz -
Subject digest:
8368c436cf15c0db30891cf7de57316ade294bea0102c35a8aa20668aadaa632 - Sigstore transparency entry: 1881606502
- Sigstore integration time:
-
Permalink:
OnlistTeam/onlist-python@3081034fabe74c909a77f12d420535c671121f06 -
Branch / Tag:
- Owner: https://github.com/OnlistTeam
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3081034fabe74c909a77f12d420535c671121f06 -
Trigger Event:
release
-
Statement type:
File details
Details for the file onlist-0.1.0-py3-none-any.whl.
File metadata
- Download URL: onlist-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5eed50b618c6715afad2561fd0c21d9e540b9ff4eb974d24ebfeca6da2d531a4
|
|
| MD5 |
a1d209ebde262c8bb0275693f5db1af9
|
|
| BLAKE2b-256 |
a7ceb5c288c6a2a244e37b528bcd7400838868df14aaedf9b00610dd7e175c57
|
Provenance
The following attestation bundles were made for onlist-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on OnlistTeam/onlist-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
onlist-0.1.0-py3-none-any.whl -
Subject digest:
5eed50b618c6715afad2561fd0c21d9e540b9ff4eb974d24ebfeca6da2d531a4 - Sigstore transparency entry: 1881606657
- Sigstore integration time:
-
Permalink:
OnlistTeam/onlist-python@3081034fabe74c909a77f12d420535c671121f06 -
Branch / Tag:
- Owner: https://github.com/OnlistTeam
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3081034fabe74c909a77f12d420535c671121f06 -
Trigger Event:
release
-
Statement type: