Recherche
Transformez une question en brief de recherche sourcé
Interrogez le web, récupérez les pages derrière la réponse en Markdown, ajoutez ce que disent les praticiens sur X, puis conservez les preuves dans un LiveDoc que vous pourrez interroger plus tard.
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.
Rédige un brief de recherche sourcé pour [question ou décision]. Périmètre : [marché, région, langue]. Période : [30 derniers jours / 12 derniers mois]. Public : [qui va le lire]. Profondeur : [aperçu d’une page / brief complet]. Produis un brief Markdown avec : 1. Une réponse courte en trois puces. 2. Un tableau de preuves : affirmation, titre de la source, URL, date de publication. 3. Les points sur lesquels les sources divergent. 4. Ce qui reste inconnu. 5. Une liste complète des sources. Règles : - Chaque affirmation factuelle doit avoir un lien source. Sépare les faits, les opinions et tes déductions. - N’invente jamais de citations, de chiffres, de dates ou de sources. Une donnée manquante s’écrit « Non disponible », jamais zéro. - Privilégie les sources primaires. Utilise X comme signal de terrain, pas comme preuve. - Transforme la période en dates de début et de fin explicites et indique le fuseau horaire. - Avant de consommer des crédits, montre les appels API prévus et attends mon accord. - Ne crée pas de tâche récurrente, n’envoie pas de messages et ne publie rien. - Écris le résultat dans ./research-brief.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.
Les petits modèles remplacent-ils les grands dans les bots de support ?
Réponse courte
- Les petits modèles suffisent déjà pour la classification et les réponses de premier niveau.
- Le goulot d’étranglement est la qualité de la recherche, pas la taille du modèle.
- Les équipes qui ont changé rapportent un coût par ticket plus bas, pas un meilleur taux de résolution.
| Affirmation | Source | Date |
|---|---|---|
| La qualité de recherche domine la qualité de réponse | https://example.com/rag-eval | 2026-10-12 |
| Coût par ticket résolu en baisse de 38 % | https://example.com/support-case | 2026-09-28 |
Ce sur quoi les sources divergent
Les benchmarks fournisseurs montrent une quasi-parité ; les tests indépendants trouvent encore un écart sur les remboursements en plusieurs étapes.
Encore inconnu
Si l’écart se comble avec de meilleurs outils ou exige un modèle plus grand.
Les appels exacts
Pour les développeurs : le même workflow en code, dans l'ordre d'exécution.
Afficher les appels API
Interrogez le web
Chat recherche le web, classe les sources, rédige la réponse et renvoie les ressources utilisées. Gardez les trois premières : chaque étape suivante suit l’un de ces liens. Le helper ci-dessous envoie la clé une fois et lève une erreur hors 2xx.
research.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 ChatData = { data: { answer: string; resources: { link: string; title: string }[] }; }; export async function answer(question: string) { const chat = await felo<ChatData>("/v2/chat", { query: question }); return { answer: chat.data.answer, sources: chat.data.resources.slice(0, 3) }; }Exemple de sortie
{ "answer": "Recent developments include …", "sources": [ { "link": "https://example.com/article", "title": "…" } ] }Récupérez les pages derrière la réponse
Un extrait ne suffit pas pour un brief. Récupérez les pages en Markdown avec la lisibilité activée, pour que les citations et titres survivent sans le bruit de navigation. Redemander la même URL peut toucher le cache d’extraction.
research.ts type ExtractData = { data: { content: string } }; const pages = await Promise.all( sources.map((source) => felo<ExtractData>("/v2/web/extract", { url: source.link, output_format: "markdown", with_readability: true, with_cache: true, }).then((page) => ({ ...source, content: page.data.content })), ), );Exemple de sortie
// pages[0].content "# Example Article\n\nExtracted article content…"
Ajoutez ce que dit X
Les actualités couvrent les annonces ; X montre ce que les gens rencontrent en pratique. Cherchez les sept derniers jours et gardez l’auteur et la date pour que le brief attribue chaque affirmation. Augmentez
limitpour élargir ; chaque page de résultats contient un cursor.research.ts type XData = { data: { tweets: { content: string; author: { username: string }; created_at: string; }[]; }; }; const since = Math.floor((Date.now() - 7 * 24 * 60 * 60 * 1000) / 1000); const social = await felo<XData>("/v2/x/tweet/search", { query: question, limit: 10, since_time: since, });Exemple de sortie
{ "data": { "tweets": [ { "content": "…", "author": { "username": "…" }, "created_at": "…" } ] } }Archivez les preuves dans un LiveDoc
Créez un LiveDoc et ajoutez les sources comme ressources URL. L’API déduplique les URL déjà vues et renvoie un resource id par URL, donc les mêmes preuves restent interrogeables pour les questions futures sans nouvel appel.
research.ts type LiveDocData = { data: { short_id: string } }; const doc = await felo<LiveDocData>("/v2/livedocs", { name: `Research: ${question.slice(0, 60)}`, description: "Sources collected while answering the question", }); await felo(`/v2/livedocs/${doc.data.short_id}/resources/urls`, { urls: sources.map((source) => ({ url: source.link, title: source.title })), }); console.log(doc.data.short_id); // keep this for later queriesRéinterrogez les preuves plus tard
C’est le bénéfice : la question suivante lance une recherche sémantique sur le LiveDoc plutôt que sur le web ouvert. Ne passez
resource_idsque pour restreindre à un sous-ensemble connu.research.ts type Retrieved = { data: { title: string; content: string; score: number }[]; }; async function ask(livedoc: string, query: string) { const hits = await felo<Retrieved>( `/v2/livedocs/${livedoc}/resources/retrieve`, { query }, ); return hits.data.filter((hit) => hit.score >= 0.7); }Exemple de sortie
[ { "title": "…", "content": "…", "score": 0.92 } ]
Ce qui est inclus
- Réponse sourcée du Chat API et les pages derrière
- Extraction des pages complètes en Markdown pour les meilleures sources
- Posts X avec auteur et date comme signal de praticiens
- LiveDoc qui garde les preuves interrogeables pour plus tard
Ce qu'elle ne fait pas
- Sources publiques uniquement ; les pages payantes ou derrière un login peuvent échouer
- La couverture X est un signal, pas une enquête représentative
- Pas d’entretiens, de données privées ni de bases payantes
- Quand les preuves manquent, le brief le dit au lieu de combler les trous
- Une exécution par prompt ; la planification revient à votre agent ou cron
Questions
D’où viennent les sources ?
Le Chat API renvoie les pages utilisées, Web Fetch transforme les plus solides en Markdown et X Search ajoute des posts datés de praticiens. Chaque élément garde son URL.
Puis-je étudier un marché hors tech ?
Oui. Remplacez le champ de périmètre par votre marché. Les marchés de niche ont parfois moins de sources publiques ; le brief signale ces lacunes au lieu de deviner.
Les preuves restent-elles après l’exécution ?
Oui, si l’étape LiveDoc s’exécute. Le short_id renvoyé permet aux questions suivantes d’interroger les mêmes pages sans les récupérer à nouveau.
Combien coûte un brief ?
La facturation se fait en crédits à l’usage ; les tarifs actuels sont sur la page des prix. Le prompt demande votre accord avant toute dépense.
Puis-je l’exécuter chaque semaine ?
Oui, mais ce prompt s’exécute une fois. Placez la planification dans un agent ou un cron capable d’exécuter le même workflow.
Et si une source est payante ?
Elle est ignorée et marquée indisponible. Le brief ne remplit jamais un manque avec un fait ou une citation inventés.
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.
Écrivez le brief dans un fichier
Rassemblez la réponse, les extraits de pages et les citations X en Markdown, puis remettez le texte à votre outil de rapport ou committez-le dans le dépôt docs. Gardez les liens de sources près des affirmations — le brief vaut ce que valent ses citations.
Exécutez-le planifié
Enveloppez `answer()` dans un cron et écrivez chaque brief dans un fichier daté. Le même LiveDoc accumule les sources : la quatrième semaine répond avec les preuves des trois premières.
Sautez le LiveDoc
Si vous avez déjà une base de données, stockez-y la réponse chat et les pages extraites. L’étape LiveDoc sert à la recherche, pas au stockage par défaut.
Aller plus loin
Les pages de référence derrière cette recette et la suite.