Agent with OpenAI + ElevenLabs
from dotenv import load_dotenv
from livekit.agents import Agent, AgentServer, AgentSession, JobContext, TurnHandlingOptions, cli
from livekit.plugins import agenthuman, deepgram, elevenlabs, openai, silero
load_dotenv()
server = AgentServer()
@server.rtc_session()
async def entrypoint(ctx: JobContext):
session = AgentSession(
vad=silero.VAD.load(),
stt=deepgram.STT(model="nova-3", language="multi"),
llm=openai.LLM(model="gpt-4o-mini"),
tts=elevenlabs.TTS(
voice_id="cgSgspJ2msm6clMCkdW9",
model="eleven_multilingual_v2"
),
turn_handling=TurnHandlingOptions(
interruption={"mode": "vad", "resume_false_interruption": False},
),
)
avatar = agenthuman.AvatarSession(
avatar_id="avat_xxxxxxxxxxxxxxxxxxxxxxxx",
aspect_ratio="3:4"
)
await avatar.start(session, room=ctx.room)
await session.start(
agent=Agent(instructions="You are a friendly voice assistant."),
room=ctx.room
)
session.generate_reply(instructions="Greet the user and ask about their day.")
if __name__ == "__main__":
cli.run_app(server)
Agent with Cartesia TTS and an image as avatar
avatar_image_url animates any publicly accessible portrait, without creating an avatar first.
from dotenv import load_dotenv
from livekit.agents import Agent, AgentServer, AgentSession, JobContext, TurnHandlingOptions, cli
from livekit.plugins import agenthuman, cartesia, deepgram, openai, silero
load_dotenv()
server = AgentServer()
@server.rtc_session()
async def entrypoint(ctx: JobContext):
session = AgentSession(
vad=silero.VAD.load(),
stt=deepgram.STT(model="nova-3"),
llm=openai.LLM(model="gpt-4o-mini"),
tts=cartesia.TTS(
model="sonic-3",
voice="9626c31c-bec5-4cca-baa8-f8ba9e84c8bc"
),
turn_handling=TurnHandlingOptions(
interruption={"mode": "vad", "resume_false_interruption": False},
),
)
avatar = agenthuman.AvatarSession(
avatar_image_url="https://example.com/portrait.jpg",
aspect_ratio="4:3"
)
await avatar.start(session, room=ctx.room)
await session.start(
agent=Agent(instructions="You are a helpful customer support agent."),
room=ctx.room
)
if __name__ == "__main__":
cli.run_app(server)
Using LiveKit Inference
from dotenv import load_dotenv
from livekit.agents import (
Agent,
AgentServer,
AgentSession,
JobContext,
TurnHandlingOptions,
cli,
inference,
)
from livekit.plugins import agenthuman, silero
load_dotenv()
server = AgentServer()
@server.rtc_session()
async def entrypoint(ctx: JobContext):
session = AgentSession(
vad=silero.VAD.load(),
stt=inference.STT("deepgram/nova-3"),
llm=inference.LLM("openai/gpt-4.1-mini"),
tts=inference.TTS("cartesia/sonic-3"),
turn_handling=TurnHandlingOptions(
interruption={"mode": "vad", "resume_false_interruption": False},
),
)
avatar = agenthuman.AvatarSession(
avatar_id="avat_xxxxxxxxxxxxxxxxxxxxxxxx",
aspect_ratio="4:3"
)
await avatar.start(session, room=ctx.room)
await session.start(
agent=Agent(instructions="You are a helpful assistant."),
room=ctx.room
)
if __name__ == "__main__":
cli.run_app(server)