tiny_agent

built on tiny_agent · four boards · MIT

Pip shows you
which brain answered.

Press Pip's button and it winks before you let go: a Rete rule on a Pi Zero, no tokens spent. Hold the button and it answers out loud seconds later, from a tiny_agent loop on a Jetson. The strip under the face says which one just spoke.

See the scenes View on GitHub

Pip's screen: a violet thinking face over a speech bubble reading Let me think, and a status strip reading judge, 22C, jdg 3.2s, with the letters W F B C J.

320x240 on the panel, rendered from the same C++ the Pico runs. The bottom strip is the argument: rfx what the last rule cost, jdg what the last model call cost, and J or 5 for which model answered.

press to wink, over HTTP

757ms

at the brain, body answering over WiFi

hold to spoken answer

9.0s

four of them the microphone window, Jetson Orin Nano

camera frame to sentence

2.6s

SmolVLM-500M on the Jetson, 1.0 s warm

Jetson resident, all three

4.09GB

text model, VLM and cortex, against a 6.5 GB budget

Measured 2026-08-23 on the named devices. The wire between the Pico and the Pi Zero has not been timed yet, so the press number above is the HTTP path, which is the slow one.

four boards

One job each

Reflexes are rules, judgment is an agent, and the two run on different hardware so nobody has to take the claim on trust. The body only ever shows, sounds and senses, which is why its face loop never waits on the LAN.

body

Pico 2 W

The face, the status strip, the speech bubble, the button, light and temperature. A framed UART link to the brain at 921600, with WiFi HTTP as the fallback when the wire goes quiet.

brain

Pi Zero 2 W

Rete rules answer events with no model call at all. A tiny_agent loop wakes only on a held button. The scene director runs the demo. One binary, built on the Pi 5, deployed over SSH.

cortex

Jetson Orin Nano

Ears and eyes: whisper.cpp on CUDA for the microphone, a small VLM for the camera, and Qwen3-4B-Instruct-2507 for the judgment itself (a dial, not a constant: pip-llm swaps in the thinking variant or the older 3B). All three resident at once.

fallback mind and voice

Raspberry Pi 5

Piper turns the answer into 16 kHz PCM that streams down the wire to the speaker. A second llama-server stands by, so killing the Jetson changes the latency and one letter on the HUD, not the behaviour.

the demo

Six scenes, each one captioned

Every scene is a script on the brain, started with one POST and reachable by name. The screens below are dumped from the same rendering code the Pico runs, so they are pixels rather than mockups.

scene 1

reflex

Pip asks for a press and waits six seconds for a real one before staging the press itself, which is what lets the same script run with nobody at the desk. The wink is a rule firing: no model, no tokens.

curl -X POST http://<brain>:8080/scene -d '{"name":"reflex"}'
Pip winking with a small smile, status strip captioned reflex.

scene 1, second beat

judgment

Hold the button and ask something out loud. Listening face, then thinking, then the answer arrives spoken with the same words in the bubble. 9.0 s end to end on 2026-08-23, and the HUD carries both the time and the J that says the Jetson answered.

curl -s http://<brain>:8080/log?n=30
Violet thinking face, speech bubble reading Let me think, strip reading jdg 3.2s and J.

scene 2

night

Cover the light sensor. The face goes sleepy, a moon lights next to the lux bar, and the agent asks for a bright red LED. The guardrail gives it 40 out of 255 and Pip says so out loud. That is the rule layer overruling the model, on camera.

curl -X POST http://<brain>:8080/scene -d '{"name":"night"}'
Sleepy half-lidded eyes, a moon beside an empty lux bar, bubble reading Rule capped the LED to 40.

scene 3

fallback

The judgment layer is told to skip the Jetson for one answer. The cortex glyph goes grey, mind reads 5, and the Pi 5 answers instead. Pull the Jetson's power for the harder version; the screen looks the same.

curl -X POST http://<brain>:8080/scene -d '{"name":"fallback"}'
Happy squinting face, status strip with the C glyph dimmed and the mind letter reading 5.

scene 4

fever

A thumb on the RP2350 pushes it past 35 C and the temp.hot rule fires: alert face, amber ground, red LED. Another one with no model anywhere near it.

curl -X POST http://<brain>:8080/scene -d '{"name":"fever"}'
Wide alert eyes and a small round mouth on an amber ground, strip reading 36C and captioned fever.

scene 5

who

Pip takes a frame off the webcam and says one sentence about what is in front of it. The bubble below is a real answer from 2026-08-23, not a caption somebody wrote for the screenshot.

curl -X POST http://<brain>:8080/scene -d '{"name":"who"}'
Wide open eyes with a waveform glyph at the right, bubble reading The desk in the room has a clock on the wall.

scene 6

tour

Two minutes with nobody at the desk. Pip introduces each part in one sentence, then plays reflex, night and who with every wait staged, and ends on "That's all of me. Press my button any time." The brain boots straight into it with --tour.

curl -X POST http://<brain>:8080/scene -d '{"name":"tour"}'
Happy face with a speech bubble reading I'm Pip, status strip captioned tour.

beyond the scenes

It holds a conversation

Four things landed on 2026-08-23 that no scene captures:

Conversation capabilities
Memorythe last four exchanges ride into every prompt, so "what did I just ask you?" comes back right
The weba search tool (DuckDuckGo through the cortex) answers anything after the model's training; "latest OpenShift?" came back "4.22" in 8.5 s
Three languageswhisper auto-detects English, French or Arabic and the Pi 5 answers in the matching Piper voice
A model dialQwen3-4B-Instruct answers in seconds; pip-llm qwen3-4b-thinking trades 32 s of silent reasoning for a three-step riddle solved
A machinery tickerthe HUD caption narrates tiny_agent live, in colour with pixel icons: gold bolt rete hold-listen, magenta robot deep-agent, cyan magnifier tool search, green mic ears whisper; the mind glyph goes green for the Jetson, amber for the Pi 5
Pip's screen: magenta robot icon and deep-agent caption while judgment runs Pip's screen: cyan magnifier icon and tool search caption during a web search

reflex against judgment

What each layer costs

The point of splitting the two is that most of what a companion does never needs a model. Everything below came off the bench on 2026-08-23.

Measured latency per path
Path Where it runs Measured
Press to wink, body on WiFiPi Zero 2 W rule, HTTP both ways757 ms
Press to wink, body on the wiresame rule, one UART frame114 µs
Hold to spoken answerJetson text model, Pi 5 voice9.0 s
Microphone window inside thatwhisper base.en, CUDA4.5 s
Camera frame to one sentenceSmolVLM-500M, Jetson2.6 s
Text to 1.19 s of speechPiper on the Pi 5194 ms
Resident memory, three Jetson servicestext model, VLM, cortex4.09 GB

The two press numbers are the same rule with a different transport under it. The wire turns a TCP round trip into a rule match plus one framed UART write: 114 µs is the median rule time over the 2026-08-23 acceptance run (105 to 165 µs), and the whole event, rule included, stays under 330 µs at the brain. Method, raw output and the frames on this page live in the Pip repository.

where to start

Reading order

Pip is MIT licensed like tiny_agent, and every part of it is documented next to the code that does the work.

  • the anatomy

    README: the fleet table, the six steps from a press to a wink and from a hold to an answer, and the scene gallery with the command that starts each one.

  • the film

    docs/demo-script.md: four health checks, seven shots in filming order, and a troubleshooting table keyed on what the status strip shows.

  • the contracts

    PROTOCOL.md for the wire and the HTTP routes, brain/README.md for the endpoints and flags, and services/README.md for the cortex and voice, with the measurements behind every number here.

  • the hardware

    hardware/: the pin table, a pictorial and a WireViz harness, all generated from pins.hpp and checked against it in CI.