Model orchestration
The creation engine is permanently separated from model providers. The app requests capabilities; the Router picks the model. A new model is a new adapter row — never a rebuild. Sora 2 is deliberately excluded: its API shuts down 24 Sept 2026, and this architecture is exactly why that costs nothing.
Testing on the cheap tier
not configuredThere is no free text-to-video API — not on OpenRouter, not from Google, and not on Hugging Face at any volume you could test with. What exists is a very cheap tier: Seedance 2.0 Mini at about 1.3 credits a second, so a five-second shot is roughly seven cents and a forty-shot short is under three dollars.
Storyboards cost nothing at all — Pollinations FLUX needs no key. Board the whole film free, approve the frames, then spend only on the shots that have to move. That is what the storyboard gate is for.
OPENROUTER_API_KEY is not set, so no OpenRouter model is live.
# .env.local OPENROUTER_API_KEY=sk-or-v1-... OPENROUTER_MAX_SPEND_USD=5 # refuses to submit past this
The ceiling is a refusal, not a warning, and it is checked against real recorded spend before every submission — so it survives a restart, which during a testing session happens constantly. The full testing strategy.
Video lineup
Image, audio & utility
Integration status — the honest version
- Mock adapter — fully implemented and always available. Produces deterministic, style-accurate animated SVG and synthesized WAV. Every part of the pipeline (routing, scoring, continuity, timeline, publishing) is exercised end to end without a single API key.
- Provider adapters — written against each vendor's documented API shape, but not executed against live endpoints in this build. Fields needing confirmation are marked
VERIFY:insrc/server/router/adapters/providers.ts. Any adapter failure degrades to the next model rather than breaking the app. - Quality scoring — a deterministic heuristic derived from each model's benchmark profile, not perceptual assessment. It is useful for ranking and for driving the Improve loop; the UI labels it as estimated.