mirror of
https://github.com/calesthio/OpenMontage.git
synced 2026-08-05 15:20:40 +08:00
Fix .env loading for subagents, add LUMINA video + two new compositions
tools/base_tool.py now auto-loads .env at import time so API keys are available even when tools are imported directly (fixes silent zero-key fallback in subagents). Added LUMINA bioluminescent terrarium product ad embed to README. Two new demo compositions: 37 Trillion (one-key narrated explainer) and LUMINA (music-driven product ad, no narration).
This commit is contained in:
@@ -35,6 +35,12 @@ Turn your AI coding assistant into a full video production studio. Describe what
|
||||
|
||||
> **"VOID — Neural Interface"** — a product ad produced with just one API key (OpenAI). 4 AI-generated images (gpt-image-1), TTS narration, auto-sourced royalty-free music, word-level subtitles via WhisperX, and Remotion data visualizations. Total cost: **$0.69**. Zero manual asset work.
|
||||
|
||||
<div align="center">
|
||||
<video src="https://github.com/user-attachments/assets/08b108e6-c120-4fed-ab21-8549a71f4bd1" width="100%" controls></video>
|
||||
</div>
|
||||
|
||||
> **"LUMINA — Bioluminescent Terrarium"** — a product ad with zero narration, driven entirely by music, typography, and AI-generated imagery. 5 FLUX-generated images, cinematic ambient soundtrack from Pixabay, animated data visualizations (KPI grids, bar charts, comparison cards), and layered stat reveal overlays. Total cost: **$0.15**. No voiceover, no manual editing.
|
||||
|
||||
Works with **Claude Code, Cursor, Copilot, Windsurf, Codex** — any AI coding assistant that can read files and run code.
|
||||
|
||||
---
|
||||
|
||||
789
remotion-composer/public/demo-props/37-trillion.json
Normal file
789
remotion-composer/public/demo-props/37-trillion.json
Normal file
@@ -0,0 +1,789 @@
|
||||
{
|
||||
"cuts": [
|
||||
{
|
||||
"id": "scene-1-hero",
|
||||
"source": "",
|
||||
"in_seconds": 0,
|
||||
"out_seconds": 4,
|
||||
"type": "hero_title",
|
||||
"text": "37 TRILLION",
|
||||
"heroSubtitle": "The cells that make you, you",
|
||||
"backgroundColor": "#0F172A"
|
||||
},
|
||||
{
|
||||
"id": "scene-2-dividing",
|
||||
"source": "",
|
||||
"in_seconds": 4,
|
||||
"out_seconds": 9,
|
||||
"type": "stat_card",
|
||||
"stat": "25M",
|
||||
"subtitle": "cells dividing inside you right now, every single second",
|
||||
"accentColor": "#F59E0B",
|
||||
"backgroundColor": "#0F172A"
|
||||
},
|
||||
{
|
||||
"id": "scene-3-blood-cells",
|
||||
"source": "37-trillion/red-blood-cells.png",
|
||||
"in_seconds": 9,
|
||||
"out_seconds": 14,
|
||||
"type": "generated",
|
||||
"backgroundColor": "#0F172A"
|
||||
},
|
||||
{
|
||||
"id": "scene-4-kpi-overview",
|
||||
"source": "",
|
||||
"in_seconds": 14,
|
||||
"out_seconds": 20,
|
||||
"type": "kpi_grid",
|
||||
"title": "Your Cellular Universe",
|
||||
"columns": 4,
|
||||
"chartAnimation": "cascade",
|
||||
"backgroundColor": "#0F172A",
|
||||
"chartData": [
|
||||
{
|
||||
"label": "Total Cells",
|
||||
"value": 37.2,
|
||||
"suffix": " Trillion",
|
||||
"change": 0,
|
||||
"icon": "\ud83e\udec0"
|
||||
},
|
||||
{
|
||||
"label": "Red Blood Cells",
|
||||
"value": 70,
|
||||
"suffix": "%",
|
||||
"change": 25,
|
||||
"icon": "\u2764\ufe0f"
|
||||
},
|
||||
{
|
||||
"label": "Vessel Length",
|
||||
"value": 60,
|
||||
"suffix": "K miles",
|
||||
"change": 0,
|
||||
"icon": "\ud83d\udea2"
|
||||
},
|
||||
{
|
||||
"label": "Cell Types",
|
||||
"value": 200,
|
||||
"suffix": "+",
|
||||
"change": 0,
|
||||
"icon": "\ud83e\uddec"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "scene-5-mitochondria",
|
||||
"source": "37-trillion/mitochondria.png",
|
||||
"in_seconds": 20,
|
||||
"out_seconds": 25,
|
||||
"type": "generated",
|
||||
"backgroundColor": "#0F172A"
|
||||
},
|
||||
{
|
||||
"id": "scene-6-neurons",
|
||||
"source": "37-trillion/neurons.png",
|
||||
"in_seconds": 25,
|
||||
"out_seconds": 30,
|
||||
"type": "generated",
|
||||
"backgroundColor": "#0F172A"
|
||||
},
|
||||
{
|
||||
"id": "scene-7-cell-types",
|
||||
"source": "",
|
||||
"in_seconds": 30,
|
||||
"out_seconds": 35,
|
||||
"type": "bar_chart",
|
||||
"title": "Cell Types by Count",
|
||||
"chartAnimation": "grow-up",
|
||||
"showValues": true,
|
||||
"backgroundColor": "#0F172A",
|
||||
"chartColors": [
|
||||
"#F43F5E",
|
||||
"#10B981",
|
||||
"#F59E0B",
|
||||
"#8B5CF6",
|
||||
"#34D399",
|
||||
"#FBBF24"
|
||||
],
|
||||
"chartData": [
|
||||
{
|
||||
"label": "Red Blood",
|
||||
"value": 70
|
||||
},
|
||||
{
|
||||
"label": "Platelets",
|
||||
"value": 4.9
|
||||
},
|
||||
{
|
||||
"label": "Bone Marrow",
|
||||
"value": 2.5
|
||||
},
|
||||
{
|
||||
"label": "Endothelial",
|
||||
"value": 2.0
|
||||
},
|
||||
{
|
||||
"label": "Lymphocytes",
|
||||
"value": 1.5
|
||||
},
|
||||
{
|
||||
"label": "Muscle",
|
||||
"value": 0.5
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "scene-8-dna",
|
||||
"source": "37-trillion/dna-replication.png",
|
||||
"in_seconds": 35,
|
||||
"out_seconds": 40,
|
||||
"type": "generated",
|
||||
"backgroundColor": "#0F172A"
|
||||
},
|
||||
{
|
||||
"id": "scene-9-renewal",
|
||||
"source": "",
|
||||
"in_seconds": 40,
|
||||
"out_seconds": 46,
|
||||
"type": "pie_chart",
|
||||
"title": "Cell Renewal Cycle",
|
||||
"donut": true,
|
||||
"centerLabel": "Lifespan",
|
||||
"centerValue": "Varies",
|
||||
"chartAnimation": "spin",
|
||||
"backgroundColor": "#0F172A",
|
||||
"chartData": [
|
||||
{
|
||||
"label": "Gut Lining (3-5 days)",
|
||||
"value": 30
|
||||
},
|
||||
{
|
||||
"label": "Skin (2-3 weeks)",
|
||||
"value": 25
|
||||
},
|
||||
{
|
||||
"label": "Red Blood (120 days)",
|
||||
"value": 20
|
||||
},
|
||||
{
|
||||
"label": "Liver (300 days)",
|
||||
"value": 10
|
||||
},
|
||||
{
|
||||
"label": "Bone (10 years)",
|
||||
"value": 10
|
||||
},
|
||||
{
|
||||
"label": "Neurons (lifetime)",
|
||||
"value": 5
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "scene-10-closing",
|
||||
"source": "",
|
||||
"in_seconds": 46,
|
||||
"out_seconds": 50,
|
||||
"type": "text_card",
|
||||
"text": "Thirty-seven trillion cells.\nEach one alive. Each one working.\nAll of them, you.",
|
||||
"fontSize": 36,
|
||||
"color": "#F8FAFC",
|
||||
"backgroundColor": "#0F172A"
|
||||
}
|
||||
],
|
||||
"overlays": [
|
||||
{
|
||||
"id": "overlay-origin-section",
|
||||
"type": "section_title",
|
||||
"in_seconds": 0,
|
||||
"out_seconds": 9,
|
||||
"text": "THE ORIGIN",
|
||||
"subtitle": "What you are made of",
|
||||
"accentColor": "#F59E0B",
|
||||
"position": "top-left"
|
||||
},
|
||||
{
|
||||
"id": "overlay-stat-dividing",
|
||||
"type": "stat_reveal",
|
||||
"in_seconds": 4,
|
||||
"out_seconds": 9,
|
||||
"text": "25M/sec",
|
||||
"subtitle": "cells dividing right now",
|
||||
"accentColor": "#FBBF24",
|
||||
"position": "bottom-right"
|
||||
},
|
||||
{
|
||||
"id": "overlay-transport-section",
|
||||
"type": "section_title",
|
||||
"in_seconds": 9,
|
||||
"out_seconds": 20,
|
||||
"text": "THE TRANSPORT",
|
||||
"subtitle": "A river of life",
|
||||
"accentColor": "#F43F5E",
|
||||
"position": "top-left"
|
||||
},
|
||||
{
|
||||
"id": "overlay-stat-vessels",
|
||||
"type": "stat_reveal",
|
||||
"in_seconds": 9,
|
||||
"out_seconds": 14,
|
||||
"text": "60K",
|
||||
"subtitle": "miles of blood vessels",
|
||||
"accentColor": "#F43F5E",
|
||||
"position": "bottom-right"
|
||||
},
|
||||
{
|
||||
"id": "overlay-engine-section",
|
||||
"type": "section_title",
|
||||
"in_seconds": 20,
|
||||
"out_seconds": 35,
|
||||
"text": "THE ENGINE",
|
||||
"subtitle": "Power and intelligence",
|
||||
"accentColor": "#10B981",
|
||||
"position": "top-left"
|
||||
},
|
||||
{
|
||||
"id": "overlay-stat-speed",
|
||||
"type": "stat_reveal",
|
||||
"in_seconds": 25,
|
||||
"out_seconds": 30,
|
||||
"text": "200mph",
|
||||
"subtitle": "neural signal speed",
|
||||
"accentColor": "#8B5CF6",
|
||||
"position": "bottom-right"
|
||||
},
|
||||
{
|
||||
"id": "overlay-blueprint-section",
|
||||
"type": "section_title",
|
||||
"in_seconds": 35,
|
||||
"out_seconds": 46,
|
||||
"text": "THE BLUEPRINT",
|
||||
"subtitle": "Instructions for life",
|
||||
"accentColor": "#34D399",
|
||||
"position": "top-left"
|
||||
}
|
||||
],
|
||||
"captions": [
|
||||
{
|
||||
"word": "You",
|
||||
"startMs": 0,
|
||||
"endMs": 260
|
||||
},
|
||||
{
|
||||
"word": "are",
|
||||
"startMs": 260,
|
||||
"endMs": 460
|
||||
},
|
||||
{
|
||||
"word": "made",
|
||||
"startMs": 460,
|
||||
"endMs": 720
|
||||
},
|
||||
{
|
||||
"word": "of",
|
||||
"startMs": 720,
|
||||
"endMs": 980
|
||||
},
|
||||
{
|
||||
"word": "37",
|
||||
"startMs": 980,
|
||||
"endMs": 1580
|
||||
},
|
||||
{
|
||||
"word": "trillion",
|
||||
"startMs": 1580,
|
||||
"endMs": 2300
|
||||
},
|
||||
{
|
||||
"word": "cells.",
|
||||
"startMs": 2300,
|
||||
"endMs": 2700
|
||||
},
|
||||
{
|
||||
"word": "Right",
|
||||
"startMs": 3360,
|
||||
"endMs": 3480
|
||||
},
|
||||
{
|
||||
"word": "now,",
|
||||
"startMs": 3480,
|
||||
"endMs": 3780
|
||||
},
|
||||
{
|
||||
"word": "25",
|
||||
"startMs": 4120,
|
||||
"endMs": 4620
|
||||
},
|
||||
{
|
||||
"word": "million",
|
||||
"startMs": 4620,
|
||||
"endMs": 5040
|
||||
},
|
||||
{
|
||||
"word": "are",
|
||||
"startMs": 5040,
|
||||
"endMs": 5300
|
||||
},
|
||||
{
|
||||
"word": "dividing",
|
||||
"startMs": 5300,
|
||||
"endMs": 5740
|
||||
},
|
||||
{
|
||||
"word": "inside",
|
||||
"startMs": 5740,
|
||||
"endMs": 6160
|
||||
},
|
||||
{
|
||||
"word": "you.",
|
||||
"startMs": 6160,
|
||||
"endMs": 6500
|
||||
},
|
||||
{
|
||||
"word": "Red",
|
||||
"startMs": 7100,
|
||||
"endMs": 7240
|
||||
},
|
||||
{
|
||||
"word": "blood",
|
||||
"startMs": 7240,
|
||||
"endMs": 7460
|
||||
},
|
||||
{
|
||||
"word": "cells",
|
||||
"startMs": 7460,
|
||||
"endMs": 7860
|
||||
},
|
||||
{
|
||||
"word": "race",
|
||||
"startMs": 7860,
|
||||
"endMs": 8200
|
||||
},
|
||||
{
|
||||
"word": "through",
|
||||
"startMs": 8200,
|
||||
"endMs": 8520
|
||||
},
|
||||
{
|
||||
"word": "60",
|
||||
"startMs": 8520,
|
||||
"endMs": 8980
|
||||
},
|
||||
{
|
||||
"word": ",000",
|
||||
"startMs": 8980,
|
||||
"endMs": 9440
|
||||
},
|
||||
{
|
||||
"word": "miles",
|
||||
"startMs": 9440,
|
||||
"endMs": 9700
|
||||
},
|
||||
{
|
||||
"word": "of",
|
||||
"startMs": 9700,
|
||||
"endMs": 9880
|
||||
},
|
||||
{
|
||||
"word": "vessels,",
|
||||
"startMs": 9880,
|
||||
"endMs": 10280
|
||||
},
|
||||
{
|
||||
"word": "delivering",
|
||||
"startMs": 10700,
|
||||
"endMs": 10920
|
||||
},
|
||||
{
|
||||
"word": "oxygen",
|
||||
"startMs": 10920,
|
||||
"endMs": 11500
|
||||
},
|
||||
{
|
||||
"word": "to",
|
||||
"startMs": 11500,
|
||||
"endMs": 11780
|
||||
},
|
||||
{
|
||||
"word": "every",
|
||||
"startMs": 11780,
|
||||
"endMs": 12140
|
||||
},
|
||||
{
|
||||
"word": "corner",
|
||||
"startMs": 12140,
|
||||
"endMs": 12540
|
||||
},
|
||||
{
|
||||
"word": "of",
|
||||
"startMs": 12540,
|
||||
"endMs": 12760
|
||||
},
|
||||
{
|
||||
"word": "your",
|
||||
"startMs": 12760,
|
||||
"endMs": 12840
|
||||
},
|
||||
{
|
||||
"word": "body.",
|
||||
"startMs": 12840,
|
||||
"endMs": 13180
|
||||
},
|
||||
{
|
||||
"word": "Deep",
|
||||
"startMs": 13960,
|
||||
"endMs": 14080
|
||||
},
|
||||
{
|
||||
"word": "within",
|
||||
"startMs": 14080,
|
||||
"endMs": 14400
|
||||
},
|
||||
{
|
||||
"word": "each",
|
||||
"startMs": 14400,
|
||||
"endMs": 14700
|
||||
},
|
||||
{
|
||||
"word": "cell,",
|
||||
"startMs": 14700,
|
||||
"endMs": 15140
|
||||
},
|
||||
{
|
||||
"word": "mitochondria",
|
||||
"startMs": 15580,
|
||||
"endMs": 16200
|
||||
},
|
||||
{
|
||||
"word": "burn",
|
||||
"startMs": 16200,
|
||||
"endMs": 16480
|
||||
},
|
||||
{
|
||||
"word": "fuel",
|
||||
"startMs": 16480,
|
||||
"endMs": 16920
|
||||
},
|
||||
{
|
||||
"word": "into",
|
||||
"startMs": 16920,
|
||||
"endMs": 17280
|
||||
},
|
||||
{
|
||||
"word": "energy,",
|
||||
"startMs": 17280,
|
||||
"endMs": 17720
|
||||
},
|
||||
{
|
||||
"word": "powering",
|
||||
"startMs": 18160,
|
||||
"endMs": 18540
|
||||
},
|
||||
{
|
||||
"word": "everything",
|
||||
"startMs": 18540,
|
||||
"endMs": 19020
|
||||
},
|
||||
{
|
||||
"word": "you",
|
||||
"startMs": 19020,
|
||||
"endMs": 19260
|
||||
},
|
||||
{
|
||||
"word": "do.",
|
||||
"startMs": 19260,
|
||||
"endMs": 19440
|
||||
},
|
||||
{
|
||||
"word": "Your",
|
||||
"startMs": 20220,
|
||||
"endMs": 20480
|
||||
},
|
||||
{
|
||||
"word": "neurons",
|
||||
"startMs": 20480,
|
||||
"endMs": 20900
|
||||
},
|
||||
{
|
||||
"word": "fire",
|
||||
"startMs": 20900,
|
||||
"endMs": 21280
|
||||
},
|
||||
{
|
||||
"word": "electrical",
|
||||
"startMs": 21280,
|
||||
"endMs": 21840
|
||||
},
|
||||
{
|
||||
"word": "signals",
|
||||
"startMs": 21840,
|
||||
"endMs": 22300
|
||||
},
|
||||
{
|
||||
"word": "at",
|
||||
"startMs": 22300,
|
||||
"endMs": 22540
|
||||
},
|
||||
{
|
||||
"word": "200",
|
||||
"startMs": 22540,
|
||||
"endMs": 22980
|
||||
},
|
||||
{
|
||||
"word": "miles",
|
||||
"startMs": 22980,
|
||||
"endMs": 23420
|
||||
},
|
||||
{
|
||||
"word": "per",
|
||||
"startMs": 23420,
|
||||
"endMs": 23680
|
||||
},
|
||||
{
|
||||
"word": "hour,",
|
||||
"startMs": 23680,
|
||||
"endMs": 23960
|
||||
},
|
||||
{
|
||||
"word": "weaving",
|
||||
"startMs": 24400,
|
||||
"endMs": 24580
|
||||
},
|
||||
{
|
||||
"word": "thought,",
|
||||
"startMs": 24580,
|
||||
"endMs": 24980
|
||||
},
|
||||
{
|
||||
"word": "memory,",
|
||||
"startMs": 25520,
|
||||
"endMs": 25760
|
||||
},
|
||||
{
|
||||
"word": "and",
|
||||
"startMs": 26240,
|
||||
"endMs": 26400
|
||||
},
|
||||
{
|
||||
"word": "consciousness.",
|
||||
"startMs": 26400,
|
||||
"endMs": 26920
|
||||
},
|
||||
{
|
||||
"word": "And",
|
||||
"startMs": 27520,
|
||||
"endMs": 27820
|
||||
},
|
||||
{
|
||||
"word": "at",
|
||||
"startMs": 27820,
|
||||
"endMs": 27960
|
||||
},
|
||||
{
|
||||
"word": "the",
|
||||
"startMs": 27960,
|
||||
"endMs": 28080
|
||||
},
|
||||
{
|
||||
"word": "center",
|
||||
"startMs": 28080,
|
||||
"endMs": 28380
|
||||
},
|
||||
{
|
||||
"word": "of",
|
||||
"startMs": 28380,
|
||||
"endMs": 28580
|
||||
},
|
||||
{
|
||||
"word": "it",
|
||||
"startMs": 28580,
|
||||
"endMs": 28680
|
||||
},
|
||||
{
|
||||
"word": "all,",
|
||||
"startMs": 28680,
|
||||
"endMs": 28920
|
||||
},
|
||||
{
|
||||
"word": "DNA,",
|
||||
"startMs": 29360,
|
||||
"endMs": 29520
|
||||
},
|
||||
{
|
||||
"word": "a",
|
||||
"startMs": 30180,
|
||||
"endMs": 30240
|
||||
},
|
||||
{
|
||||
"word": "six",
|
||||
"startMs": 30240,
|
||||
"endMs": 30560
|
||||
},
|
||||
{
|
||||
"word": "-foot",
|
||||
"startMs": 30560,
|
||||
"endMs": 30700
|
||||
},
|
||||
{
|
||||
"word": "strand",
|
||||
"startMs": 30700,
|
||||
"endMs": 31080
|
||||
},
|
||||
{
|
||||
"word": "folded",
|
||||
"startMs": 31080,
|
||||
"endMs": 31640
|
||||
},
|
||||
{
|
||||
"word": "into",
|
||||
"startMs": 31640,
|
||||
"endMs": 31960
|
||||
},
|
||||
{
|
||||
"word": "a",
|
||||
"startMs": 31960,
|
||||
"endMs": 32080
|
||||
},
|
||||
{
|
||||
"word": "space",
|
||||
"startMs": 32080,
|
||||
"endMs": 32320
|
||||
},
|
||||
{
|
||||
"word": "smaller",
|
||||
"startMs": 32320,
|
||||
"endMs": 32840
|
||||
},
|
||||
{
|
||||
"word": "than",
|
||||
"startMs": 32840,
|
||||
"endMs": 33000
|
||||
},
|
||||
{
|
||||
"word": "a",
|
||||
"startMs": 33000,
|
||||
"endMs": 33120
|
||||
},
|
||||
{
|
||||
"word": "grain",
|
||||
"startMs": 33120,
|
||||
"endMs": 33340
|
||||
},
|
||||
{
|
||||
"word": "of",
|
||||
"startMs": 33340,
|
||||
"endMs": 33500
|
||||
},
|
||||
{
|
||||
"word": "sand,",
|
||||
"startMs": 33500,
|
||||
"endMs": 33900
|
||||
},
|
||||
{
|
||||
"word": "carrying",
|
||||
"startMs": 34400,
|
||||
"endMs": 34680
|
||||
},
|
||||
{
|
||||
"word": "the",
|
||||
"startMs": 34680,
|
||||
"endMs": 34900
|
||||
},
|
||||
{
|
||||
"word": "complete",
|
||||
"startMs": 34900,
|
||||
"endMs": 35280
|
||||
},
|
||||
{
|
||||
"word": "instructions",
|
||||
"startMs": 35280,
|
||||
"endMs": 35940
|
||||
},
|
||||
{
|
||||
"word": "for",
|
||||
"startMs": 35940,
|
||||
"endMs": 36280
|
||||
},
|
||||
{
|
||||
"word": "you.",
|
||||
"startMs": 36280,
|
||||
"endMs": 36480
|
||||
},
|
||||
{
|
||||
"word": "37",
|
||||
"startMs": 37040,
|
||||
"endMs": 37640
|
||||
},
|
||||
{
|
||||
"word": "trillion",
|
||||
"startMs": 37640,
|
||||
"endMs": 38140
|
||||
},
|
||||
{
|
||||
"word": "cells,",
|
||||
"startMs": 38140,
|
||||
"endMs": 38580
|
||||
},
|
||||
{
|
||||
"word": "each",
|
||||
"startMs": 39080,
|
||||
"endMs": 39340
|
||||
},
|
||||
{
|
||||
"word": "one",
|
||||
"startMs": 39340,
|
||||
"endMs": 39560
|
||||
},
|
||||
{
|
||||
"word": "alive,",
|
||||
"startMs": 39560,
|
||||
"endMs": 40000
|
||||
},
|
||||
{
|
||||
"word": "each",
|
||||
"startMs": 40580,
|
||||
"endMs": 40780
|
||||
},
|
||||
{
|
||||
"word": "one",
|
||||
"startMs": 40780,
|
||||
"endMs": 40960
|
||||
},
|
||||
{
|
||||
"word": "working,",
|
||||
"startMs": 40960,
|
||||
"endMs": 41400
|
||||
},
|
||||
{
|
||||
"word": "all",
|
||||
"startMs": 41860,
|
||||
"endMs": 42160
|
||||
},
|
||||
{
|
||||
"word": "of",
|
||||
"startMs": 42160,
|
||||
"endMs": 42320
|
||||
},
|
||||
{
|
||||
"word": "them,",
|
||||
"startMs": 42320,
|
||||
"endMs": 42540
|
||||
},
|
||||
{
|
||||
"word": "you.",
|
||||
"startMs": 42960,
|
||||
"endMs": 43220
|
||||
}
|
||||
],
|
||||
"audio": {
|
||||
"narration": {
|
||||
"src": "37-trillion/narration.mp3",
|
||||
"volume": 1
|
||||
},
|
||||
"music": {
|
||||
"src": "37-trillion/music.mp3",
|
||||
"volume": 0.08,
|
||||
"fadeInSeconds": 2,
|
||||
"fadeOutSeconds": 3
|
||||
}
|
||||
}
|
||||
}
|
||||
238
remotion-composer/public/demo-props/lumina.json
Normal file
238
remotion-composer/public/demo-props/lumina.json
Normal file
@@ -0,0 +1,238 @@
|
||||
{
|
||||
"cuts": [
|
||||
{
|
||||
"id": "scene-1-dark-open",
|
||||
"source": "",
|
||||
"in_seconds": 0,
|
||||
"out_seconds": 3,
|
||||
"type": "text_card",
|
||||
"text": "WHAT IF LIGHT...",
|
||||
"fontSize": 56,
|
||||
"color": "#22D3EE",
|
||||
"backgroundColor": "#030712"
|
||||
},
|
||||
{
|
||||
"id": "scene-2-bio-glow",
|
||||
"source": "lumina/bio-glow.png",
|
||||
"in_seconds": 3,
|
||||
"out_seconds": 7,
|
||||
"type": "generated",
|
||||
"backgroundColor": "#030712"
|
||||
},
|
||||
{
|
||||
"id": "scene-3-could-live",
|
||||
"source": "",
|
||||
"in_seconds": 7,
|
||||
"out_seconds": 10,
|
||||
"type": "text_card",
|
||||
"text": "...COULD LIVE?",
|
||||
"fontSize": 56,
|
||||
"color": "#A78BFA",
|
||||
"backgroundColor": "#030712"
|
||||
},
|
||||
{
|
||||
"id": "scene-4-mushroom",
|
||||
"source": "lumina/bio-mushroom.png",
|
||||
"in_seconds": 10,
|
||||
"out_seconds": 14,
|
||||
"type": "generated",
|
||||
"backgroundColor": "#030712"
|
||||
},
|
||||
{
|
||||
"id": "scene-5-bio-data",
|
||||
"source": "",
|
||||
"in_seconds": 14,
|
||||
"out_seconds": 19,
|
||||
"type": "kpi_grid",
|
||||
"title": "The Science of Living Light",
|
||||
"columns": 3,
|
||||
"chartAnimation": "cascade",
|
||||
"backgroundColor": "#030712",
|
||||
"chartData": [
|
||||
{
|
||||
"label": "Glow Duration",
|
||||
"value": 200,
|
||||
"prefix": "",
|
||||
"suffix": "+ hrs",
|
||||
"change": 100,
|
||||
"icon": "✨"
|
||||
},
|
||||
{
|
||||
"label": "Electricity",
|
||||
"value": 0,
|
||||
"prefix": "",
|
||||
"suffix": " watts",
|
||||
"change": 0,
|
||||
"icon": "⚡"
|
||||
},
|
||||
{
|
||||
"label": "Lifespan",
|
||||
"value": 2,
|
||||
"prefix": "",
|
||||
"suffix": "+ years",
|
||||
"change": 24,
|
||||
"icon": "🌱"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "scene-6-terrarium-hero",
|
||||
"source": "lumina/terrarium-hero.png",
|
||||
"in_seconds": 19,
|
||||
"out_seconds": 23,
|
||||
"type": "generated",
|
||||
"backgroundColor": "#030712"
|
||||
},
|
||||
{
|
||||
"id": "scene-7-reveal-title",
|
||||
"source": "",
|
||||
"in_seconds": 23,
|
||||
"out_seconds": 27,
|
||||
"type": "hero_title",
|
||||
"text": "LUMINA",
|
||||
"heroSubtitle": "A living nightlight. Engineered from nature.",
|
||||
"backgroundColor": "#030712"
|
||||
},
|
||||
{
|
||||
"id": "scene-8-interior",
|
||||
"source": "lumina/terrarium-interior.png",
|
||||
"in_seconds": 27,
|
||||
"out_seconds": 31,
|
||||
"type": "generated",
|
||||
"backgroundColor": "#030712"
|
||||
},
|
||||
{
|
||||
"id": "scene-9-comparison",
|
||||
"source": "",
|
||||
"in_seconds": 31,
|
||||
"out_seconds": 35,
|
||||
"type": "comparison",
|
||||
"title": "Rethink Your Nightlight",
|
||||
"leftLabel": "Traditional Lamp",
|
||||
"leftValue": "60W · $85/yr · Plastic",
|
||||
"rightLabel": "LUMINA",
|
||||
"rightValue": "0W · $0/yr · Living",
|
||||
"backgroundColor": "#030712",
|
||||
"color": "#F8FAFC"
|
||||
},
|
||||
{
|
||||
"id": "scene-10-bar-chart",
|
||||
"source": "",
|
||||
"in_seconds": 35,
|
||||
"out_seconds": 39,
|
||||
"type": "bar_chart",
|
||||
"title": "Glow Intensity by Species",
|
||||
"chartAnimation": "grow-up",
|
||||
"showValues": true,
|
||||
"backgroundColor": "#030712",
|
||||
"chartColors": ["#22D3EE", "#0D9488", "#3B82F6", "#A78BFA", "#F59E0B"],
|
||||
"chartData": [
|
||||
{ "label": "Sea Spark", "value": 95 },
|
||||
{ "label": "Panellus", "value": 92 },
|
||||
{ "label": "Dinoflagellate", "value": 87 },
|
||||
{ "label": "Mycena", "value": 78 },
|
||||
{ "label": "Foxfire", "value": 65 }
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "scene-11-lifestyle",
|
||||
"source": "lumina/terrarium-lifestyle.png",
|
||||
"in_seconds": 39,
|
||||
"out_seconds": 43,
|
||||
"type": "generated",
|
||||
"backgroundColor": "#030712"
|
||||
},
|
||||
{
|
||||
"id": "scene-12-cta",
|
||||
"source": "",
|
||||
"in_seconds": 43,
|
||||
"out_seconds": 48,
|
||||
"type": "stat_card",
|
||||
"stat": "$249",
|
||||
"subtitle": "Available Now · Free Worldwide Shipping · lumina.bio",
|
||||
"accentColor": "#22D3EE",
|
||||
"backgroundColor": "#030712"
|
||||
}
|
||||
],
|
||||
"overlays": [
|
||||
{
|
||||
"id": "overlay-mystery",
|
||||
"type": "section_title",
|
||||
"in_seconds": 0,
|
||||
"out_seconds": 14,
|
||||
"text": "MYSTERY",
|
||||
"subtitle": "What glows in the dark?",
|
||||
"accentColor": "#22D3EE",
|
||||
"position": "top-left"
|
||||
},
|
||||
{
|
||||
"id": "overlay-stat-ancient",
|
||||
"type": "stat_reveal",
|
||||
"in_seconds": 3,
|
||||
"out_seconds": 7,
|
||||
"text": "76%",
|
||||
"subtitle": "of deep sea life glows",
|
||||
"accentColor": "#3B82F6",
|
||||
"position": "bottom-right"
|
||||
},
|
||||
{
|
||||
"id": "overlay-stat-age",
|
||||
"type": "stat_reveal",
|
||||
"in_seconds": 10,
|
||||
"out_seconds": 14,
|
||||
"text": "4.5B yrs",
|
||||
"subtitle": "nature's oldest light",
|
||||
"accentColor": "#F59E0B",
|
||||
"position": "bottom-right"
|
||||
},
|
||||
{
|
||||
"id": "overlay-product",
|
||||
"type": "section_title",
|
||||
"in_seconds": 19,
|
||||
"out_seconds": 35,
|
||||
"text": "THE PRODUCT",
|
||||
"subtitle": "Engineered bioluminescence",
|
||||
"accentColor": "#0D9488",
|
||||
"position": "top-left"
|
||||
},
|
||||
{
|
||||
"id": "overlay-stat-zero",
|
||||
"type": "stat_reveal",
|
||||
"in_seconds": 27,
|
||||
"out_seconds": 31,
|
||||
"text": "0W",
|
||||
"subtitle": "zero electricity forever",
|
||||
"accentColor": "#22D3EE",
|
||||
"position": "bottom-right"
|
||||
},
|
||||
{
|
||||
"id": "overlay-proof",
|
||||
"type": "section_title",
|
||||
"in_seconds": 35,
|
||||
"out_seconds": 43,
|
||||
"text": "THE PROOF",
|
||||
"subtitle": "Data-driven beauty",
|
||||
"accentColor": "#A78BFA",
|
||||
"position": "top-left"
|
||||
},
|
||||
{
|
||||
"id": "overlay-close",
|
||||
"type": "section_title",
|
||||
"in_seconds": 43,
|
||||
"out_seconds": 48,
|
||||
"text": "AVAILABLE NOW",
|
||||
"subtitle": "lumina.bio",
|
||||
"accentColor": "#22D3EE",
|
||||
"position": "top-left"
|
||||
}
|
||||
],
|
||||
"captions": [],
|
||||
"audio": {
|
||||
"music": {
|
||||
"src": "lumina/music.mp3",
|
||||
"volume": 0.3,
|
||||
"fadeInSeconds": 2,
|
||||
"fadeOutSeconds": 3
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,31 @@ from pathlib import Path
|
||||
from typing import Any, Callable, Optional
|
||||
|
||||
|
||||
def _load_dotenv() -> None:
|
||||
"""Load .env into os.environ once at import time.
|
||||
|
||||
This ensures API keys are available before any tool is instantiated,
|
||||
even when tools are imported directly without going through the registry.
|
||||
Only sets variables that are not already in the environment.
|
||||
"""
|
||||
env_path = Path(__file__).resolve().parent.parent / ".env"
|
||||
if not env_path.is_file():
|
||||
return
|
||||
with open(env_path, encoding="utf-8", errors="ignore") as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if not line or line.startswith("#") or "=" not in line:
|
||||
continue
|
||||
key, _, value = line.partition("=")
|
||||
key = key.strip()
|
||||
value = value.strip().strip("'\"")
|
||||
if key and key not in os.environ:
|
||||
os.environ[key] = value
|
||||
|
||||
|
||||
_load_dotenv()
|
||||
|
||||
|
||||
class ToolTier(str, Enum):
|
||||
CORE = "core"
|
||||
VOICE = "voice"
|
||||
|
||||
Reference in New Issue
Block a user