video: a model says how long its clips can be (v0.3.4)
Township's clip lengths were tuned when the only video model could hold ~81
frames in one call, so a 70-second match became a dozen short cuts. LongCat was
pretrained on continuation and the server renders a long shot in segments, so
the same match wants a handful of long takes — and the frame numbers that suit
one are wrong for the other by a factor of four. Only the two starter templates
knew that, and only because someone typed it in.
Worse, nothing snapped a picked count onto what the model can emit:
random.randint handed the server lengths like 250, which is not 4n+1 for any
VAE and not on LongCat's 93+80k segment grid, so the server rounded and the
plan's own numbers became fiction. On LongCat that also silently costs
block-sparse attention, because every point of 93+80k is a 16n+13 count BSA
can tile and nothing between them is.
Server — codai/models/video_geometry.py is the geometry once: native rate, the
legal frame grid, how much ONE render holds, whether continuation is native,
and the side multiple below which the fast attention path is lost. Published
per model on /v1/models (ModelInfo.video) and used by the render path itself,
so what the server advertises and what it rounds to cannot drift. The numbers
were spread across three modules that could not tell a client; the literals
here are pinned to each source by tests, since the LongCat and H3 workers run
in 3.10 venvs this cannot import. models.json overrides every field.
Township — the five frame fields now default to 0 = AUTO: derive the budget
from the model's geometry and this tool's seconds band, then snap both ends and
every pick onto the model's grid. Seconds, not frames, because clip count falls
out of long_target / (frames/fps). An explicit number still wins, so a saved
config keeps exactly the budget it had. Entrances and the face-off get their own
shorter band instead of borrowing the fight budget (on LongCat that made every
entrance an 11-22s take). Outcome shares are snapped per shot and the total
rewritten, the per-render chunk comes from the model (Wan keeps its
conservative 50), and the chaining decision reads the published continuation
rather than matching the model's name.
At the defaults a 70s match goes from 9-11 Wan cuts to 4-6 LongCat takes, each
one request with native continuation, with BSA still on.
1607 tests pass; the 17 failures and the test_broker_protocol hang are
pre-existing and unrelated (verified with the diff stashed).
Co-Authored-By:
Claude Opus 5 <noreply@anthropic.com>
Showing
tests/test_video_geometry.py
0 → 100644
Please
register
or
sign in
to comment