Felo API PlatformFelo API Platform

Conteúdo

Transforme um vídeo do YouTube em artigo publicável

Puxe a transcrição com timestamps, organize em blocos legíveis, faça o esboço e o rascunho com um modelo sob seu controle e deixe o resultado em um LiveDoc para revisão.

Tempo25 minutosNívelIntermediárioAtualizado2026-10-29
Para quemTimes de conteúdoAutores de newsletterEditores de vídeo e podcast

Copiar o prompt

Substitua os campos entre colchetes e cole no Claude Code, Codex ou qualquer IA com acesso ao terminal. Ela instala a skill da Felo, pergunta antes de gastar créditos e executa o fluxo.

Transforme este vídeo em um artigo publicável: [URL do YouTube ou ID do vídeo].

Público: [leitores]. Tom: [estilo de publicação]. Tamanho alvo: [800–1200 palavras] em [idioma].
Tratamento de fontes: mantenha título, canal e URL do vídeo. Cite no máximo trechos curtos, com timestamps.

Produza:
1. Um título de trabalho.
2. Uma linha fina.
3. Seções com parágrafos curtos.
4. Duas ou três citações com timestamp.
5. O que o vídeo não cobriu.
6. Uma lista de fontes com o vídeo e as páginas linkadas.

Regras:
- Não reproduza a transcrição completa. Resuma e cite brevemente.
- Toda afirmação factual do vídeo precisa de timestamp; afirmações de páginas linkadas precisam de URL.
- Marque como “Não verificado” tudo o que não pôde ser checado.
- Pergunte antes de gastar créditos em transcrições ou extração de páginas.
- Não publique, agende nem envie nada.
- Grave o resultado em ./video-article.md e resuma no chat.

A cópia também inclui os passos de instalação e as regras de segurança.

O que você recebe

Saída de exemplo de uma execução. Não é geração ao vivo.

Exemplo de artigo (trecho)

O que uma palestra de 40 minutos sobre agentes realmente disse

Linha fina

A demo foi impressionante; a parte útil foi o tratamento de falhas.

A afirmação que todos citaram

> “O agente não ficou mais inteligente. Só paramos de deixá-lo tentar de novo sem orçamento.” — [12:40]

O que o vídeo não cobriu

Custo por tarefa bem-sucedida e o que acontece quando a fonte recuperada está errada.

Fontes

  • Vídeo: https://www.youtube.com/watch?v=...
  • Benchmark vinculado: https://example.com/benchmark

As chamadas exatas

Para desenvolvedores: o mesmo fluxo em código, na ordem de execução.

Mostrar as chamadas reais da API
  1. Puxe a transcrição com timestamps

    Use o YouTube Subtitling para obter as legendas no idioma-alvo, guardando o início e a duração de cada linha.

    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;
    }

    Saída de exemplo

    {
      "title": "How we rebuilt onboarding",
      "contents": [
        { "text": "Welcome back to the channel.", "start": 0.32, "duration": 4.1 }
      ]
    }
  2. Organize em blocos legíveis

    Divida a transcrição por tema, remova vícios de fala e mantenha os timestamps.

    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");
    }

    Saída de exemplo

    [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. Baixe as fontes citadas

    Use o Web Fetch para ler as páginas citadas no vídeo e acrescentar links e fatos.

    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 };
        }),
      );
    }

    Saída de exemplo

    [
      {
        "url": "https://example.com/reference",
        "content": "# Reference\n\nExtracted page text…"
      }
    ]
  4. Faça o esboço e depois o rascunho

    Peça primeiro um esboço ao Model API e escreva o artigo seguindo o esboço, com citações curtas e timestamps.

    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,
      };
    }

    Saída de exemplo

    {
      "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. Deixe no LiveDoc para revisão

    Salve o rascunho e as citações no LiveDoc e entregue ao editor para ajustes e aprovação.

    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;
    }

    Saída de exemplo

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

O que está incluído

  • Transcrição do YouTube com timestamps
  • Páginas citadas pelo vídeo em Markdown
  • Esboço e rascunho do seu Model API
  • LiveDoc com o rascunho para revisão do editor

O que não faz

  • Não reproduz a transcrição inteira; apenas citações curtas e reescrita
  • O vídeo precisa ter legendas
  • Verifique direitos autorais e limite de citação antes de publicar
  • O modelo faz esboço e rascunho; a decisão final é do editor
  • Não publica nem traduz para outros idiomas automaticamente

Perguntas

O vídeo precisa de legendas?

Sim. O fluxo começa pelas legendas; se não houver, ele para em vez de adivinhar o que foi dito.

Posso transformar um podcast em artigo?

Este fluxo é para YouTube. Para podcast, prepare primeiro uma transcrição e use as mesmas regras de escrita.

Posso escrever em outro idioma?

Sim. Defina o idioma-alvo; as citações ficam no original com tradução quando necessário.

Quem escreve o artigo?

O agent de IA em que você colou o prompt escreve o rascunho; a Felo fornece transcrição, páginas e ambiente de revisão.

Posso republicar a transcrição inteira?

Não. O fluxo cria um artigo novo com citações curtas e não copia a transcrição inteira.

Quanto custa uma execução?

Transcrição e extração de páginas são cobradas por uso; as tarifas atuais estão na página de preços, e o prompt pede aprovação antes de gastar.

Fluxos relacionados

Faça do seu jeito

A mesma receita, adaptada ao seu processo real.

Só citações com timestamps

Não escreva o artigo; entregue uma lista de citações verificáveis para reaproveitamento.

Primeiro a versão de newsletter

Transforme o artigo em uma versão mais curta e conversacional para newsletter.

Processe um canal em lote

Repita os mesmos passos para cada vídeo e salve LiveDocs separados.

As páginas de referência por trás desta receita e para onde ir depois.