Two categories, kept strictly separate: known orchestration cost (text/reasoning agents, which can be estimated now) and unknown generation cost (video, image, voice), which must be measured with real provider quotes before any budget promise.
1. Planning estimates — text/reasoning per long-form video
From app/agents/registry.py. These are planning assumptions in USD, not provider quotes.
| Stage | Agent | Est. |
|---|---|---|
| Strategy / orchestration | 00 Director | 0.35 |
| Topic discovery | 01 Research | 0.25 |
| Biblical research | 02 Biblical research | 0.45 |
| Hermeneutics + attestations | 03 Hermeneutics | 0.55 |
| Script | 04 Scriptwriting | 0.40 |
| Storyboard | 05 Production | 0.30 |
| Voice | 06 Voice | 1.20 (assumption) |
| Thumbnails | 07 Thumbnail | 0.60 (assumption) |
| SEO | 08 SEO | 0.15 |
| Shorts (amortised) | 09 Shorts | 0.20 |
| Analytics | 11 Analytics | 0.10 |
| Subtotal | ≈ 4.55 |
2. Unknowns that dominate the real number
| Item | Status | Why it matters |
|---|---|---|
| Video generation (Runway or equivalent) | not quoted | Typically the largest line item per minute of footage |
| Image generation volume | not quoted | 30–60 stills per 8–10 min video |
| TTS licence and character volume | not quoted | Price per 1k characters × ~1,500 words |
| Music/SFX licensing | not quoted | Per-track or subscription |
| Bible translation licence | not quoted | Required before publication is possible at all |
| YouTube quota extension | free but approval-gated | Blocks the 4 + 20/month cadence if denied |
| Storage/egress | small | Renders and masters add up over a year |
Do not present a "cost per video" figure to the operator until each row above has a real quote and at least one end-to-end render has been measured.
3. Guard behaviour
The authorized ceiling is zero. authorized_external_ai_spend_usd defaults to 0.00, and
mandatory_monthly_subscriptions_usd is 0.00. This is an authorization boundary, not a claim
that services are free: a request that can produce an invoice is refused until the owner authorizes
that expenditure. The refusal reason distinguishes a zero ceiling from a per-request approval
requirement, because those are different asks.
What runs without asking: manual import, local inference, and already-acquired licensed assets.
What never runs without approval: anything whose cost_class is PAID. What is refused outright:
a provider that does not declare its cost class at all, because an unknown cost is treated as a
possible charge.
- Ordering rule: never spend on expensive assets until research and script pass validation. A failed script must cost cents, not dollars.
- Caching: storyboard prompts and thumbnails are content-addressed; identical inputs reuse assets.
- Model tiering: cheap models for classification/formatting, reasoning models only where exegesis or strategy requires it.
- Local work is not reported as free.
local_compute_estimate()prices electricity per run; hardware amortisation belongs in a separate depreciation line, because it is capital, not compute.
4. Reporting
provider_usage is append-only: provider, operation, units, unit type, cost per call, project. A
failed paid request that still billed is recorded too, which is the line that usually goes missing.
Weekly report includes: spend vs authorized ceiling, cost per published minute, cost per 1,000 views
(only when views exist), and the marginal cost of the next video at current settings.
GET /api/v1/providers/budget returns the ceiling, month-to-date spend, and the remaining balance,
with local compute shown separately from billable spend.
Source
Rendered from docs/COSTS.md at build time. Return to the
documentation index.