# Gemini Hacker Starter A minimal starting point for building with **Gemini 3.1**, **NanoBanana 2**, and **Lyria RealTime** on LiveKit. Get a working multimodal agent running in under 10 minutes, then make it your own. Built for the **Google DeepMind × YC Hackathon**. --- ## What's included | Model | What it does in this starter | |---|---| | **Gemini 3.1 Flash Audio** | Real-time voice conversation with native audio and video understanding | | **NanoBanana 2** (`gemini-3.1-flash-image-preview`) | Generates images from text prompts — agent calls it as a function tool and sends the result to your browser | | **Lyria RealTime** (`models/lyria-realtime-exp`) | Streams generative music into the LiveKit room as a live audio track | The agent can see your camera, hear you speak, generate images on demand, and play real-time music — all through a single LiveKit room. --- ## Install the LiveKit MCP server Install this before you start. It gives your AI coding assistant direct access to LiveKit documentation so you get accurate, current help as you build. **Cursor** — click to install: [![Install MCP Server in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=livekit-docs&config=eyJ1cmwiOiJodHRwczovL2RvY3MubGl2ZWtpdC5pby9tY3AifQ%3D%3D) Or add manually to your MCP settings: ```json { "livekit-docs": { "url": "https://docs.livekit.io/mcp" } } ``` **Claude Code** ```bash claude mcp add --transport http livekit-docs https://docs.livekit.io/mcp ``` **Gemini CLI** ```bash gemini mcp add --transport http livekit-docs https://docs.livekit.io/mcp ``` --- ## Prerequisites - Python 3.10–3.13 - Node.js 18+ - [uv](https://docs.astral.sh/uv/getting-started/installation/) (Python package manager) - LiveKit CLI: - macOS: `brew install livekit-cli` - Linux: `curl -sSL https://get.livekit.io/cli | bash` - Windows: `winget install LiveKit.LiveKitCLI` - [LiveKit Cloud account](https://cloud.livekit.io) (free) - Google API key with access to Gemini 3.1, NanoBanana 2, and Lyria --- ## Quick start ### 1. Set up the agent ```bash cd agent uv sync cp .env.example .env.local ``` Edit `.env.local` with your credentials: ```env LIVEKIT_URL=wss://your-project.livekit.cloud LIVEKIT_API_KEY=your_key LIVEKIT_API_SECRET=your_secret GOOGLE_API_KEY=your_google_api_key ``` Or use the LiveKit CLI to pull credentials from your cloud project automatically: ```bash lk cloud auth lk app env -w -d .env.local ``` ### 2. Set up the frontend ```bash cd ../frontend pnpm install cp .env.example .env.local ``` Edit `frontend/.env.local`: ```env LIVEKIT_URL=wss://your-project.livekit.cloud LIVEKIT_API_KEY=your_key LIVEKIT_API_SECRET=your_secret ``` Or use the LiveKit CLI: ```bash lk app env -w ``` ### 3. Run the agent ```bash cd agent uv run agent.py dev ``` ### 4. Run the frontend In a new terminal: ```bash cd frontend pnpm dev ``` Open [http://localhost:3000](http://localhost:3000), click **Start hacking**, and talk to your agent. --- ## Try it out Once running, try these prompts: - *"Generate an image of a neon-lit street at night in the style of a Studio Ghibli film"* - *"Play some calm ambient music"* - *"Stop the music"* - *"What do you see through my camera?"* - *"Generate a logo for a company called Quantum Noodle"* --- ## Customization All the extension points are marked with `# HACK HERE:` comments in `agent/agent.py`. Here are the main ones. ### Change the agent's persona Edit `PERSONA_INSTRUCTIONS` at the top of `agent/agent.py`: ```python PERSONA_INSTRUCTIONS = """You are a live sports commentator. Watch the game through the user's camera and provide real-time strategic analysis. Call out key moments, track the score, and keep energy high.""" ``` ### Add a function tool ```python from livekit.agents import function_tool, RunContext @function_tool() async def search_the_web(self, context: RunContext, query: str) -> str: """Search the web for current information. Args: query: The search query """ # your implementation here return "results..." ``` ### Adjust video frame rate By default, video frames are sampled based on voice activity. For continuous commentary (e.g., watching a game), use a constant frame rate: ```python from livekit.agents import voice session = AgentSession( llm=google.realtime.RealtimeModel(...), video_sampler=voice.VoiceActivityVideoSampler(speaking_fps=1.0, silent_fps=1.0), ) ``` ### Swap the Gemini voice Change the `voice` parameter in `agent.py`: ```python llm=google.realtime.RealtimeModel( model=REALTIME_MODEL, voice="Kore", # Options: Aoede, Charon, Fenrir, Kore, Puck ) ``` ### Customize image generation The `generate_image` tool in `HackathonAgent` sends the result as a data message to the frontend. You can extend it to: - Apply a style prefix to every prompt (e.g., always render in watercolor) - Send multiple images - Log prompts and images for a gallery view ### Customize Lyria music The `start_music` tool accepts a `prompt` (text description) and `bpm`. You can extend it to expose more Lyria controls like `density`, `brightness`, and `scale`. See the [Lyria RealTime docs](https://ai.google.dev/gemini-api/docs/music-generation) for all available config options. --- ## Project ideas These are just starting points. Build whatever seems interesting. **Live foley engine** — Agent watches your video feed and generates matching ambient sounds and music in real time using Lyria. Point the camera at rain, a fire, a crowd — the agent creates a matching soundscape. **Live game asset generator** — Sketch character designs or level layouts on paper, show them to the camera, and ask the agent to render polished versions using NanoBanana 2. **Interactive storytelling** — Narrate a scene out loud. The agent listens, generates an image of what you describe, and plays mood-appropriate music — all simultaneously. **Spatial design tool** — Point your camera at a room and describe how you'd redesign it. The agent generates photo-realistic renders of the redesigned space. **Accessibility scene describer** — Agent watches a live video feed and generates detailed audio descriptions plus spatial soundscapes for visually impaired users. **Real-time style transfer** — Capture frames from the camera, send them through the image model with style prompts, and stream the stylized output back to the screen continuously. --- ## Architecture ``` Frontend (Next.js + Agents UI) ├── Microphone + camera → LiveKit room → agent receives audio/video ├── Agent speech → LiveKit room → browser plays audio ├── "generated-image" data message → browser renders image panel └── Lyria audio track → browser plays music Agent (Python) ├── Gemini 3.1 Flash Audio — realtime voice + vision ├── generate_image tool → NanoBanana 2 → publish_data("generated-image") ├── start_music tool → Lyria RealTime → publish AudioTrack └── stop_music tool → unpublish AudioTrack ``` --- ## Resources - [LiveKit Agents documentation](https://docs.livekit.io/agents/) - [Gemini Live API documentation](https://ai.google.dev/gemini-api/docs/live) - [Lyria RealTime documentation](https://ai.google.dev/gemini-api/docs/music-generation) - [Lyria RealTime cookbook](https://github.com/google-gemini/cookbook/blob/main/quickstarts/Get_started_LyriaRealTime.ipynb) - [LiveKit Cloud](https://cloud.livekit.io) - [Google AI Studio](https://aistudio.google.com) Good luck — build something weird.