Reachy Mini × Strands Agent on Jetson Thor

Overview
A Reachy Mini Lite desk robot driven by a Strands Agent that runs entirely on-device on an NVIDIA Jetson Thor. Say "Hey Reachy" (or publish an MQTT message) and a fresh agent wakes up, decides which tool it needs — see the room with a local vision model, express an emotion with a pre-choreographed move, move with composable head/body/antenna gestures, or answer questions about IoT sensor data in an AWS data lake — speaks one short sentence, and tears itself down.
Idle is pure-local and $0: no cloud, no LLM tokens, just an offline wake-word listener. The agent's brain defaults to a local Nemotron model via Ollama and its eyes are NVIDIA Cosmos Reason 2 running locally on the Thor GPU. Amazon Bedrock (Nova 2 Lite) remains an opt-in backend for the exact same agent and tools.

Related Blog Posts
A build series, one part per feature as it landed in the repo:
- The foundation — driving Reachy Mini Lite with Strands Agent
- Bringing the robot to life — Reachy Mini Python SDK hardware self-test
- Offline "Hey Reachy" wake-up with Vosk (no LLM)
- Local vision with NVIDIA Cosmos Reason 2
- The voice-assistant loop — wake, look, speak
- Asking the robot about IoT data in S3 Tables — Athena & Iceberg Q&A
- A second trigger — AWS IoT Core MQTT
- 80 SDK-provided emotion moves, by sentiment and voice prefix
- Idle presence — noticing who's around (humans vs cats)
- Real-time face tracking with a single camera owner
- Going fully local — Nemotron on Ollama, Amazon Bedrock optional
- Robot-state telemetry to AWS IoT Core
- Recording interactions to S3 with presigned URLs
- The media bus — one owner per device, fan out to many
- Conversational memory + composable motion tools
Technologies Used
- Compute: NVIDIA Jetson Thor (CUDA GPU, unified memory)
- Robot: Pollen Robotics Reachy Mini Lite over USB (6-DoF head, antennas, body, camera, mic, speaker)
- Agent: Strands Agent — a fresh per-wake agent with a hard model-call budget
- Local LLM: Nemotron (
nemotron-3-nano:30b) served by Ollama, function-calling enabled - Local VLM: NVIDIA Cosmos Reason 2 (
nvidia/Cosmos-Reason2-2B, a Qwen3-VL model) - Wake word / STT: Vosk small English model (offline)
- TTS: Piper (offline neural voice), falling back to
espeak-ng - Cloud (optional): AWS IoT Core, S3, Lambda, Athena, S3 Tables / Apache Iceberg, Amazon Bedrock (Nova 2 Lite)

Key Features
- Cost-minimal per-wake lifecycle — idle runs only the offline Vosk listener ($0); a brand-new agent exists only between wake and reply, then is torn down.
- Local-first brain & eyes — Nemotron via Ollama for reasoning and Cosmos Reason 2 for vision, both on the Thor GPU; Amazon Bedrock Nova 2 Lite is a drop-in swap with identical tools and prompt.
- Two trigger sources, one robot owner — an offline voice wake word and an optional AWS IoT Core MQTT subscription feed a single request queue drained by one worker, so the motors are never driven by two sources at once.
- Expressive motion — ~80 pre-choreographed emotion moves plus six composable primitive motion tools (nod, shake, look around, wiggle antennas, spin body, move head).
- Concurrent local loops — real-time face tracking (OpenCV) and an idle presence watcher (humans vs cats via Cosmos), sharing one camera owner.
- Camera/mic media bus — one broker owns each single-opener device and fans the live stream out over Unix sockets with per-subscriber backpressure isolation.
- Conversational memory across wakes — recent turns persist to local JSON (Strands Agent
FileSessionManager), reboot-safe and still $0 at idle. - Optional AWS paths — robot-state telemetry to IoT Core, interaction clips recorded to S3 with presigned URLs, and IoT data-lake Q&A over Athena/Iceberg via Lambda.
