diff --git a/README.md b/README.md index 83af1a95..ef4ee78a 100644 --- a/README.md +++ b/README.md @@ -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. +
+ +
+ +> **"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. --- diff --git a/remotion-composer/public/demo-props/37-trillion.json b/remotion-composer/public/demo-props/37-trillion.json new file mode 100644 index 00000000..160e6b70 --- /dev/null +++ b/remotion-composer/public/demo-props/37-trillion.json @@ -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 + } + } +} \ No newline at end of file diff --git a/remotion-composer/public/demo-props/lumina.json b/remotion-composer/public/demo-props/lumina.json new file mode 100644 index 00000000..7da1ef99 --- /dev/null +++ b/remotion-composer/public/demo-props/lumina.json @@ -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 + } + } +} \ No newline at end of file diff --git a/tools/base_tool.py b/tools/base_tool.py index a40c774e..88f7dddf 100644 --- a/tools/base_tool.py +++ b/tools/base_tool.py @@ -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"