Skip to main content
Mint an OpenAI ephemeral client secret, create an Avaturn session bound to it, and hand the session token to your frontend. Engine config details: OpenAI Realtime.
import asyncio
import httpx
from openai import AsyncOpenAI
from pydantic import BaseModel

AVATURN_API_KEY = "<AVATURN_API_KEY>"
OPENAI_API_KEY = "<OPENAI_API_KEY>"


class CreateSessionResponse(BaseModel):
    session_id: str
    token: str


class AvaturnClient:
    def __init__(self, api_key: str, base_url: str = "https://api.avaturn.live") -> None:
        self.headers = {"Authorization": f"Bearer {api_key}"}
        self.base_url = base_url

    async def create_session(self, client_secret: str) -> CreateSessionResponse:
        async with httpx.AsyncClient() as http:
            r = await http.post(
                f"{self.base_url}/api/v1/sessions",
                headers=self.headers,
                json={
                    "conversation_engine": {
                        "type": "openai-realtime",
                        "client_secret": client_secret,
                    }
                },
            )
            r.raise_for_status()
            return CreateSessionResponse.model_validate(r.json())

    async def terminate_session(self, session_id: str) -> None:
        async with httpx.AsyncClient() as http:
            await http.delete(
                f"{self.base_url}/api/v1/sessions/{session_id}",
                headers=self.headers,
            )


async def main() -> None:
    # 1. Mint a short-lived OpenAI client secret
    openai = AsyncOpenAI(api_key=OPENAI_API_KEY)
    secret = await openai.realtime.client_secrets.create(
        expires_after={"seconds": 600, "anchor": "created_at"},
        session={"type": "realtime", "model": "gpt-realtime"},
    )

    # 2. Create an Avaturn session bound to the OpenAI secret
    avaturn = AvaturnClient(AVATURN_API_KEY)
    session = await avaturn.create_session(client_secret=secret.value)
    print(session.model_dump())  # send session.token to the frontend

    # 3. ... user converses with the avatar via the Web SDK ...

    # 4. Terminate explicitly (or rely on auto-termination)
    await avaturn.terminate_session(session.session_id)


asyncio.run(main())
Cartesia variant. Replace the OpenAI minting step with the Cartesia access token flow, then set the engine config to { "type": "cartesia", "access_token": "...", "agent_id": "..." }. Full walkthrough: Cartesia engine.