Felo API PlatformFelo API Platform

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.

Temps20 minutesNiveauIntermédiaireMis à jour2026-10-29
Pour quiFondateurs et opérateursChercheurs marchéÉquipes GTM

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.

Exemple de brief (extrait)

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.
AffirmationSourceDate
La qualité de recherche domine la qualité de réponsehttps://example.com/rag-eval2026-10-12
Coût par ticket résolu en baisse de 38 %https://example.com/support-case2026-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
  1. 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": "…" }
      ]
    }
  2. 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…"
  3. 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 limit pour é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": "…" }
    ] } }
  4. 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 queries
  5. Ré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_ids que 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

Adaptez-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.

Les pages de référence derrière cette recette et la suite.