Felo API PlatformFelo API Platform

Contenuti

Trasforma un video YouTube in un articolo pubblicabile

Prendi la trascrizione con timestamp, trasformala in blocchi leggibili, crea scaletta e bozza con un modello che controlli e lascia il risultato in un LiveDoc per la revisione.

Tempo25 minutiLivelloIntermedioAggiornato2026-10-29
Per chiTeam contenutiAutori di newsletterEditor video e podcast

Copia il prompt

Sostituisci i campi tra parentesi quadre e incolla in Claude Code, Codex o qualsiasi IA con accesso al terminale. Installa lo skill Felo, chiede prima di spendere crediti ed esegue il workflow.

Trasforma questo video in un articolo pubblicabile: [URL YouTube o ID video].

Pubblico: [lettori]. Tono: [stile editoriale]. Lunghezza target: [800–1200 parole] in [lingua].
Gestione delle fonti: conserva titolo, canale e URL del video. Cita al massimo brevi passaggi, con timestamp.

Produci:
1. Un titolo di lavoro.
2. Un sommario di apertura.
3. Sezioni con paragrafi brevi.
4. Due o tre citazioni con timestamp.
5. Cosa il video non ha coperto.
6. Un elenco di fonti con il video e le pagine collegate.

Regole:
- Non riprodurre la trascrizione completa. Riassumi e cita brevemente.
- Ogni affermazione fattuale dal video richiede un timestamp; quelle da pagine collegate richiedono un URL.
- Segna come «Non verificato» tutto ciò che non hai potuto controllare.
- Chiedi prima di consumare crediti per trascrizioni o estrazione di pagine.
- Non pubblicare, programmare né inviare nulla.
- Scrivi il risultato in ./video-article.md e riassumilo in chat.

La copia include anche i passaggi di installazione e le regole di sicurezza.

Cosa ottieni

Output di esempio di un'esecuzione. Non è generazione dal vivo.

Esempio di articolo (estratto)

Cosa ha detto davvero un talk di 40 minuti sugli agenti

Sommario

La demo era impressionante; la parte utile era la gestione degli errori.

L’affermazione che tutti hanno citato

> «L’agente non è diventato più intelligente. Abbiamo solo smesso di lasciarlo riprovare senza budget.» — [12:40]

Cosa il video non ha coperto

Il costo per attività riuscita e cosa succede quando la fonte recuperata è sbagliata.

Fonti

  • Video: https://www.youtube.com/watch?v=...
  • Benchmark collegato: https://example.com/benchmark

Le chiamate esatte

Per gli sviluppatori: lo stesso workflow come codice, nell'ordine di esecuzione.

Mostra le chiamate API reali
  1. Prendi la trascrizione con timestamp

    Usa YouTube Subtitling per i sottotitoli nella lingua target e conserva inizio e durata di ogni riga.

    article.ts
    const BASE = "https://openapi.felo.ai";
    const headers = {
      Authorization: `Bearer ${process.env.FELO_API_KEY}`,
      "Content-Type": "application/json",
    };
    
    async function felo<T>(path: string, body?: unknown): Promise<T> {
      const res = await fetch(`${BASE}${path}`, {
        method: body ? "POST" : "GET",
        headers,
        body: body ? JSON.stringify(body) : undefined,
      });
      if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
      return res.json() as Promise<T>;
    }
    
    type Transcript = {
      data: {
        title: string;
        contents: { text: string; start: number; duration: number }[];
      };
    };
    
    export async function fetchTranscript(videoId: string, language = "en") {
      const query = new URLSearchParams({
        video_code: videoId,
        language,
        with_time: "true",
      });
      const { data } = await felo<Transcript>(`/v2/youtube/subtitling?${query}`);
      if (data.contents.length === 0) throw new Error("This video has no subtitles");
      return data;
    }

    Output di esempio

    {
      "title": "How we rebuilt onboarding",
      "contents": [
        { "text": "Welcome back to the channel.", "start": 0.32, "duration": 4.1 }
      ]
    }
  2. Trasforma in blocchi leggibili

    Dividi per tema, rimuovi riempitivi e conserva i timestamp.

    article.ts
    const toClock = (seconds: number) => {
      const minutes = Math.floor(seconds / 60);
      const rest = Math.floor(seconds % 60);
      return `${String(minutes).padStart(2, "0")}:${String(rest).padStart(2, "0")}`;
    };
    
    export function toBlocks(
      contents: Transcript["data"]["contents"],
      window = 60,
    ) {
      const grouped = new Map<number, string[]>();
      for (const line of contents) {
        const bucket = Math.floor(line.start / window) * window;
        grouped.set(bucket, [...(grouped.get(bucket) ?? []), line.text.trim()]);
      }
      return [...grouped]
        .map(([start, lines]) => `[${toClock(start)}] ${lines.join(" ")}`)
        .join("\n\n");
    }

    Output di esempio

    [00:00] Welcome back to the channel. Today we are talking about onboarding.
    
    [01:00] The first thing we changed was the welcome screen.
  3. Recupera le fonti citate

    Con Web Fetch leggi le pagine nominate nel video e aggiungi link e fatti.

    article.ts
    type ExtractData = { data: { content: string } };
    
    export async function fetchSources(urls: string[]) {
      return Promise.all(
        urls.slice(0, 5).map(async (url) => {
          const page = await felo<ExtractData>("/v2/web/extract", {
            url,
            output_format: "markdown",
            with_readability: true,
          });
          return { url, content: page.data.content };
        }),
      );
    }

    Output di esempio

    [
      {
        "url": "https://example.com/reference",
        "content": "# Reference\n\nExtracted page text…"
      }
    ]
  4. Fai la scaletta e poi la bozza

    Chiedi prima una scaletta al Model API e scrivi l’articolo seguendola, con citazioni brevi e timestamp.

    article.ts
    const MODEL_API = "https://openapi.felo.ai/api/v1";
    
    type Completion = {
      choices: { message: { content: string } }[];
      usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number };
    };
    
    async function complete(model: string, prompt: string): Promise<Completion> {
      const res = await fetch(`${MODEL_API}/chat/completions`, {
        method: "POST",
        headers,
        body: JSON.stringify({ model, messages: [{ role: "user", content: prompt }] }),
      });
      if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
      return res.json() as Promise<Completion>;
    }
    
    export async function draftArticle(title: string, transcript: string) {
      const outline = await complete(
        "claude-haiku-5-5",
        "Outline a short article from this transcript. Return only headings.\n\n" + transcript,
      );
      const article = await complete(
        "claude-sonnet-5-5",
        `Write the article "${title}" from the transcript. Follow the outline and keep [mm:ss] on direct quotes.\n\nOutline:\n${outline.choices[0].message.content}\n\nTranscript:\n${transcript}`,
      );
      return {
        outline: outline.choices[0].message.content,
        article: article.choices[0].message.content,
        usage: article.usage,
      };
    }

    Output di esempio

    {
      "outline": "1. The problem\n2. What changed\n3. What we learned",
      "article": "## The problem\n\nWhen we…",
      "usage": { "prompt_tokens": 4120, "completion_tokens": 640, "total_tokens": 4760 }
    }
  5. Lascia nel LiveDoc per la revisione

    Salva bozza e citazioni nel LiveDoc e passale all’editor per correzioni e approvazione.

    article.ts
    type LiveDocData = { data: { short_id: string } };
    type ResourceData = { data: { id: string } };
    
    export async function saveDraft(
      title: string,
      result: { outline: string; article: string },
    ) {
      const doc = await felo<LiveDocData>("/v2/livedocs", {
        name: `Article draft: ${title}`,
        description: "Draft generated from a video transcript",
      });
    
      await felo<ResourceData>(`/v2/livedocs/${doc.data.short_id}/resources/doc`, {
        title: "Draft",
        content: result.article,
      });
    
      await felo<ResourceData>(`/v2/livedocs/${doc.data.short_id}/resources/doc`, {
        title: "Outline",
        content: result.outline,
      });
    
      return doc.data.short_id;
    }

    Output di esempio

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Cosa include

  • Trascrizione YouTube con timestamp
  • Pagine citate dal video in Markdown
  • Scaletta e bozza del tuo Model API
  • LiveDoc con la bozza per la revisione

Cosa non fa

  • Nessuna riproduzione integrale: solo citazioni brevi e riscrittura
  • Il video deve avere sottotitoli
  • Verifica diritti e limiti di citazione prima di pubblicare
  • Il modello fa scaletta e bozza; la decisione finale è dell’editor
  • Non pubblica né traduce automaticamente

Domande

Il video deve avere sottotitoli?

Sì. Il workflow parte dai sottotitoli; se mancano si ferma invece di indovinare.

Posso trasformare un podcast in articolo?

Questo workflow è per YouTube. Per un podcast prepara prima una trascrizione e usa le stesse regole.

Posso scrivere in un’altra lingua?

Sì. Indica la lingua target; le citazioni restano nell’originale con traduzione se serve.

Chi scrive l’articolo?

L’agent IA in cui incolli il prompt scrive la bozza; Felo fornisce trascrizione, pagine e ambiente di revisione.

Posso ripubblicare l’intera trascrizione?

No. Il workflow crea un nuovo articolo con citazioni brevi e non copia tutto.

Quanto costa un’esecuzione?

Trascrizione ed estrazione sono a consumo; le tariffe sono nella pagina prezzi e il prompt chiede approvazione prima di spendere.

Workflow correlati

Adattala a te

La stessa ricetta, adattata a come lavori davvero.

Solo citazioni con timestamp

Non scrivere l’articolo; consegna un elenco di citazioni verificabili.

Prima la versione newsletter

Rendi l’articolo più breve e colloquiale per la newsletter.

Elabora un canale in batch

Ripeti i passi per ogni video e salva LiveDoc separati.

Le pagine di riferimento dietro questa ricetta e i prossimi passi.