--- title: Post Conference Report emoji: 🌖 colorFrom: purple colorTo: green sdk: docker pinned: false --- # Post Conference Report Demo A web app that transforms raw conference notes into structured markdown reports via a streaming LLM API. **Stack:** FastAPI + vanilla JS/Tailwind CSS frontend, Haystack AI for LLM orchestration, NVIDIA Nemotron-3 Super 120B model via NVIDIA API. The Docker image also bundles the [google-drive-mcp](https://github.com/piotr-agier/google-drive-mcp) server as a background process. ## Prerequisites - `NVIDIA_API_KEY` — set in a `.env` file at the project root - Google Drive OAuth credentials (for the MCP server) — see [Google Drive MCP setup](#google-drive-mcp-setup) below ## Running locally ```bash # Install dependencies uv sync # Run the app (port 7860) uv run main.py ``` ## Helper scripts ### Download YouTube transcripts Downloads transcripts for one or more YouTube videos and saves each as a `.docx` file named after the video title. Prefers manually-created transcriptions; falls back to auto-generated if unavailable. ```bash # Single video uv run scripts/download_transcripts.py https://www.youtube.com/watch?v=VIDEO_ID # Playlist (downloads all videos) uv run scripts/download_transcripts.py "https://www.youtube.com/playlist?list=PLAYLIST_ID" # Mix of playlists and individual videos uv run scripts/download_transcripts.py \ "https://www.youtube.com/playlist?list=PLAYLIST_ID" \ https://youtu.be/VIDEO_ID \ -o ./my-transcripts # Verbose logging uv run scripts/download_transcripts.py https://youtu.be/VIDEO_ID -v ``` Output files land in `./transcripts/` by default. Each file is named after the video title (e.g. `My_Talk_Title.docx`). Exit code is non-zero if any video failed. ## Running with Docker ```bash ./run.sh ``` `run.sh` builds the image and starts the container. It also mounts your local Google Drive MCP credentials and tokens automatically if they exist at `~/.config/google-drive-mcp/`. To run manually: ```bash docker build -t post-conference-report-demo . docker run --rm -p 7860:7860 --env-file .env \ -v ~/.config/google-drive-mcp/gcp-oauth.keys.json:/root/.config/google-drive-mcp/gcp-oauth.keys.json:ro \ -v ~/.config/google-drive-mcp/tokens.json:/root/.config/google-drive-mcp/tokens.json \ post-conference-report-demo ``` ## Google Drive MCP setup The Docker image installs `@piotr-agier/google-drive-mcp` globally and starts it in the background on container startup. It requires Google OAuth 2.0 credentials. ### 1. Create OAuth credentials 1. Open [Google Cloud Console](https://console.cloud.google.com/) and create (or select) a project 2. Enable the following APIs: Drive, Docs, Sheets, Slides, Calendar 3. Create an OAuth 2.0 **Desktop app** credential and download the JSON file 4. Place it at `~/.config/google-drive-mcp/gcp-oauth.keys.json` ### 2. Authenticate (once, on the host) ```bash npx @piotr-agier/google-drive-mcp auth ``` This opens a browser for the OAuth flow and writes the token to `~/.config/google-drive-mcp/tokens.json`. The token file is mounted into the container by `run.sh` and persists across container restarts. ### Alternative: pass credentials via environment variables Instead of volume mounts you can supply the JSON file contents directly as environment variables — useful for cloud deployments (HuggingFace Spaces secrets, Kubernetes secrets, etc.). Add these to your `.env` file: ``` GOOGLE_DRIVE_OAUTH_KEYS_JSON={"installed":{"client_id":"...","client_secret":"...",...}} GOOGLE_DRIVE_TOKENS_JSON={"access_token":"...","refresh_token":"...",...} ``` On container startup, `entrypoint.sh` writes the values to temp files and points the MCP server at them. Volume mounts take precedence if both are present. ### MCP server logs Inside a running container: ```bash docker exec cat /var/log/google-drive-mcp.log ```