CanalAPI
Examples

Python

Use CanalAPI from Python with the official OpenAI SDK.

The official openai Python package works directly against CanalAPI by overriding base_url and api_key.

Install

pip install openai

Hello world

from openai import OpenAI
import os

client = OpenAI(
    api_key=os.environ["CANALAPI_API_KEY"],
    base_url=os.environ["CANALAPI_BASE_URL"],
)

r = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Hello"}],
)
print(r.choices[0].message.content)

Streaming

stream = client.chat.completions.create(
    model="gpt-4o-mini",
    stream=True,
    messages=[{"role": "user", "content": "Stream a poem."}],
)
for chunk in stream:
    delta = chunk.choices[0].delta
    if delta and delta.content:
        print(delta.content, end="", flush=True)
print()

Retry with backoff

import random, time
from openai import OpenAI, APIError, RateLimitError

client = OpenAI(
    api_key=os.environ["CANALAPI_API_KEY"],
    base_url=os.environ["CANALAPI_BASE_URL"],
)

def ask(prompt: str, attempt: int = 0) -> str:
    try:
        r = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{"role": "user", "content": prompt}],
        )
        return r.choices[0].message.content or ""
    except (RateLimitError, APIError) as e:
        status = getattr(e, "status_code", None) or getattr(e, "status", None)
        if status in (429, 500, 502, 503, 504) and attempt < 4:
            delay = min(2 ** attempt, 8) * (0.75 + random.random() * 0.5)
            time.sleep(delay)
            return ask(prompt, attempt + 1)
        raise

Async

import asyncio
from openai import AsyncOpenAI
import os

async def main():
    client = AsyncOpenAI(
        api_key=os.environ["CANALAPI_API_KEY"],
        base_url=os.environ["CANALAPI_BASE_URL"],
    )
    r = await client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": "Hello"}],
    )
    print(r.choices[0].message.content)

asyncio.run(main())

On this page