Contenu
Transformez une vidéo YouTube en article publiable
Récupérez la transcription horodatée, structurez-la en blocs lisibles, faites le plan et le brouillon avec un modèle que vous contrôlez, puis laissez le résultat dans un LiveDoc pour relecture.
Copier le prompt
Remplacez les champs entre crochets, puis collez dans Claude Code, Codex ou toute IA avec accès au terminal. Elle installe le skill Felo, demande avant de dépenser des crédits et exécute le workflow.
Transforme cette vidéo en article publiable : [URL YouTube ou ID vidéo]. Public : [lecteurs]. Ton : [style de publication]. Longueur cible : [800–1200 mots] en [langue]. Traitement des sources : conserve le titre, la chaîne et l’URL. Cite au maximum de courts passages, avec horodatages. Produis : 1. Un titre de travail. 2. Un chapeau. 3. Des sections en paragraphes courts. 4. Deux ou trois citations horodatées. 5. Ce que la vidéo n’a pas couvert. 6. Une liste de sources avec la vidéo et les pages liées. Règles : - Ne reproduis pas la transcription complète. Résume et cite brièvement. - Chaque affirmation factuelle issue de la vidéo exige un horodatage ; celles issues de pages liées exigent une URL. - Marque comme « Non vérifié » tout ce que tu n’as pas pu vérifier. - Demande avant de consommer des crédits pour récupérer une transcription ou extraire des pages. - Ne publie, ne planifie et n’envoie rien. - Écris le résultat dans ./video-article.md et résume-le dans le chat.
La copie inclut aussi les étapes d'installation et les règles de sécurité.
Ce que vous obtenez
Exemple de sortie d'une exécution. Pas de génération en direct.
Ce qu’a vraiment dit une conférence de 40 minutes sur les agents
Chapeau
La démo était impressionnante ; la partie utile était la gestion des échecs.
L’affirmation que tout le monde a citée
> « L’agent n’est pas devenu plus intelligent. Nous avons juste arrêté de le laisser réessayer sans budget. » — [12:40]
Ce que la vidéo n’a pas couvert
Le coût par tâche réussie, et ce qui se passe quand la source récupérée est fausse.
Sources
- Vidéo : https://www.youtube.com/watch?v=...
- Benchmark lié : https://example.com/benchmark
Les appels exacts
Pour les développeurs : le même workflow en code, dans l'ordre d'exécution.
Afficher les appels API
Récupérez la transcription horodatée
Utilisez YouTube Subtitling pour les sous-titres dans la langue cible et gardez début et durée de chaque ligne.
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; }Exemple de sortie
{ "title": "How we rebuilt onboarding", "contents": [ { "text": "Welcome back to the channel.", "start": 0.32, "duration": 4.1 } ] }Structurez en blocs lisibles
Découpez par thème, retirez les mots de remplissage et gardez les horodatages.
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"); }Exemple de sortie
[00:00] Welcome back to the channel. Today we are talking about onboarding. [01:00] The first thing we changed was the welcome screen.
Récupérez les sources citées
Avec Web Fetch, lisez les pages nommées dans la vidéo et ajoutez liens et faits.
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 }; }), ); }Exemple de sortie
[ { "url": "https://example.com/reference", "content": "# Reference\n\nExtracted page text…" } ]Faites le plan puis le brouillon
Demandez d’abord un plan au Model API, puis écrivez l’article en suivant le plan, avec citations courtes et horodatages.
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, }; }Exemple de sortie
{ "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 } }Laissez dans le LiveDoc pour relecture
Enregistrez le brouillon et les citations dans le LiveDoc et transmettez à l’éditeur pour correction et approbation.
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; }Exemple de sortie
{ "short_id": "PvyKouzJirXjFdst4uKRK3" }
Ce qui est inclus
- Transcription YouTube horodatée
- Pages citées par la vidéo en Markdown
- Plan et brouillon de votre Model API
- LiveDoc avec le brouillon pour relecture
Ce qu'elle ne fait pas
- Pas de reproduction intégrale : citations courtes et réécriture
- La vidéo doit avoir des sous-titres
- Vérifiez droits et limites de citation avant publication
- Le modèle fait plan et brouillon ; la décision finale revient à l’éditeur
- Ne publie pas et ne traduit pas automatiquement
Questions
La vidéo doit-elle avoir des sous-titres ?
Oui. Le workflow commence par les sous-titres ; s’ils manquent, il s’arrête au lieu de deviner.
Puis-je transformer un podcast en article ?
Ce workflow est pour YouTube. Pour un podcast, préparez d’abord une transcription et appliquez les mêmes règles.
Puis-je écrire dans une autre langue ?
Oui. Définissez la langue cible ; les citations restent dans l’original avec traduction si besoin.
Qui écrit l’article ?
L’agent IA dans lequel vous collez le prompt écrit le brouillon ; Felo fournit transcription, pages et espace de relecture.
Puis-je republier toute la transcription ?
Non. Le workflow crée un nouvel article avec citations courtes et ne copie pas toute la transcription.
Combien coûte une exécution ?
Transcription et extraction de pages sont facturés à l’usage ; les tarifs actuels sont sur la page des prix, et le prompt demande votre accord avant dépense.
Workflows liés
Publiez un résumé quotidien d’actualité IA que votre équipe lit vraiment
Obtenez une synthèse sourcée, ajoutez ce que publient les praticiens sur X, récupérez une transcription vidéo, composez l’édition en Markdown et archivez-la dans un LiveDoc.
Ouvrir le workflowBureauTransformez une page de recherche en présentation
Extrayez la page, enregistrez-la comme contexte LiveDoc, laissez l’API PPT Task construire le deck et interrogez jusqu’au lien final.
Ouvrir le workflowSupportRépondez aux questions support depuis votre propre documentation
Créez un LiveDoc, chargez le centre d’aide et le runbook interne, récupérez les passages qui répondent au ticket et laissez le modèle répondre uniquement à partir de ces preuves.
Ouvrir le workflowAdaptez-la
La même recette, adaptée à votre façon de livrer.
Seulement les citations horodatées
N’écrivez pas l’article ; livrez une liste de citations vérifiables pour réutilisation.
D’abord la version newsletter
Transformez l’article en version plus courte et conversationnelle pour la newsletter.
Traitez une chaîne en lot
Répétez les étapes pour chaque vidéo et enregistrez des LiveDocs séparés.
Aller plus loin
Les pages de référence derrière cette recette et la suite.