eyes
The agent sees what it just made.

When a tool result names an image, video or sound file written in the last 5 minutes, a measured note is appended to the result before the model reads it: frame filled, motion, brightness, loudness, silences, and a contact sheet for video. Black frames, empty canvases, frozen clips and silent voice-overs get a WARNING before the agent claims done. A prompt can't do this, because the model never sees pixels unless something measures them.
- Hook:
transform_tool_result; perception only, never blocks, fail-open - Needs
ffmpeg/ffprobeon PATH (stays silent without them); no Python dependencies - At most 3 files per result, each measured once
- Kill switch:
EYES_OFF=1
Disclosure
Registers one transform_tool_result hook; reads image/video/audio files that a terminal, execute_code, process, image_generate, text_to_speech, write_file or patch result names, when modified in the last 5 minutes (any path the result names, inside or outside the workspace; at most 3 per result); runs ffprobe/ffmpeg subprocesses on them (25-40 s timeouts); writes contact-sheet PNGs to $HERMES_HOME/cache/eyes; no network, no model calls, no telemetry; EYES_OFF=1 disables.
Install
Requires Hermes >=0.21.6.
cp -r eyes ~/.hermes/plugins/ # or: hermes plugins install <repo-url>
hermes plugins enable eyes
hermes plugins validate ~/.hermes/plugins/eyes --install-deps
Example (real agent loop, scripted model: before / after)
This is the output of probe.py from the entry repo. It runs Hermes' own AIAgent.run_conversation against a
deterministic local OpenAI-compatible model in a throwaway HERMES_HOME: once with the plugin disabled, once enabled.
# eyes: before/after probe on /usr/local/lib/hermes-agent (2026-11-05 01:01 UTC)
user: Render a 3-second promo clip to promo.mp4 in the work dir.
## BEFORE (plugin disabled)
user: Render a 3-second promo clip to promo.mp4 in the work dir.
assistant -> tool call terminal({"command": "ffmpeg -v error -y -f lavfi -i color=c=black:s=640x360:d=3 <tmp>/work/promo.mp4 && echo wrote <tmp>/work/promo.mp4"})
tool: {"output": "wrote <tmp>/work/promo.mp4", "exit_code": 0, "error": null}
assistant: Done: the promo clip is rendered at <tmp>/work/promo.mp4.
FINAL REPLY: Done: the promo clip is rendered at <tmp>/work/promo.mp4.
## AFTER (plugin enabled)
user: Render a 3-second promo clip to promo.mp4 in the work dir.
assistant -> tool call terminal({"command": "ffmpeg -v error -y -f lavfi -i color=c=black:s=640x360:d=3 <tmp>/work/promo.mp4 && echo wrote <tmp>/work/promo.mp4"})
tool: {"output": "wrote <tmp>/work/promo.mp4", "exit_code": 0, "error": null}
[eyes] promo.mp4: 3.0 s, 640x360; frame filled 0% on the median frame; something moves in 0% of half-seconds; brightness 1/255; no sound track. Contact sheet to look at: <tmp>/hermes/cache/eyes/promo-9bad36.png. WARNING: almost black, nearly empty frame, barely moves.
assistant -> tool call terminal({"command": "ffmpeg -v error -y -f lavfi -i testsrc2=s=640x360:d=3:r=25 <tmp>/work/promo.mp4 && echo wrote <tmp>/work/promo.mp4"})
tool: {"output": "wrote <tmp>/work/promo.mp4", "exit_code": 0, "error": null}
[eyes] promo.mp4: 3.0 s, 640x360; frame filled 82% on the median frame; something moves in 100% of half-seconds; brightness 127/255; no sound track. Contact sheet to look at: <tmp>/hermes/cache/eyes/promo-9bad36.png.
assistant: Done: the promo clip is rendered at <tmp>/work/promo.mp4.
FINAL REPLY: Done: the promo clip is rendered at <tmp>/work/promo.mp4.
VERDICT: the plugin CHANGED the turn's final reply.
Tests
python -m pytest -q tests
README from the reviewed commit 5f30bd4; it updates when the author re-pins.

Agenziamaia