Conversation
…, negative prompts, and provider upgrades - Add dedicated prompts/video-prompter.md with structured cinematography language (shot type, camera movement, temporal progression, physics/realism guidance) - Add negativePrompt support to VideoProvider interface, threaded through video-resolver with defaults + archetype antiArtifactGuidance - Upgrade Kling from v2.1 standard to v2.6 Pro (same pricing, better physics) - Add cfg_scale parameter to Fal/Kling provider - Fix Veo config: remove unsupported params (personGeneration, enhancePrompt, generateAudio, negativePrompt) that veo-3.1-lite-generate-preview rejects - Fix factory videoModel routing: pass to GeminiVideo only, not FalVideo - Add motionPrompt and negativePrompt to VideoResolution for observability - Load video-prompter.md instead of image-prompter.md when mode="video"
|
@claude review |
|
Claude finished @tsensei's task in 1m 46s —— View job Code Review: feat(video) — video generation quality enhancement
Overall this is a clean, well-motivated PR. The Veo Forbidden-error fix alone makes it worth shipping, the negative-prompt plumbing is solid, and the test coverage is genuinely comprehensive. A few things worth a look before merge: Issues1.
|
- Add console.warn when negativePrompt is silently dropped by Gemini's veo-3.1-lite model (review finding #1, valid)
Code Review Response (Round 2)Finding 1: negativePrompt silently dropped for Gemini — Fixed ✅Added Finding 2: imageGenTimeMs always 0 — By design, not a bugThe // orchestrator.ts:284-286
if (videoResult.videoResolution) {
videoResult.videoResolution.imageGenTimeMs = imageGenTimeMs;
}The resolver doesn't know when image gen started (it receives a pre-generated image buffer), so it sets 0 and lets the caller fill in the actual timing. The final Finding 3: cfg_scale hardcoded — Design decision0.5 is Kling's documented default. It means "balanced between prompt adherence and model creativity." Making this configurable per-archetype is possible but premature — we'd need empirical data on which archetypes benefit from different values. If we add it later, it's a one-line change per archetype JSON + a new field on the interface. Not blocking. Finding 4: mimeType hardcoded as PNG — Design decisionAll image providers (Gemini Imagen, DALL-E) produce PNG. The Finding 5: pickDuration empty array fallback — Design decisionBoth Minor observations — Acknowledged
|
|
@claude review |
|
Claude finished @tsensei's task in 2m 35s —— View job Code Review: feat(video) — Round 3
Round 3 covers the current branch state after the round-2 fix (negativePrompt warn on New finding: motion-prompt LLM usage is silently discarded
const optimized = await optimizeImagePrompt(...);
motionPrompt = optimized.prompt;
// optimized.usage ← never usedThe
The video resolver is the only one that doesn't. As a result, video pipeline runs silently under-report LLM cost — every AI video scene incurs an LLM call that's never reflected in the cost estimate. The fix follows the music-resolver pattern: add a Confirmed from round 2 (no action needed)imageGenTimeMs = 0: Confirmed correct — cfg_scale, mimeType, pickDuration fallback: All confirmed as acceptable design decisions. No changes needed. Minor observation (new)
What's well done
Verdict: One substantive finding (LLM usage gap) worth addressing before merge — it's a one-field addition that aligns with the existing pattern in every other resolver. Everything else is clean. Good PR overall. |
The video resolver's optimizeImagePrompt call has real token cost but the returned usage was silently discarded. Every other resolver in the codebase (adaptive-resolver, music-resolver, orchestrator) accumulates LLM usage for cost reporting. This aligns video-resolver with that pattern: prompterUsage flows through VisualAssetResult to llmUsages.
Code Review Response (Round 3)Finding: motion prompter LLM usage silently discarded — Fixed ✅Good catch. What changed (commit 5f9aec6):
Pattern matches Minor observation: fal.ts existsSync vs gemini.ts — AcknowledgedThe asymmetry exists because Confirmed: orchestrator guard at line 285 — Acknowledged
397 tests passing. |
|
@claude review |
|
Claude finished @tsensei's task in 1m 41s —— View job Code Review: feat(video) — Round 4
Round 4 covers the current branch state after commit Round-3 fix verified: prompterUsage surfacing is correct
motionPrompt = optimized.prompt;
prompterUsage = optimized.usage; // ← capturedAll 3 exit paths return
if (r.usage) llmUsages.push(r.usage);
if (r.prompterUsage) llmUsages.push(r.prompterUsage);The Tests (
All prior design decisions confirmed
One minor observation (no action needed)
VerdictThis PR is ready to merge. All substantive issues across four rounds of review have been addressed. The round-3 LLM usage fix is complete and consistent with the pattern established by |
Summary
Video generation quality enhancement for OpenReels v0.17.0. Two commits:
Video Quality Enhancement:
prompts/video-prompter.mdwith structured cinematography language (shot type, subject, action, camera movement, lighting, style)antiArtifactGuidancecfg_scale: 0.5passed to Kling APIpersonGeneration,enhancePrompt,generateAudio,negativePromptparams thatveo-3.1-lite-generate-previewrejects (was causing Forbidden errors)videoModelrouting: GeminiVideo receives override in both primary/secondary positions, FalVideo always uses its own defaultmotionPromptandnegativePromptlogged inVideoResolutionmetadata for observabilityDocumentation:
Test Coverage
Tests: 44 files, 395 passing (was 349 on main)
New tests cover:
Pre-Landing Review
No issues found. No frontend files changed. No prompt eval files matched.
TODOS
2 new items added:
Test plan
🤖 Generated with Claude Code