Inspiration

A screenplay is a creative document. A production is a logistical one. Getting from one to the other means hundreds of decisions — how many shoot days, which locations, what a permit costs, which shots need VFX — and most of that work happens in spreadsheets, phone calls and someone's head.

We wanted to see whether a team of agents could do that translation while staying honest: never inventing a price, always showing where a claim came from, and admitting when a constraint can't be met.

What it does

Upload a screenplay PDF and CinePilot produces a complete production package:

  • Screenplay analysis — scenes, characters, locations, technical requirements
  • Budget analysis — preliminary cost breakdown by category
  • Production research — live, cited web research on permits, locations, equipment and safety rules for the screenplay's actual settings
  • Production plan — an evidence-backed strategy, with every recommendation traceable to a source
  • Storyboard — shot-by-shot camera plan with generated reference frames
  • Call sheet — an operational document, downloadable as PDF

Each output tab unlocks the moment its own stage finishes, so you watch the package assemble live rather than staring at a spinner.

Then the interesting part: you can change your mind. A producer can impose a new constraint on a finished package — "use a single location", "cut the budget by 30%", "shoot in three days" — and the agents re-plan against it. Only the decisions are recomputed; the screenplay analysis, budget and research still describe the same script, so they're reused rather than paid for again.

Asked to drop a train-station sequence and all VFX, CinePilot returned a single-apartment, practical-effects plan — and flagged the cost rather than pretending it was free:

The key challenge will be re-imagining the narrative climax (Scene 2) to fit the location.

How we built it

Google ADK drives the whole pipeline as a genuine multi-agent workflow, not a hand-rolled loop. A SequentialAgent chains the stages, and a nested ParallelAgent runs budget analysis and production research concurrently because neither depends on the other. State moves between agents through ADK's own output_key mechanism.

Gemini 2.5 Flash powers the reasoning agents; Gemini image generation produces storyboard frames.

Parallel is a real ADK tool, not decoration. production_research_agent calls Parallel's live search API, and every downstream agent is instructed to use only prices and claims traceable to that research — anything unverified is explicitly marked as needing a local quote.

Pydantic schemas validate every agent output before it becomes project state. An agent that emits malformed JSON fails that stage loudly instead of quietly becoming "the truth."

FastAPI + React/TypeScript, containerized and deployed to Cloud Run.

Challenges we ran into

The image model's quota is brutal. We fired 16 image requests concurrently and exactly 2 succeeded — the rest came back 429 RESOURCE_EXHAUSTED. Generating every shot inline pushed a run past 9 minutes with permanent failures. The fix was to generate one key frame per scene inline so the package is complete in ~4 minutes, then stream the remaining frames in from a background task where a quota rejection just means a frame arrives late instead of failing a stage.

A hang with no timeout is worse than a crash. The first outbound TLS connection of a fresh process occasionally never returned, and because nothing in the pipeline had a timeout, a project would sit at "running" forever with no error — the worst possible thing to happen in front of a user. We bounded the cold start: no workflow event within 90 seconds means tear down and retry once from a clean slate.

ADK binds an agent instance to exactly one parent. Reusing the same agents in the re-planning workflow raised a validation error, which pushed us to agent factory functions so each workflow composes its own instances.

Attributing failures inside concurrent agents. When budget and research run in parallel, a naive "current stage" tracker blames the wrong one. ADK's DynamicNodeFailError names the failing node, which let us mark exactly the stage that broke and label the rest as aborted.

Accomplishments that we're proud of

  • The re-planning loop genuinely re-reasons rather than re-generating, and the agents push back when a constraint has a cost.
  • Nothing is fabricated. Shots without a generated frame show a shot-spec placeholder, not a stock image; unverified prices are labeled as needing a quote.
  • Real ADK workflow primitives doing real work — concurrency where the dependency graph allows it, not sequential calls in a trench coat.
  • 11 passing integration tests covering the full pipeline, failure attribution across concurrent agents, and per-stage endpoint behavior.

What we learned

Schema validation at every agent boundary turned out to be the single highest -leverage decision — it converts "the model said something weird" from a silent data corruption into a loud, attributable failure.

We also learned that latency is a product decision, not just an engineering one. Moving image generation to the background didn't make it faster; it made the wait stop mattering.

What's next for CinePilot AI

  • Persistence — project state is currently in memory; Firestore would let packages survive restarts and scale past a single instance.
  • Output verification — an automated pass confirming every scene in the analysis traces back to the source PDF.
  • Deeper re-planning — constraints applied at the scene level, and diffing two plans side by side.
  • Quota headroom for full per-shot storyboard coverage.

Built With

Share this project:

Updates

Submission history