Inspiration
Researchers spend more time operating equipment and recording data than actually thinking about science. Every experiment is a cycle of manual steps: mix, watch, write, repeat. One hand on the pipette, one eye on the reaction, and somehow you are also supposed to be deciding what to try next.
We asked a simple question: what if the lab could just listen to you?
Complete lab automation accelerating discovery is the researcher's dream. Miko is our attempt to bring it closer than ever — not by replacing the researcher, but by transforming their role from operator to conductor.
What it does
Miko is a voice-driven AI lab agent that closes the full experimental loop. You speak to Miko, it observes the reaction through a Raspberry Pi camera using Gemini Vision, controls lab equipment like the magnetic stirrer via a smart plug, records results automatically, and recommends the next experimental conditions through Bayesian Optimization.
The demo experiment is an iodine clock reaction, where four reagents — iodine, sodium thiosulfate, hydrogen peroxide, and water — are mixed and the system watches for the color change event. The optimization targets a trade-off between induction time $t_{ind}$ and color intensity score $L$:
$$\text{target: } t_{ind} \in [55, 65] \text{ s}, \quad \min(L)$$
Faster reactions produce more intense color. Miko's BO sub-agent finds the reagent ratios that satisfy both objectives simultaneously.
How we built it
Miko is built on Google ADK with a multi-agent architecture. The root agent has 9 tools. A bo_expert sub-agent handles Bayesian Optimization via an external Optuna-based server. A data_analyst sub-agent reads experiment history from CSV.
- Gemini 2.5 Flash — agent reasoning and tool orchestration
- Gemini 2.5 Flash Lite — real-time vision analysis and speech-to-text
- Gemini 2.5 Flash Preview TTS — voice synthesis (voice: Kore), multilingual EN/JP/ZH
- Google Cloud Run — backend deployment in asia-northeast1 with Secret Manager
- FastAPI — 13 REST endpoints serving both API and static frontend
- React 19 + Vite — dashboard with live MJPEG camera feed, BO panel, experiment log
- Raspberry Pi 3B+ — OV5647 CSI camera, USB microphone, Kasa smart plug for stirrer control
- Tailscale — VPN tunnel connecting Cloud Run to on-premise lab hardware
Challenges we ran into
The hardest problem was not AI — it was connectivity.
Cloud Run is stateless and network-isolated by design. Bridging it to a physical Raspberry Pi camera and smart plug over Tailscale required a multi-container deployment with a Tailscale sidecar, SOCKS5 proxy routing for SSH, and a 3x retry mechanism with warmup to handle the "No existing session" bug when connecting through proxy chains.
ADK's multi-agent tool delegation adds significant latency. A voice query that triggers BO takes approximately 18 seconds end-to-end (STT → agent → sub-agent → BO server → TTS). This is acceptable for lab use but required careful UX design to keep the researcher informed during the wait.
Gemini's free tier rate limit of 10 RPM also shaped our architecture — we had to batch vision calls and avoid redundant API hits during experiment polling loops.
Accomplishments that we're proud of
Gemini Vision reliably detects the iodine clock color change — from clear to deep amber — using a simple binary prompt, with no custom computer vision code. This became our experiment termination signal, and it works.
The full loop actually runs in real time with real chemistry: speak, observe, act, record, optimize, recommend. From a researcher's perspective, the experience is genuinely different. You stop thinking about the equipment and start thinking about the science.
What we learned
The gap between a demo that works and a system that works in a real lab is mostly about error handling, hardware reliability, and netwo
Built With
- gemini
- google-adk
- python
- raspberry-pi
Log in or sign up for Devpost to join the conversation.