A boutique-hotel receptionist voice agent: room bookings, restaurant reservations, cancellations, invoices, charge disputes and hotel FAQs, over a live SQLite database with schema, views and pricing. Used as a target agent for harness testing.
Ported from livekit/agents, folder
examples/hotel_receptionist, at upstream commit 4d03f505c66106622ca66b7ddc93eb9c6f817dc9.
Upstream is Apache-2.0.
-
Standalone layout. The example lived in a monorepo folder. Its contents are now at this repository's root, so
agent.pysits besidepyproject.toml. Nothing was renamed or moved within the tree. -
Explicit plugins instead of LiveKit Cloud inference. Upstream built its session from
livekit.agents.inference, which routes STT, LLM, TTS and VAD through LiveKit Cloud. A self-hosted LiveKit server does not serve those, so a call connects and nobody ever speaks. The four lines now callfa_plugins, a small new module that constructs Deepgram STT, Google LLM and Deepgram TTS from environment variables, with Silero for VAD.vad=inference.VAD(model="silero") -> fa_plugins.vad() stt=inference.STT("deepgram/nova-3") -> fa_plugins.stt() llm=inference.LLM("google/gemma-4-31b-it") -> fa_plugins.llm() tts=inference.TTS("inworld/inworld-tts-2") -> fa_plugins.tts()The now-unused
inferenceimport was dropped and the two plugin packages were added topyproject.toml. The agent's prompts, tools, policies and database are untouched.
Copy .env.example to .env and fill it in, then:
uv sync
uv run agent.py start
GOOGLE_CLOUD_LOCATION should be global. Some models, including gemini-3.7-flash, are not
served in us-central1 and the agent fails every turn with a 404 that is not retryable.