Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
APIStatusError,
)

from .errors import AnamException
from .log import logger
from .types import PersonaConfig, SessionOptions

Expand Down Expand Up @@ -61,23 +60,23 @@ async def __aexit__(
if self._own_session and self._session:
await self._session.close()

async def create_session_token(
async def start_session(
self,
persona_config: PersonaConfig,
livekit_url: str,
livekit_token: str,
session_options: SessionOptions | None = None,
) -> str:
) -> dict[str, Any]:
"""
Creates a session token to authorize starting an engine session.
Starts an engine session.

Args:
session_options: Optional per-session output options (e.g. explicit
video dimensions) forwarded to Anam as ``sessionOptions``. When
``None``, Anam uses the avatar model's default output.

Returns:
The created session token (a JWT string).
The session details, including sessionId and engine host info.
"""
persona_config_payload = {
"type": "ephemeral",
Expand Down Expand Up @@ -118,33 +117,7 @@ async def create_session_token(
"Authorization": f"Bearer {self._api_key}", # Use API Key here
"Content-Type": "application/json",
}
response_data = await self._post("/v1/auth/session-token", payload, headers)

session_token: str | None = response_data.get("sessionToken")
if not session_token:
raise AnamException("Failed to retrieve sessionToken from API response.")
return session_token

async def start_engine_session(
self,
session_token: str,
) -> dict[str, Any]:
"""
Starts the engine session using a previously created session token.

Args:
session_token: The temporary token from create_session_token.
livekit_url: The URL of the LiveKit instance.
livekit_token: The access token for the LiveKit room.

Returns:
The session details, including sessionId and engine host info.
"""
headers = {
"Authorization": f"Bearer {session_token}", # Use Session Token here
"Content-Type": "application/json",
}
return await self._post("/v1/engine/session", {}, headers)
return await self._post("/v1/engine/session", payload, headers)

async def _post(
self, endpoint: str, payload: dict[str, Any], headers: dict[str, str]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,18 +113,13 @@ async def start(
async with AnamAPI(
api_key=self._api_key, api_url=self._api_url, conn_options=self._conn_options
) as anam_api:
session_token = await anam_api.create_session_token(
logger.debug("Starting Anam engine session...")
session_details = await anam_api.start_session(
persona_config=self._persona_config,
livekit_url=livekit_url,
livekit_token=livekit_token,
session_options=self._session_options,
)
logger.debug("Anam session token created successfully.")

logger.debug("Starting Anam engine session...")
session_details = await anam_api.start_engine_session(
session_token=session_token,
)
self.session_id = session_details.get("sessionId")

agent_session.output.replace_audio_tail(
Expand Down
Loading