Repository navigation
Video input: the modality seam is extensible, but the current failure mode is a silent drop #9647
Replies: 3 comments
|
Thanks for the careful write-up — the per-lab modality table and the "it cannot come from metadata" fixture are the useful half of a report like this. I can only answer from the source (I am not a maintainer), but that bounds the question fairly tightly, and one part of your plan runs into a wall worth knowing before you build. 1. What is extensible and what is not
The serialization half is not extensible, and that is the half that matters. For pi-ai the conversion is ⇒ A plugin cannot widen the content vocabulary of an existing pi-ai route. The route that is open is a new provider route with its own adapter ( 2. The
|
|
Could you share a bit more detail about the issue and the steps to reproduce it? Logs or a minimal example would also help narrow down whether it’s a configuration problem or a bug in the harness. That should make it easier for others to investigate and suggest a fix. |
|
Thanks — both replies are useful, and one of them changes the plan. Repro question first. This is the fourth ask, and the walls are already mappedBefore my own answer: video has been requested in this repo four times — More useful is that the layer underneath this one is already diagnosed, repeatedly and in
So there are two walls, not one, and this post only covered the second: a One nuance those reports leave out, because it explains why this is so confusing in the field: the On the reproThere is no error to reproduce, and that is the finding: it is not a configuration problem and 1. The drop, minimally. default:
// Other merge-extensible blocks are not user-input vocabulary for pi-ai.
breakAnything else in a user message never reaches the wire and nothing is logged. So the repro is: 2. Why the omission costs something, provider-side. Measured 2026-10-13 against ffmpeg -hide_banner -loglevel error -y \
-f lavfi -i "color=c=blue:s=320x240:d=4,drawtext=text='FRAME %{n}':fontcolor=yellow:fontsize=28:x=20:y=100" \
-f lavfi -i "sine=frequency=880:duration=4" \
-c:v libx264 -pix_fmt yuv420p -c:a aac -shortest probe.mp4
The frame number is burned into the picture with A correction to my own postThe comparison table above attributes this placeholder to OpenClaw: That string is ZCode's, not OpenClaw's — 0 code-search hits in const VIDEO_OMISSION = "(video omitted: provider does not support video input)"Both omit visibly, so the argument in my post stands unchanged; the citation was mine and it was On the structural correction (argszero)Accepted — it kills the shape I sketched. One further constraint pushing the same way, which I had not checked: DSH has no Where I have to disagree — §2, the file paths. At the revision this post cites So "same durable log, opposite outcomes, decided by which protocol the route defaults to" does not §3 accepted, with two sharpenings. (a)
One thing neither reply raised, which decides whether this shipsThe durable half.
Concretely: the v4 session format namespaces an unknown content tag as Plan, updated
Question 1 (roadmap) still stands for the maintainers — as do the threads above, several of which Everything above is measured and sourced in a public repository — the harness landscape, the https://github.com/johnlam1968/harness-video-llm Two caveats I would rather state than be caught on. First, the evidence that the model reads |
Uh oh!
There was an error while loading. Please reload this page.
What I found
DSH keeps its own modality vocabulary, separate from pi's, and it is narrower in one place and wider in another. Both halves are worth a look.
Sources are
@ d743267388(0.2.1-alpha.2).The seam is already there, and documented as extensible
It's an
interfacewith a doc comment inviting extension, sovideocan be added by declaration merging without touching the harness. That's the right shape — no objection to it, only a note that nothing currently does.The failure mode is a silent drop
This is the part I'd flag.
userContent()in the pi-ai adapter ends in:So an unrecognised block is discarded and the request still succeeds. A user who attaches a video would get a confident, fluent, completely invented answer about a video the model never saw, with nothing in the transcript to indicate the media was dropped.
Every other harness I checked makes omission visible instead:
"(image omitted: model does not support images)"— per-model gate, both user messages and tool resultszai-org/zcode)"[Media omitted from provider request because the selected model does not support video input.]", plusomittedVideoCountobservability countersA silent drop is the one option of the three I'd argue against, independent of video: it converts a capability gap into a correctness bug that no one can diagnose from the transcript.
The catalog gap lands on DSH too
dsh-llm-pi-aireads pi's generated catalog, soMiniMax-M3.1-Flash-Previewdoesn't exist in DSH either. That's a one-line generator fix in pi and I've filed it there: https://github.com/earendil-works/pi/issues — the model works, it's just not listed.Evidence that the capability is real
Measured this week against MiniMax's Anthropic-compatible endpoint. Fixture: 4 s 320×240 mp4, blue background,
FRAME {n}burned into the picture, so a correct answer cannot come from metadata.{"type":"video","source":{"type":"base64","media_type":"video/mp4","data":…}}{"type":"image","source":{"type":"base64","media_type":"video/mp4","data":…}}image data url media type "video/mp4" not supported (2013)type:"audio"unsupported content type 'audio' (2013)Surveying
sst/models.dev(models/<lab>/<model>.toml,[modalities] input):text, image, **video**, audio, pdftext, image, audio, **video**text, image, **video**text, image, **video**text, image, **video**text, image, **video**text, image, pdftext, image, pdfVideo input is present at every Chinese frontier lab in that table and absent at both Western ones. For a harness from a Chinese lab, that split is the argument: the capability is on the model menu DSH's users actually choose from.
The reference implementation is small
zai-org/zcode (Apache-2.0, Z.ai's GLM harness) shipped native video by patching its vendored AI SDK rather than forking the protocol. Its entire wire layer:
One branch each, keyed on
mediaType.startsWith("video/"):Everything else in their implementation is the visible-omission policy and observability counters quoted in the table above.
Two questions
ModelModalityMapdeliberately left to adapters? I'd rather not build something that duplicates a planned harness change.default:drop — is that a deliberate fail-open, or just where the port stopped? If fail-open is intended I'd still suggest making it visible, since the alternative is a hallucinated answer with a clean-looking transcript.What I'd do instead, per CONTRIBUTING
I understand external PRs aren't being taken, so this is the ecosystem path: a plugin, published with the
dsh-plugintopic, that adds video input against MiniMax / GLM / Kimi / MiMo routes and reuses the same visible-omission rule rather than the silent drop.For the pi side,
pi2dshruns unmodified pi extensions as native DSH plugins, so the same payload-level work covers both hosts — but that's the more fragile half of the plan (version alignment across pi / pi2dsh / DSH is not yet verified) and I'd rather build the DSH plugin directly.Happy to be told this is already planned and get out of the way. I'll share the plugin either way.
All reactions