Video understanding without a pipeline
The first plan treated video like a new corpus product: acquire media, transcribe it, build timestamped nodes, index it, deduplicate it, and eventually give it a database. That architecture is defensible if the job is to operate a video library. It is unnecessary if the job is usually, "understand this video and answer my question."
Hermes already has most of the useful primitives. The new design starts there and refuses to create infrastructure until real use proves something is missing.
The routing rule
Short controlled direct-video canaries are green in Milo. The 17-minute inline Tonbi canary failed semantic verification even though transport succeeded. A separate provider-native Files API probe passed with a QA correction, but it is not yet part of Hermes video_analyze; Roxy remains separately gated.
| Source | First tool | What it can support |
|---|---|---|
| YouTube with public captions | youtube-content | Spoken claims, chapters, quotes, and timestamp links |
| Official event page, transcript, deck, or PDF | web_extract | Canonical page or document evidence; no invented video timestamps |
| Direct permitted clip under the measured limit | video_analyze | Model-observed visual action and broad audio events; never a verbatim transcript |
| Gated, DRM, captionless, oversized, or dynamic-player source | Stop | Report the limitation and request a permitted artifact |
What is proven today
| Primitive | Measured state | Call |
|---|---|---|
web_extract | Passed canonical HTML and official PDF canaries against Apple and Manulife sources | Green in Milo |
youtube-content | Dependency installed in the Hermes runtime; provenance regression suite passed 3/3 and a live timestamped transcript canary passed | Green in Milo |
video_analyze | Short controlled URL and local-file canaries passed. The full 17-minute inline Tonbi run was accepted but hallucinated unrelated content. A separate provider-native Files API probe recovered a useful answer with QA corrections. | Inline long fails; Files API passes* |
A real YouTube ingestion: Tonbi
We ran the text-first route against Tonbi's Feeding GBrain Your Emails Autonomously with Hermes Agent.[6] The result was a complete 17:06 English transcript with 420 timestamped segments. YouTube reported the captions as auto-generated, so the timestamps are useful evidence while the wording is not treated as verbatim.
| Field | Ingested result |
|---|---|
| Route | youtube-content; no downloader, media capture, or direct-video model |
| Provenance | English, auto-generated captions; 420 segments; 17:06 |
| Core pattern | Deterministic script collects; agent applies judgment; the knowledge system remembers |
| Security boundary | Allowlisted senders expose content; unknown senders remain in human review; existing entities are updated but new ones are not created autonomously |
| Artifact | Full timestamped transcript retained locally for audit and re-use |
The ingestion recovered the workflow cleanly:
- 01:59 — "The script collects, agent judges, brain remembers." Deterministic output belongs in code; judgment belongs in the model.
- 07:16 — the collector pulls Gmail through Google's Workspace CLI, removes bulk/no-reply noise, applies an allowlist, deduplicates by message ID, and builds Gmail links in code.
- 08:16 — Hermes writes typed front matter, exact subjects, sender wiki links, short quotations, original-message links, action items, and a review section instead of a generic prose blob.
- 11:57 — unknown senders are physically reviewed to reduce spam, prompt injection, and knowledge-graph poisoning.
- 13:03 — the demonstrated run produced one allowlisted message, one review candidate, and additional messages dropped as noise.
video_analyze as if it were a direct media file.
Native-video follow-up: accepted transport, failed semantics
At James's request, we then made an explicit one-off exception to the provisional direct-video envelope and ran the full locally acquired media rendition through Hermes video_analyze. The file was 20.47 MiB, 640×360, and 17:04.163. That is shorter than YouTube's displayed 17:06 and outside both initial guardrails: under three minutes and under 15 MiB. It was not represented as a short excerpt.
| Measured field | Full Tonbi result |
|---|---|
| Hermes transport | success:true; first completion returned in 18.09 seconds |
| Semantic acceptance | FAIL — the first answer recast Tonbi as a CI/security product and invented GitHub Actions, PR gates, tonbi.yaml, and a CLI scanner |
| Constrained retry | FAIL — it recovered the broad topic only after being told it, then invented second-long scene timings, collector.py, JSON fields, commands, and terminal logs not present on screen |
| Independent frame check | Confirmed the actual slides and terminal result below; these observations are QA evidence, not claims produced reliably by the full-video model run |
Independent frames showed what the model should have reported:
- “THE BRAIN GETS AN INBOX.” with the actual thesis: “script collects → agent judges → brain remembers.”
- “GOOGLE BUILT A CLI FOR AGENTS.” describing
gws, Gmail-only scope, OS-keyring credentials, and a pipeline that never sends, deletes, or labels mail. - “THE COLLECTOR NEVER GETS CREATIVE.” separating deterministic collection from all GBrain writes through MCP during the agent turn.
- “SAME EMAIL, TWO PAGES.” contrasting a typed, linkable contract with an unstructured prose blob.
- The demonstrated terminal result:
filed 1 · updated none · review 1, with one allowlisted message, one review candidate, four noise messages dropped, and the brain growing from 29 to 30 pages. - “YOUR INBOX IS UNTRUSTED INPUT.” with collector, protocol, and human gates: allowlisted content, known-page updates only, and daily review.
success:true response was safe to publish as visual evidence. Captions remain the production route for this source; bounded clips remain the accepted Hermes-native lane, while the Files API result below is a reviewed provider-native escalation rather than a wired Hermes capability.
Measured token usage and cost
Hermes's current video_analyze result exposes the completion but not provider usage metadata. To measure rather than guess, we sent the same full file and a constrained prompt through the same native Gemini 3.6 Flash endpoint. Google reported 93,187 video tokens plus 141 text-input tokens, 95 candidate tokens, and 2,400 thinking tokens. That metered call took 21.415 seconds. Its output was truncated and was not used as content evidence.
| Billing component | Measured tokens | Standard rate | Cost |
|---|---|---|---|
| Input | 93,328 | $1.50 / 1M | $0.139992 |
| Output, including thinking | 2,495 | $7.50 / 1M | $0.018712 |
| Measured native call | 95,823 total | Standard tier | $0.158704, or about $0.159 |
Those rates come from Google's official Gemini 3.6 Flash standard-tier pricing.[7] Because the Hermes wrapper did not expose usage for its two attempts, their exact charges are unavailable. The same-file measurement puts each attempt at roughly $0.16–$0.18, depending on generated and thinking tokens. Including the two Hermes attempts and the one metered native call, this investigation cost approximately $0.48–$0.52. That total is explicitly an estimate; $0.158704 is the measured reference call.
Files API follow-up: usable after QA
The first full-video experiment used inline bytes because that is what the patched Hermes adapter emits. Google's current guidance points elsewhere for this source: inline data is intended for short, one-off video, while the Files API is recommended when duration is significant or the same media will support multiple prompts.[5][8] We therefore uploaded the same 20.47 MiB, 17:04.163 MP4 through Gemini's resumable Files API, waited for its state to become ACTIVE, referenced its file URI in generateContent, and deleted it immediately after the response. A list-after-delete check found zero retained files.
| Files API stage | Measured result |
|---|---|
| Upload | 3.435 seconds |
| Provider processing | 20.746 seconds |
| Gemini generation | 14.426 seconds |
| End to end | 38.640 seconds |
The result was materially better than the inline runs. Without being given the answers, Gemini identified the real script collects → agent judges → brain remembers architecture; named the major visible slide sequence; described the collector's no-LLM/no-direct-write boundary; distinguished the structured page contract from the blob; recovered the demonstrated 1 allowlisted / 1 review / 4 noise dropped counts; and reported the three visible security gates. Those claims align with the caption track and sampled frames.
| Files API billing component | Measured tokens | Standard rate | Cost |
|---|---|---|---|
| Input | 93,331: 93,187 video + 144 text | $1.50 / 1M | $0.139997 |
| Output | 1,683 | $7.50 / 1M | $0.012623 |
| Files API inference | 95,014 total | Standard tier | $0.152619, or about $0.153 |
The Files API itself is available at no cost; inference tokens are billed normally.[7][8] This run reported no separate thinking-token count. The better route was slightly cheaper than the $0.159 metered inline reference because it produced 1,683 answer tokens without the inline probe's 2,400 thinking tokens. Added to the earlier inline investigation, cumulative measured/estimated spend for all four full-video calls was approximately $0.632–$0.672.
The video result required more than selecting a model name. Hermes emits an OpenAI-shaped video_url data URL. In v0.20.0, the native Gemini adapter translated image_url into Gemini inlineData but silently dropped video_url. We added a regression test, watched it fail, made the adapter treat both media types consistently, and then passed 9 native-adapter tests and 41 combined adapter/vision tests.[4][5]
| Video path | Latency | Observed answer |
|---|---|---|
| Direct native Gemini API | 5.520 s | White rabbit, butterfly, falling apple, no spoken dialogue; Google reported 910 video prompt tokens |
Hermes video_analyze, direct URL | 7.248 s | White rabbit, butterflies, meadow, apple, music, no speech |
Hermes video_analyze, local file | 5.493 s | White rabbit, butterfly, meadow, music, no speech |
The negative matrix still matters. Copilot Gemini, Anthropic, xAI, OpenAI Codex, Nous Portal, and the tested local Qwen endpoint did not preserve or accept this payload. Several returned ordinary refusal prose while Hermes reported success:true. That boolean proves a completion arrived, not that the model saw the clip.
James/Milo and Bob/Roxy
| James/Milo | Bob/Roxy | |
|---|---|---|
| Default behavior | Answer on demand; save a curated Obsidian note when useful | Answer on demand inside the locked cited-research scope |
| YouTube | Live timestamped canary passed with reported caption provenance | Canary from Bob's actual hosted egress; no proxy workaround if YouTube blocks it |
| Web sources | Canonical HTML and official PDF canaries passed | Same path through the hosted Tool Gateway; hosted canary pending |
| Direct video | Bounded video_analyze clips pass; the full inline run failed, while a separate provider-native Files API probe passed with QA corrections | Off by default; requires the adapter fix plus its own credential, privacy, cost, and semantic canary |
| Storage | Obsidian only when the answer deserves to survive | Ordinary document path after Bob's corpus exists; no media database |
Evidence rules
- YouTube captions may support spoken claims and timestamp links. The patched helper preserves API-reported language and generated/manual status; missing provenance remains unknown rather than inferred.
- An official transcript, page, deck, or PDF supports only the granularity it actually contains. A page citation is not a video timestamp.
video_analyzeoutput is model-observed. It may describe a chart, demo, setting, or action. It is not a verbatim quote, andsuccess:trueis rejected when independent frames or captions contradict it.- If text and visual analysis conflict, show both sources rather than smoothing them into one confident answer.
The YouTube helper correction is complete: requested fallback languages stay separate from observed caption metadata, embedded snippet newlines are normalized, and three regression tests cover provenance and serialization behavior.[1]
When storage becomes justified
A database is not triggered by an arbitrary use count. The signal is repeated retrieval: the same source is queried again, one question spans several sources, or the same transcript would otherwise be fetched for a third time. A small permitted transcript cache may be enough. A structured corpus remains a separate decision.
Independent review
We sent the replacement plan and early failures to Claude Opus 5 through Nous. It returned APPROVE-WITH-CHANGES. The useful constraints survived: text first, honest caption provenance, a bounded direct-video envelope, Bob-hosted egress testing, separate profile activation, and retrieval-driven storage. The short direct-video lane is real in Milo; the Tonbi comparison shows that long inline video remains unsafe while the provider-native Files API is promising only with explicit QA. The separate Roxy gate remains.
Two reviewer claims did not survive verification. The failed automatic route was not running Opus 5, and the suggested local Qwen3-VL endpoint rejected Hermes's video_url payload with HTTP 422. Independent review is evidence, not authority.
What remains
- Upstream the tested
video_urlto GeminiinlineDataadapter fix so a Hermes update cannot overwrite the local correction. - Repeat the text-first canaries in Bob's actual hosted profile and egress.
- Keep long-form inline video outside the accepted envelope. Evaluate a narrow Hermes Files API integration with repeat canaries and mandatory semantic QA before treating it as a supported route.
- Keep Roxy's direct-video route off until the hosted build contains the fix and her own credential, privacy, cost, and semantic canary passes.
- Write one versioned shared operating skill and install reviewed, profile-scoped copies.
Sources
- Hermes bundled youtube-content skill
- Hermes built-in tools reference
- Hermes model and auxiliary-model configuration
- Hermes video_analyze implementation
- Google Gemini video-understanding documentation
- Tonbi's AI Garage — Feeding GBrain Your Emails Autonomously with Hermes Agent
- Google Gemini 3.6 Flash pricing
- Google Gemini Files API documentation