Felo API PlatformFelo API Platform

Investigación

Convierte una pregunta en un brief de investigación con fuentes

Pregunta a la web, guarda las páginas detrás de la respuesta como Markdown, añade lo que dicen los profesionales en X y conserva las evidencias en un LiveDoc que puedes consultar después.

Tiempo20 minutosNivelIntermedioActualizado2026-10-29
Para quiénFundadores y operadoresInvestigadores de mercadoEquipos GTM

Copiar el prompt

Sustituye los campos entre corchetes y pégalo en Claude Code, Codex o cualquier IA con acceso a terminal. Instala el skill de Felo, pregunta antes de gastar créditos y ejecuta el flujo.

Elabora un informe de investigación con fuentes para [pregunta o decisión].

Alcance: [mercado, región, idioma]. Ventana temporal: [últimos 30 días / últimos 12 meses]. Audiencia: [quién lo leerá]. Profundidad: [resumen de una página / informe completo].

Genera un informe en Markdown con:
1. Una respuesta breve en tres viñetas.
2. Una tabla de evidencia: afirmación, título de la fuente, URL, fecha de publicación.
3. Aquello en lo que las fuentes discrepan.
4. Lo que sigue siendo desconocido.
5. Una lista completa de fuentes.

Reglas:
- Toda afirmación fáctica necesita un enlace de fuente. Separa hechos, opiniones y tus inferencias.
- Nunca inventes citas, métricas, fechas ni fuentes. Un dato ausente se escribe «No disponible», nunca cero.
- Prioriza fuentes primarias. Usa X como señal de profesionales, no como prueba.
- Convierte la ventana temporal en fechas explícitas de inicio y fin e indica la zona horaria.
- Antes de gastar créditos, muestra las llamadas API previstas y espera mi aprobación.
- No crees tareas recurrentes, no envíes mensajes ni publiques nada.
- Escribe el resultado en ./research-brief.md y resúmelo en el chat.

La copia también incluye los pasos de instalación y las reglas de seguridad.

Lo que obtienes

Salida de ejemplo de una ejecución. No es generación en vivo.

Ejemplo de informe (extracto)

¿Los modelos pequeños sustituirán a los grandes en los bots de soporte?

Respuesta corta

  • Los modelos pequeños ya bastan para clasificar y responder en primera línea.
  • El cuello de botella es la calidad de recuperación, no el tamaño del modelo.
  • Los equipos que cambiaron reportan menor coste por ticket, no mayor tasa de resolución.
AfirmaciónFuenteFecha
La calidad de recuperación domina la calidad de respuestahttps://example.com/rag-eval2026-10-12
El coste por ticket resuelto cayó un 38 %https://example.com/support-case2026-09-28

Donde las fuentes discrepan

Los benchmarks de proveedores muestran casi paridad; las pruebas independientes aún ven una brecha en reembolsos de varios pasos.

Aún desconocido

Si la brecha se cierra con mejores herramientas o requiere un modelo mayor.

Las llamadas exactas

Para desarrolladores: el mismo flujo como código, en orden de ejecución.

Mostrar las llamadas reales a la API
  1. Pregunta a la web

    Chat busca en la web, ordena las fuentes, escribe la respuesta y devuelve los recursos usados. Guarda las tres principales: cada paso siguiente sigue uno de esos enlaces. El helper envía la clave una vez y lanza error si la respuesta no es 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) };
    }

    Salida de ejemplo

    {
      "answer": "Recent developments include …",
      "sources": [
        { "link": "https://example.com/article", "title": "…" }
      ]
    }
  2. Descarga las páginas detrás de la respuesta

    Un fragmento no basta para un brief. Descarga las páginas en Markdown con legibilidad activada para conservar citas y títulos sin el ruido de navegación. Volver a pedir la misma URL puede usar la caché de extracción.

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

    Salida de ejemplo

    // pages[0].content
    "# Example Article\n\nExtracted article content…"
  3. Añade lo que dice X

    Las noticias cubren anuncios; X muestra con lo que se encuentra la gente en la práctica. Busca los últimos siete días y guarda autor y fecha para atribuir cada afirmación. Sube limit para ampliar; cada página de resultados trae 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,
    });

    Salida de ejemplo

    { "data": { "tweets": [
      { "content": "…", "author": { "username": "…" }, "created_at": "…" }
    ] } }
  4. Archiva las evidencias en un LiveDoc

    Crea un LiveDoc y añade las fuentes como recursos URL. La API deduplica lo que ya ha visto y devuelve un resource id por URL, así las mismas evidencias se pueden consultar en preguntas futuras sin volver a descargarlas.

    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. Vuelve a preguntar a las evidencias

    Aquí está el beneficio: la siguiente pregunta hace búsqueda semántica sobre el LiveDoc en vez de la web abierta. Pasa resource_ids solo para limitar a un subconjunto conocido.

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

    Salida de ejemplo

    [
      { "title": "…", "content": "…", "score": 0.92 }
    ]

Qué incluye

  • Respuesta con fuentes del Chat API y las páginas detrás
  • Extracción de páginas completas en Markdown para las fuentes más sólidas
  • Posts de X con autor y fecha como señal de profesionales
  • LiveDoc que mantiene las evidencias consultables para preguntas futuras

Qué no hace

  • Solo fuentes públicas; páginas de pago o solo con login pueden fallar
  • La cobertura de X es una señal, no una encuesta representativa
  • Sin entrevistas, datos privados ni bases de datos de pago
  • Cuando faltan evidencias, el brief lo dice en vez de rellenar huecos
  • Una ejecución por prompt; la programación la lleva tu agent o cron

Preguntas

¿De dónde vienen las fuentes?

El Chat API devuelve las páginas que usó, Web Fetch convierte las más sólidas en Markdown y X Search añade posts fechados de profesionales. Cada elemento conserva su URL.

¿Puedo investigar un mercado fuera de tecnología?

Sí. Sustituye el campo de alcance por tu mercado. Los nichos pueden tener menos fuentes públicas; el brief marca esos huecos en vez de adivinar.

¿Las evidencias quedan después de la ejecución?

Sí, cuando se ejecuta el paso de LiveDoc. El short_id devuelto permite que preguntas futuras consulten las mismas páginas sin volver a descargarlas.

¿Cuánto cuesta un brief?

Se factura por créditos de uso; las tarifas actuales están en la página de precios. El prompt pide aprobación antes de gastar.

¿Puedo ejecutarlo cada semana?

Sí, pero este prompt se ejecuta una vez. Programa la tarea en un agent o cron que ejecute el mismo flujo.

¿Y si una fuente está tras un muro de pago?

Se omite y se marca como no disponible. El brief nunca rellena el hueco con un hecho o una cita inventados.

Flujos relacionados

Hazlo tuyo

La misma receta, adaptada a cómo entregas de verdad.

Escribe el brief en un archivo

Junta la respuesta, los extractos de páginas y las citas de X en Markdown y pásalo a tu herramienta de informes o haz commit en el repositorio de docs. Mantén los enlaces junto a las afirmaciones: el brief vale lo que valen sus citas.

Ejecútalo programado

Envuelve `answer()` en un cron y escribe cada brief en un archivo con fecha. El mismo LiveDoc acumula fuentes y la cuarta semana responde con las evidencias de las tres primeras.

Omite el LiveDoc

Si ya tienes una base de datos, guarda allí la respuesta del chat y las páginas extraídas. El paso LiveDoc es para búsqueda, no para almacenamiento por defecto.

Las páginas de referencia detrás de esta receta y los siguientes pasos.