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.
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.
¿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ón | Fuente | Fecha |
|---|---|---|
| La calidad de recuperación domina la calidad de respuesta | https://example.com/rag-eval | 2026-10-12 |
| El coste por ticket resuelto cayó un 38 % | https://example.com/support-case | 2026-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
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": "…" } ] }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…"
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
limitpara 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": "…" } ] } }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 queriesVuelve 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_idssolo 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
Publica un resumen diario de IA que tu equipo realmente lea
Obtén un resumen con fuentes, añade lo que publican los profesionales en X, consigue una transcripción de vídeo, compón la edición en Markdown y archívala en un LiveDoc.
Abrir el flujo de trabajoOficinaConvierte una página de investigación en una presentación
Extrae la página, guárdala como contexto LiveDoc, deja que la API PPT Task construya el deck y consulta hasta obtener el enlace final.
Abrir el flujo de trabajoSoporteResponde preguntas de soporte desde tu propia documentación
Crea un LiveDoc, carga el centro de ayuda y el runbook interno, recupera los pasajes que responden al ticket y deja que el modelo responda solo con esas evidencias.
Abrir el flujo de trabajoHazlo 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.
Seguir
Las páginas de referencia detrás de esta receta y los siguientes pasos.