# app.py import os import asyncio from uuid import uuid4 import gradio as gr import dollar_agent_system import Backend_image_service from main import generate_video_job # Your existing logic # Use your Replicate token (already valid until Dec 10 2025) os.environ["REPLICATE_API_TOKEN"] = "r8_aDneqhDmm0AbVwf6gheYczlfgrgQuDZ4TG3Er" os.environ["FAL_AI_API_KEY"] = os.getenv("FAL_AI_API_KEY", "") # optional async def generate(prompt: str, budget: float): job_id = uuid4().hex[:8] status = gr.Info("Generating video... (Pika → Luma → Kling → Runway → Sora)") try: path = await generate_video_job(prompt, budget, job_id) return path, None except Exception as e: return None, f"Failed: {str(e)}" def gradio_wrapper(prompt, budget): return asyncio.run(generate(prompt, budget)) with gr.Blocks(title="Dollar-AI • $1 Autonomous Short Films") as demo: gr.Markdown("# Dollar-AI\n**$1 autonomous short-form video generator** — Pika • Luma • Kling • Runway • Sora") with gr.Row(): prompt = gr.Textbox(label="Prompt", placeholder="A red panda doing parkour in a cyberpunk city at night...", lines=3) with gr.Row(): budget = gr.Slider(0.3, 5.0, value=1.5, step=0.1, label="Budget (USD)") generate_btn = gr.Button("Generate Video ($1–$3)", variant="primary") with gr.Row(): video = gr.Video(label="Your Video") error = gr.Textbox(label="Error", visible=False) generate_btn.click( fn=gradio_wrapper, inputs=[prompt, budget], outputs=[video, error] ) gr.Examples([ ["A cyberpunk cat riding a neon motorcycle through rain, cinematic, epic camera angles", 1.8], ["A tiny astronaut floating inside a glowing jellyfish in deep space, surreal, 35mm", 2.2], ["1990s anime girl with pink hair eating ramen in a rainy Tokyo alley, vaporwave aesthetic", 1.5], ], inputs=[prompt, budget]) demo.queue(max_size=10).launch()