Module livekit.plugins.avatario.api

Classes

class AvatarioAPI (api_key: str,
avatar_id: NotGivenOr[str] = NOT_GIVEN,
video_info: NotGivenOr[dict[str, Any]] = NOT_GIVEN,
*,
conn_options: APIConnectOptions = APIConnectOptions(max_retry=3, retry_interval=2.0, timeout=10.0),
session: aiohttp.ClientSession | None = None)
Expand source code
class AvatarioAPI:
    """
    An asynchronous client for interacting with the Avatario API.

    This class handles authentication, request signing, and retries.
    """

    def __init__(
        self,
        api_key: str,
        avatar_id: NotGivenOr[str] = NOT_GIVEN,
        video_info: NotGivenOr[dict[str, Any]] = NOT_GIVEN,
        *,
        conn_options: APIConnectOptions = DEFAULT_API_CONNECT_OPTIONS,
        session: aiohttp.ClientSession | None = None,
    ) -> None:
        """
        Initializes the AvatarioAPI client.
        """
        self._avatar_id = avatar_id
        self._api_key = api_key

        self._video_info = video_info
        self._conn_options = conn_options
        self._session = session
        self._owns_session = session is None

    async def __aenter__(self) -> AvatarioAPI:
        if self._owns_session:
            self._session = aiohttp.ClientSession()
        return self

    async def __aexit__(
        self, exc_type: type | None, exc_val: Exception | None, exc_tb: Any
    ) -> None:
        if self._owns_session and self._session:
            await self._session.close()

    async def start_session(
        self,
        *,
        livekit_agent_identity: NotGivenOr[str] = NOT_GIVEN,
        properties: NotGivenOr[dict[str, Any]] = NOT_GIVEN,
    ) -> None:
        """
        Initiate a session request

        Args:
            livekit_agent_identity: the participant identity of the agent in room.
            properties: A dictionary consisting of room url and token used by the
                        avatario participant to join the room.
        """
        if not utils.is_given(livekit_agent_identity):
            raise AvatarioException(
                "the identity of agent needs to be provided "
                "to ensure its proper communication with avatario backend"
            )

        properties = properties if utils.is_given(properties) else {}

        payload = {
            "avatario_face_id": self._avatar_id,
            "agent_id": livekit_agent_identity,
            "livekit": properties,
        }

        if utils.is_given(self._video_info):
            payload.update(self._video_info)
        await self._post(payload)

    async def _post(self, payload: dict[str, Any]) -> dict[str, Any]:
        """
        Make a POST request to the Avatario API with retry logic.

        Args:
            payload: JSON payload for the request

        Returns:
            Response data as a dictionary

        Raises:
            APIConnectionError: If the request fails after all retries
        """

        if self._session is None:
            raise RuntimeError("Session not initialized. Use 'async with AvatarioAPI(...)'.")
        last_exc: Exception | None = None
        for i in range(self._conn_options.max_retry):
            try:
                async with self._session.post(
                    f"{DEFAULT_API_URL}/start-session",
                    headers={
                        "Content-Type": "application/json",
                        "x-api-key": self._api_key,
                    },
                    json=payload,
                    timeout=aiohttp.ClientTimeout(total=self._conn_options.timeout),
                ) as response:
                    if not response.ok:
                        text = await response.text()
                        raise APIStatusError(
                            "Server returned an error",
                            status_code=response.status,
                            body=text,
                        )
                    data = await response.json()
                    return cast(dict[str, Any], data)
            except APIStatusError as e:
                last_exc = e
                if not e.retryable:
                    raise
                logger.warning("Avatario API returned error", extra={"error": str(e)})
            except Exception as e:
                last_exc = e
                logger.exception("failed to call Avatario API")

            if i < self._conn_options.max_retry - 1:
                await asyncio.sleep(self._conn_options.retry_interval)

        if isinstance(last_exc, APIStatusError):
            raise last_exc
        raise APIConnectionError("Failed to call Avatario API after all retries")

An asynchronous client for interacting with the Avatario API.

This class handles authentication, request signing, and retries.

Initializes the AvatarioAPI client.

Methods

async def start_session(self,
*,
livekit_agent_identity: NotGivenOr[str] = NOT_GIVEN,
properties: NotGivenOr[dict[str, Any]] = NOT_GIVEN) ‑> None
Expand source code
async def start_session(
    self,
    *,
    livekit_agent_identity: NotGivenOr[str] = NOT_GIVEN,
    properties: NotGivenOr[dict[str, Any]] = NOT_GIVEN,
) -> None:
    """
    Initiate a session request

    Args:
        livekit_agent_identity: the participant identity of the agent in room.
        properties: A dictionary consisting of room url and token used by the
                    avatario participant to join the room.
    """
    if not utils.is_given(livekit_agent_identity):
        raise AvatarioException(
            "the identity of agent needs to be provided "
            "to ensure its proper communication with avatario backend"
        )

    properties = properties if utils.is_given(properties) else {}

    payload = {
        "avatario_face_id": self._avatar_id,
        "agent_id": livekit_agent_identity,
        "livekit": properties,
    }

    if utils.is_given(self._video_info):
        payload.update(self._video_info)
    await self._post(payload)

Initiate a session request

Args

livekit_agent_identity
the participant identity of the agent in room.
properties
A dictionary consisting of room url and token used by the avatario participant to join the room.
class AvatarioException (*args, **kwargs)
Expand source code
class AvatarioException(Exception):
    """Exception for Avatario errors"""

Exception for Avatario errors

Ancestors

  • builtins.Exception
  • builtins.BaseException