Felo API PlatformFelo API Platform

Konten

Buat video motion graphics dengan HTML dan Opus 5.5

Tulis beat sheet, minta Opus 5.5 menulis adegan HTML deterministik lewat Felo API, tangkap frame dengan Playwright, dan encode MP4 dengan ffmpeg. Berjalan di WorkBuddy, ChatGPT dengan eksekusi kode, Codex, Pi Agent, atau Claude Code.

Waktu45 menitTingkatMenengahDiperbarui2026-10-30
Untuk siapaKreatorMotion designerDeveloper independen

Salin prompt

Ganti kolom dalam kurung siku lalu tempel ke Claude Code, Codex, atau AI dengan akses terminal. Ia memasang skill Felo, bertanya sebelum memakai kredit, dan menjalankan alur kerja.

Buat video [durasi] detik, format [vertikal / horizontal], tentang [ide].
Gaya: [gaya]. Audiens: [audiens]. Audio: [tanpa / trek berlisensi di ./audio.mp3 / TTS].

Kamu berjalan di folder dengan terminal dan [WorkBuddy / ChatGPT dengan eksekusi kode / Codex / Pi Agent / Claude Code]. Jika tidak bisa menjalankan Node dan browser headless, berhenti dan beri tahu saya, jangan berpura-pura sudah merender.

Ikuti urutan ini:
1. Tulis storyboard 3–6 beat dengan detik mulai dan selesai yang tepat.
2. Langkah HTML: panggil Claude Opus 5.5 melalui Felo API. Gunakan ID model claude-opus-5-5 dan FELO_API_KEY saya. Jangan meminta langganan Claude atau kunci Anthropic lain kepada saya.
3. Minta Opus membuat satu berkas HTML mandiri: setel window.DURATION dan ekspos async window.seek(t). Tanpa aset eksternal, CDN, Date.now(), requestAnimationFrame(), transisi CSS, atau timer. Beri seed semua nilai acak agar t yang sama selalu menggambar frame yang sama.
4. Pratinjau pada t = 0, 25%, 50%, 75%, dan frame terakhir. Periksa overflow, pemotongan, font, dan area aman sebelum merender semua.
5. Render setiap frame dengan Playwright, encode H.264 dengan ffmpeg, dan mux trek audio jika ada.
6. Tampilkan frame pertama, terakhir, dan path akhir. Jangan menerbitkan.

Aturan:
- Sebelum memakai kredit, tampilkan panggilan Felo API dan perkiraan token.
- Gunakan hanya teks yang saya berikan, atau tandai jelas teks placeholder yang dikarang.
- Jangan memakai materi, musik, logo, atau font berhak cipta. Hanya font sistem dan bentuk yang dihasilkan.
- Jaga video akhir di bawah 30 detik, kecuali saya meminta versi panjang.
- Tulis semuanya ke ./video/ dan ringkas perintah yang dijalankan.

Salinan juga menyertakan langkah pemasangan dan aturan keamanan.

Yang Anda dapatkan

Contoh keluaran dari satu eksekusi. Bukan pembuatan langsung.

Contoh laporan render (kutipan)

Laporan render

Adegan: video/scene.html (18 KB) Durasi: 12 detik · 1080x1920 · 30 fps · 360 frame Pemeriksaan: window.DURATION = 12 · seek(t) ada · tanpa Date.now / rAF / timer

Pratinjau: preview-0ms.png · preview-3000ms.png · preview-6000ms.png · preview-9000ms.png Encoding: video/video.mp4 (H.264, 360 frame) Audio: video/final.mp4 (AAC, 12,0 detik)

Panggilan persisnya

Untuk developer: alur kerja yang sama sebagai kode, sesuai urutan eksekusi.

Tampilkan panggilan API asli
  1. Tulis beat sheet dulu

    Tetapkan durasi dan 3–6 beat, masing-masing dengan awal, akhir, teks di layar, dan perubahan visual utama.

  2. Buat adegan HTML dengan Opus 5.5

    Arahkan Anthropic SDK ke base URL Felo, pakai claude-opus-5-5, dan minta hanya HTML dengan window.DURATION dan async seek(t).

    generate-scene.ts
    import { mkdir, writeFile } from "node:fs/promises";
    import Anthropic from "@anthropic-ai/sdk";
    
    const SYSTEM = `You write a single, self-contained HTML video scene.
    Requirements:
    - 1080x1920 (or 1920x1080), no external assets, system fonts only.
    - set window.DURATION = <seconds>.
    - expose async window.seek(t) that draws the frame for time t.
    - no Date.now(), no requestAnimationFrame(), no CSS transitions, no timers.
    - seed every random value; the same t must always produce the same frame.
    - return only the HTML file, no markdown fences.`;
    
    const brief = `12-second vertical motion graphic about [idea].
    Beats: [0-3s hook], [3-7s point], [7-10s proof], [10-12s CTA].
    Palette: [colors]. Type: system sans. Keep text inside a 64px safe area.`;
    
    const anthropic = new Anthropic({
      apiKey: process.env.FELO_API_KEY,
      baseURL: "https://openapi.felo.ai/api",
    });
    
    const message = await anthropic.messages.create({
      model: "claude-opus-5-5",
      max_tokens: 32000,
      system: SYSTEM,
      messages: [{ role: "user", content: brief }],
    });
    
    const raw = message.content
      .filter((block) => block.type === "text")
      .map((block) => block.text)
      .join("");
    
    const html = raw.replace(/^```(?:html)?\s*/i, "").replace(/```\s*$/, "").trim();
    await mkdir("video", { recursive: true });
    await writeFile("video/scene.html", html);
    console.log(`scene.html: ${html.length} bytes`);

    Contoh keluaran

    scene.html: 18432 bytes
  3. Periksa determinisme dan pratinjau

    Ambil screenshot di t=0, 25%, 50%, 75% dan frame terakhir, periksa luapan teks, font, dan area aman.

    preview.ts
    import { chromium } from "playwright";
    import { pathToFileURL } from "node:url";
    
    const browser = await chromium.launch();
    const page = await browser.newPage({
      viewport: { width: 1080, height: 1920 },
      deviceScaleFactor: 1,
    });
    
    await page.goto(pathToFileURL("video/scene.html").href);
    await page.waitForFunction(() => typeof (window as any).seek === "function");
    
    const duration = await page.evaluate(() => (window as any).DURATION as number);
    for (const t of [0, duration * 0.25, duration * 0.5, duration * 0.75]) {
      await page.evaluate(async (time) => {
        await (window as any).seek(time);
      }, t);
      await page.screenshot({ path: `video/preview-${Math.round(t * 1000)}ms.png` });
    }
    
    await browser.close();
    console.log(`duration ${duration}s`);

    Contoh keluaran

    duration 12s
    video/preview-0ms.png
    video/preview-3000ms.png
    video/preview-6000ms.png
    video/preview-9000ms.png
  4. Render semua frame dan encode

    Panggil seek(t) dengan t = frame / fps, tangkap frame, dan encode H.264 dengan ffmpeg.

    render.ts
    import { spawn } from "node:child_process";
    import { mkdir, rm } from "node:fs/promises";
    import { pathToFileURL } from "node:url";
    import { chromium } from "playwright";
    
    const FPS = 30;
    
    const browser = await chromium.launch();
    const page = await browser.newPage({
      viewport: { width: 1080, height: 1920 },
      deviceScaleFactor: 1,
    });
    await page.goto(pathToFileURL("video/scene.html").href);
    await page.waitForFunction(() => typeof (window as any).seek === "function");
    
    const duration = await page.evaluate(() => (window as any).DURATION as number);
    const frames = Math.ceil(duration * FPS);
    
    await rm("video/frames", { recursive: true, force: true });
    await mkdir("video/frames", { recursive: true });
    
    for (let frame = 0; frame < frames; frame++) {
      await page.evaluate(async (time) => {
        await (window as any).seek(time);
      }, frame / FPS);
      await page.screenshot({
        path: `video/frames/${String(frame).padStart(5, "0")}.png`,
      });
    }
    await browser.close();
    
    const ffmpeg = spawn("ffmpeg", [
      "-y",
      "-framerate", String(FPS),
      "-i", "video/frames/%05d.png",
      "-c:v", "libx264",
      "-pix_fmt", "yuv420p",
      "-movflags", "+faststart",
      "video/video.mp4",
    ], { stdio: "inherit" });
    
    await new Promise<void>((resolve, reject) => {
      ffmpeg.on("exit", (code) => {
        if (code === 0) resolve();
        else reject(new Error(`ffmpeg exited with ${code}`));
      });
    });
    
    console.log(`${frames} frames -> video/video.mp4`);

    Contoh keluaran

    360 frames -> video/video.mp4
  5. Mux audio dan tonton penuh

    Tambahkan track berlisensi dengan -c:v copy, periksa durasi dan volume, lalu tonton dari awal sampai akhir.

    mux.sh
    ffmpeg -i video/video.mp4 -i video/audio.wav \
      -c:v copy -c:a aac -b:a 192k -shortest \
      video/final.mp4
    
    ffprobe -v error -show_entries format=duration \
      -of default=nw=1:nk=1 video/final.mp4

    Contoh keluaran

    12.000000
  6. Iterasi dengan model yang sama

    Jelaskan hanya frame salah dan perubahan yang diinginkan, berikan HTML saat ini ke Opus, jalankan ulang pratinjau sebelum render penuh.

Termasuk

  • Storyboard dan timeline yang ditulis dulu
  • Adegan HTML deterministik dari Opus 5.5
  • Skrip render Playwright dan encoding ffmpeg
  • MP4 final dengan track audio opsional
  • Loop tinjauan dan koreksi per frame

Yang tidak dilakukan

  • Opus 5.5 menghasilkan kode, bukan frame; renderer browser menangkap frame
  • Tanpa langganan Claude, tetapi pemakaian model Felo ditagih sesuai pemakaian
  • Node, Playwright Chromium, dan ffmpeg tetap diperlukan
  • Tanpa aset eksternal atau CDN; hanya HTML/CSS/SVG/Canvas atau file lokal
  • Video panjang butuh pembagian adegan; ini bukan rekaman layar real-time
  • Narasi dan musik langkah terpisah; alur hanya mux audio yang disediakan

Pertanyaan

Apakah Opus 5.5 langsung membuat video?

Tidak. Ia menghasilkan teks dan kode dengan menulis adegan HTML; browser dan ffmpeg mengubah adegan menjadi frame dan MP4.

Perlu langganan Claude?

Tidak. Pakai kunci Felo untuk memanggil `claude-opus-5-5` lewat Felo API dengan tagihan pemakaian; tanpa langganan Claude terpisah.

Berjalan di agent mana?

WorkBuddy, ChatGPT dengan eksekusi kode, Codex, Pi Agent, Claude Code, atau agent yang bisa menjalankan Node dan browser headless.

Mengapa seek(t)?

Penangkapan frame tidak real-time: frame 400 bisa ditangkap jauh setelah 399, jadi setiap frame harus fungsi murni dari t.

Bisa pakai HyperFrames atau Remotion?

Bisa, untuk komposisi panjang atau proyek terstruktur. Resep ini menyimpan satu HTML agar panggilan model dan loop render mudah diperiksa.

Berapa biaya video 12 detik?

Tergantung prompt, token keluaran, dan iterasi. Model Felo menagih per token; cek harga sebelum render panjang.

Bisa pakai musik dan narasi sendiri?

Bisa, jika punya hak. Render dulu, lalu mux track berlisensi atau TTS dengan ffmpeg. Alur tidak membuat narasi.

Referensi

Tutorial dan proyek yang mendasari alur kerja ini.

Alur kerja terkait

Sesuaikan

Resep yang sama, disesuaikan dengan cara Anda benar-benar mengirim.

Proyek HyperFrames atau Remotion

Untuk komposisi panjang pakai framework ini; panggilan model sama, hanya perintah render berubah.

Versi persegi untuk sosial

Pertahankan beat sheet, ubah ke 1080x1080, sesuaikan tipografi dan area aman.

Tiga varian dari satu brief

Buat tiga adegan dengan warna dan ritme berbeda, tinjau pratinjau, render yang terbaik saja.

Halaman referensi di balik resep ini dan langkah berikutnya.