Inspiration

An independent filmmaker who has just finished a short faces more than 3,000 festivals, each with its own genre fit, premiere rules, tiered deadlines, and a $25–85 entry fee. Choose wrong and you burn thousands of dollars finding out. Human festival strategists solve exactly this problem — and charge $1,500–5,000 per film, which prices out the filmmakers who need the help most.

ReelRelay does what a strategist does: researches, tiers, budgets, schedules, and pitches.

What it does

A Gemini-powered ADK SequentialAgent with five stages, passing work through session state:

  1. intake — normalizes the filmmaker's description into a structured film profile
  2. scout — calls the Parallel Search API at runtime to research currently-open festivals: deadlines, fees, recent lineups, programmer focus
  3. verify — calls the Parallel Extract API on candidates whose fee or deadline came back null, reading the festival's own submission page
  4. strategist — explains the plan computed in Python: tier balance, budget, premiere sequencing
  5. pitch — drafts a personalized cover letter for the top-priority festival, grounded in the research

The model researches; Python decides

Budget math, tier quotas, premiere sequencing and deadline ordering are not left to the model. A before_agent_callback runs build_plan() before the strategist speaks, so the agent receives a finished plan to explain rather than numbers to improvise. The plan is deterministic, unit-tested, and free of arithmetic hallucination.

The engine also refuses to guess. A candidate without a verified deadline or fee is set aside with a stated reason rather than filled in, because a fabricated deadline costs a filmmaker a real entry fee. Leftover budget never justifies funding a poor-fit festival.

How I built it

Google Cloud + Gemini via Vertex AI, the Agent Development Kit for the pipeline and session state, and the Parallel Search and Extract APIs for all live research. The strategy engine is plain Python with 105 tests. An offline fixture of deliberately fictional festivals on example.invalid lets the whole pipeline run without keys — and any run that touches it is force-graded UNVALIDATED, because a go/no-go answered with fictional festivals is worse than no answer.

Challenges I ran into

The honest one: is live web research actually good enough to plan a slate a filmmaker will spend real money on? That is an empirical question, so it got measured rather than assumed.

python -m reelrelay.validate --suite runs the shipping pipeline against real Parallel search for four films chosen to stress different corners of the data, then grades each run on candidate yield, why the unusable ones failed, tier coverage, plan viability, and groundedness — the share of candidates whose source_url actually appears in what Parallel returned. The scout is told never to invent festivals; this is where that is checked instead of trusted. Each profile earns GO / MARGINAL / NO-GO against published thresholds, and the suite takes the worst of them.

Two measurements changed the product:

  • The recorded baseline graded NO-GO, and every single unusable candidate was rejected for one reason: a missing entry fee. Fees live on the submission page, not in a search snippet. That measurement is what earned the Extract verify stage — it exists because the data demanded it, not because it seemed like a nice idea.
  • With the verify stage, the suite moved NO-GO → MARGINAL: usable rate 57% → 70%, and groundedness held at 100% across four films, four genres and three countries. The scout invented nothing.

Accomplishments that I'm proud of

It is still MARGINAL, and I would rather publish that than round it off. Both verdicts are committed in the repo as JSON next to the rubric that produced them.

The binding constraint has moved from yield to tier coverage: reach-tier festivals are precisely the ones that never publish a fee in a search snippet, so they arrive null, get set aside, and the reach minimum goes unmet. Naming the reason a system falls short is more useful to the next person than a clean number would be.

What I learned

Groundedness is worth more than fluency. Once the scout's URLs were checked against what search actually returned, the interesting questions stopped being "did the model make this up" and became ordinary engineering ones — coverage, batching, tier allocation.

And a rubric is only a rubric if you refuse to restate it after seeing the number.

What's next for ReelRelay

Deterministic verification sweeping every unverified page rather than leaving the choice to the model; deadline watch on Parallel's Monitor API, which turns a one-shot plan into a living pipeline as extensions and fee waivers appear; a submission kanban on Cloud Run; and multimodal trailer analysis, so the plan reflects how a film actually plays rather than how its logline reads.

Built With

Share this project:

Updates

Submission history