--- title: CityQuest AI emoji: 🗺️ colorFrom: pink colorTo: blue sdk: gradio sdk_version: 6.16.0 python_version: '3.12' app_file: app.py pinned: false license: apache-2.0 short_description: AI-generated multiplayer real-world city games tags: - track:wood - sponsor:openbmb - sponsor:nvidia - sponsor:modal - achievement:welltuned - achievement:offbrand - achievement:llama - achievement:fieldnotes --- # 🗺️ CityQuest AI **Turn any city into a multiplayer real-world game.** CityQuest AI generates complete, playable adventures — **Scavenger Hunt, Hide & Seek, and Tag** — tailored to a real location, your group size, age range, difficulty, and theme. It grounds every quest in the actual city (real districts, landmarks and parks), runs a live multiplayer room with proof-gated tasks and scoring, lets players record **voice journals** during play, and wraps the session up with an **AI narrative recap** and a generated **poster**. > Built for the **[Build Small Hackathon](https://huggingface.co/build-small-hackathon)** > by Gradio × Hugging Face (June 5–15, 2026). Small models, big adventures — everything > runs on models **≤ 4B parameters** through **llama.cpp**, orchestrated on a single GPU. --- ## 🔗 Links | | | | --- | --- | | 🎮 **Live App (HF Space)** | https://huggingface.co/spaces/build-small-hackathon/CityQuest-AI | | 💻 **GitHub** | https://github.com/NANInithin/CityQuest-AI | | 🤖 **Fine-tuned model** | https://huggingface.co/NANI-Nithin/CityQuest-Nemotron-3-Nano-4B-GGUF | | 🏕️ **Hackathon** | https://huggingface.co/build-small-hackathon | | 𝕏 **Social Media Post|https://x.com/mnbhargav8/status/2066632722664010144?s=20| |🏃 **Demo game run**|https://www.youtube.com/watch?v=QtjaA9YZHOc| |🏃 **Demo game recording**|https://youtu.be/wyrfTrp68yw| --- ## 🏆 Hackathon at a glance # Trail: An Adventure in Thousand Token Wood **Constraints met** - ✅ **Gradio app hosted on a Hugging Face Space** - ✅ **All models ≤ 32B** — in fact **≤ 4B** (NVIDIA Nemotron 3 Nano **4B** + OpenBMB MiniCPM5 **1B**) - ✅ **Load-bearing AI** — the entire game (rules, tasks, hints, safety, scoring, recap, poster) is model-generated, not scripted **Track:** primarily **Thousand Token Wood** (a delightful, original AI experience that gamifies real-world exploration), with strong **Backyard AI** relevance — it solves a real problem for friends/family: planning a fun, safe group outing in minutes. ### Sponsor tech we build on | Sponsor | How we use it | | --- | --- | | **NVIDIA Nemotron** | `Nemotron-3-Nano-4B` (GGUF) is our core game generator | | **OpenBMB** | `MiniCPM5-1B` (GGUF) powers the episode-recap path | | **Modal** | Full LoRA fine-tuning + GGUF conversion pipeline runs on Modal A100s | | **Cohere** | `cohere-transcribe-03-2026` transcribes in-game voice journals | ### Bonus Quests | Badge | Status | Evidence | | --- | --- | --- | | 🦙 **Llama Champion** (llama.cpp runtime) | ✅ Earned | Nemotron **and** MiniCPM run via `llama-cpp-python` | | 🪙 **Tiny Titan** (≤4B models) | ✅ Eligible | Both LLMs are ≤4B; runs on modest hardware | | 🎛️ **Well-Tuned** (fine-tuned model on HF) | ✅ Eligible | LoRA fine-tune **published** at [`NANI-Nithin/CityQuest-Nemotron-3-Nano-4B-GGUF`](https://huggingface.co/NANI-Nithin/CityQuest-Nemotron-3-Nano-4B-GGUF) with a full reproducible Modal pipeline (see [`training/`](training/README.md)); under active development for location grounding | | 📓 **Field Notes** (dev report) | ✅ Eligible | **published** at [Teaching a 4B Model to Run a City-Wide Scavenger Hunt — Without Naming a Single Street](https://huggingface.co/blog/build-small-hackathon/cityquest-ai) | --- ## ✨ Features - **City-grounded generation** — live **Wikipedia** city context injects real districts, landmarks and parks so quests reference actual places, not generic ones. - **Three game types** — Scavenger Hunt, Hide & Seek, Tag, each with type-appropriate rules, tasks/zones, hints, and scoring. - **Schema-guaranteed output** — every generated game is validated against a strict JSON schema, auto-**repaired** on failure, with a safe fallback — so the app never breaks. - **Multiplayer rooms** — create/join with a 6-character room code; synchronized state via adaptive `gr.Timer` polling (1.5s when active, eases to ~3s when idle). - **Proof-gated tasks** — complete tasks with **photo / observation / text** proof; live leaderboard, points, hints (with penalties), and a countdown timer. - **Ask-the-Guide** — per-task AI helper for clues and clarifications during play. - **Voice journals** — record audio during the quest; auto-transcribed (14 languages) with a typed-input fallback. - **AI recap + poster** — a streamed narrative episode recap of how the game played out, plus a cinematic poster image. - **Safety-first** — generated games include allowed zones, forbidden behaviors, adult- supervision flags and stop conditions. --- ## 🧠 AI architecture — small models, orchestrated Everything is built around **small, efficient models** sequenced on a single GPU (each is loaded for its stage and unloaded to free VRAM for the next — appropriate model sizing by design): | Stage | Model | Runtime | Notes | | --- | --- | --- | --- | | 🎯 Game generation | `nvidia/NVIDIA-Nemotron-3-Nano-4B-GGUF` | **llama.cpp** | Retrieval-grounded + Wikipedia city context; JSON-schema validated & repaired | | 🗣️ Voice journal ASR | `CohereLabs/cohere-transcribe-03-2026` | 🤗 Transformers | 14 languages, lazy-loaded; typed fallback | | 📖 Episode recap | `openbmb/MiniCPM5-1B-GGUF` | **llama.cpp** | Narrative recap (deterministic template fallback for reliability) | | 🖼️ Poster | `black-forest-labs/FLUX.1-schnell` | 🤗 Diffusers | Cinematic recap poster | | 📍 Location context | **Wikipedia API** | — | Real landmarks/districts/parks per city | `CITYQUEST_FAST_TEST=1` runs the full pipeline without downloading any model weights. --- ## 🎛️ Fine-tuning (Well-Tuned quest) We built a complete, reproducible pipeline to **LoRA fine-tune Nemotron 3 Nano 4B on the CityQuest dataset** and ship it as a GGUF — all on **Modal**: ``` app/data//dataset.json │ prepare_dataset.py — serve-matched SFT prompts + game_schema targets (leave-one-out retrieval) ▼ training/data/*.jsonl │ train_modal.py — transformers + PEFT LoRA on A100 (native nemotron_h + mamba kernels, │ checkpoint/resume) → merge → GGUF Q4_K_M → upload to HF ▼ 🤗 NANI-Nithin/CityQuest-Nemotron-3-Nano-4B-GGUF │ eval_gguf.py — schema-pass evaluation vs the stock base ``` **Honest status:** the fine-tune is **published on Hugging Face** and the pipeline is fully reproducible. On evaluation it matched the base on structure but **regressed on location grounding** (the synthetic training targets used generic descriptions, so it under-used the real-city context) — so the live app currently serves the **stock Nemotron base** for the best player experience. The next iteration regenerates the training targets grounded in real landmarks. Full details in **[`training/README.md`](training/README.md)**. The fine-tuned model can be enabled with a one-line change in `app/services/generator.py`. --- ## 🚀 Run locally ```bash pip install -r requirements.txt python app.py # launches the Gradio app # Fast smoke test (no model downloads): CITYQUEST_FAST_TEST=1 python app.py ``` llama.cpp setup: see [`NEMOTRON_GGUF_SETUP.md`](NEMOTRON_GGUF_SETUP.md). Voice-journal ASR setup: see [`COHERE_ASR_SETUP.md`](COHERE_ASR_SETUP.md). --- ## 🛠️ Tech stack - **Gradio** app on **Hugging Face Spaces** (ZeroGPU-ready) - **llama.cpp** (`llama-cpp-python`) for LLM inference - **🤗 Transformers / Diffusers** for ASR and image generation - **Modal** for cloud-GPU fine-tuning - **PEFT / TRL-free Trainer** LoRA training; **GGUF Q4_K_M** quantization - Strict **JSON-Schema** validation + repair around all generations --- ## 👥 Team | Member | Hugging Face | Email | | --- | --- | --- | | **Nithin Sai Kumar Kopparapu** | [@NANI-Nithin](https://huggingface.co/NANI-Nithin) | naniknsk2002@gmail.com | | **Bhargav Malasani Nagaraj** | [@MNbalu](https://huggingface.co/MNbalu) | mnbhargavfr@gmail.com | --- ## 🙏 Acknowledgements Built for the **Build Small Hackathon** (Gradio × Hugging Face). Thanks to sponsors **NVIDIA** (Nemotron), **OpenBMB** (MiniCPM), **Cohere** (Transcribe), and **Modal** for the models, tooling and compute that made CityQuest possible. _License: Apache-2.0_