Felo API PlatformFelo API Platform

研究

把一个问题变成有来源的研究简报

先问一遍网页,把答案背后的页面抓成 Markdown,再加入 X 上的实践者声音,最后把证据存进一个之后还能继续查询的 LiveDoc。

构建时间20 分钟难度进阶更新于2026-10-29
适合谁创始人与运营者市场研究员GTM 团队

复制 prompt

把方括号里的字段替换掉,然后粘贴到 Claude Code、Codex 或任何能访问终端的 AI。它会安装 Felo skill、在花额度前询问,并执行这套 workflow。

为[问题或决策]制作一份带来源的研究简报。

范围:[市场、地区、语言]。时间范围:[过去 30 天 / 过去 12 个月]。读者:[谁会读]。深度:[一页速览 / 完整简报]。

输出一份 Markdown 简报,包含:
1. 用三条要点给出简短回答。
2. 证据表:主张、来源标题、URL、发布日期。
3. 来源之间存在分歧的地方。
4. 仍然未知的内容。
5. 完整来源列表。

规则:
- 每个事实性主张都要有来源链接。区分事实、观点和你自己的推断。
- 不要编造引文、指标、日期或来源。数据缺失时写“暂无数据”,不要写零。
- 优先使用一手来源。X 只用于观察从业者信号,不作为证据。
- 把时间范围落实为明确的开始和结束日期,并注明时区。
- 消耗额度前,先展示计划执行的 API 调用并等待我批准。
- 不要创建定时任务、发送消息或发布任何内容。
- 将结果写入 ./research-brief.md,并在对话中总结。

复制的内容也包含安装步骤和安全规则。

你会得到什么

一次运行的示例输出,不是实时生成。

简报示例(节选)

小模型会取代支持机器人里的大模型吗?

简短回答

  • 小模型在分类和一线回答上已经足够好。
  • 瓶颈是检索质量,不是模型大小。
  • 切换的团队报告的是单工单成本下降,而不是解决率上升。
主张来源日期
检索质量决定回答质量https://example.com/rag-eval2026-10-12
单个已解决工单成本下降 38%https://example.com/support-case2026-09-28

来源分歧

厂商基准显示几乎持平;独立测试在多步退款上仍有差距。

仍然未知

这个差距会因更好的工具使用而缩小,还是需要更大的模型。

实际调用

给开发者:同一套 workflow 的可复制代码,按执行顺序排列。

展开实际 API 调用
  1. 向网页提问

    Chat 会搜索网页、给来源排序、写出答案,并返回用到的资源。保留前三个来源:后面的每一步都会沿着其中一条链接继续。下面的 helper 只发送一次 Key,非 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) };
    }

    示例输出

    {
      "answer": "近期进展包括……",
      "sources": [
        { "link": "https://example.com/article", "title": "……" }
      ]
    }
  2. 抓取答案背后的页面

    只有摘要不够。开启 readability 后用 Markdown 抓取整页,让引语和标题保留下来,同时去掉导航等噪音。再次请求同一个 URL 会命中提取缓存。

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

    示例输出

    // pages[0].content
    "# 示例文章\n\n提取出的正文……"
  3. 补上 X 上的声音

    新闻覆盖的是发布,X 覆盖的是人们在实践里遇到的东西。搜索最近七天,并保留作者和时间戳,让简报可以标注每一条主张的出处。增大 limit 可以扩大范围;每一页结果都会带 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,
    });

    示例输出

    { "data": { "tweets": [
      { "content": "……", "author": { "username": "……" }, "created_at": "……" }
    ] } }
  4. 把证据存进 LiveDoc

    创建一个 LiveDoc,把来源作为 URL 资源加进去。API 会对已经见过的 URL 去重,并为每个 URL 返回 resource id,这样后来的问题可以直接检索同一批证据,而不必再次抓取。

    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. 之后再问这批证据

    这才是回报:下一个问题在 LiveDoc 上做语义检索,而不是重新翻开放网络。只有想限定到已知子集时,才传 resource_ids。

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

    示例输出

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

包含什么

  • 来自 Chat API 的有来源回答,以及答案背后的页面
  • 对最强来源做整页 Markdown 提取
  • 带作者和时间戳的 X 帖子,作为实践者信号
  • 把证据保存为可查询 LiveDoc,供后续问题复用

不做什么

  • 只覆盖公开来源;付费墙或仅登录可见的页面可能失败
  • X 覆盖只是信号,不代表有代表性的调查
  • 不做访谈,不碰私有数据或付费数据库
  • 证据不足时会明确说明,而不是补猜测
  • 每个 prompt 运行一次;定时执行交给你的 agent 或 cron

常见问题

来源从哪里来?

Chat API 会返回它用过的页面,Web Fetch 把其中最相关的页面转成 Markdown,X Search 补充带日期的实践者帖子。每一项都会保留 URL。

可以做科技行业以外的市场研究吗?

可以。把范围占位符换成你的市场即可。小众市场的公开来源可能更少,简报会标出这些空白,而不是猜。

运行结束后证据还在吗?

在。LiveDoc 步骤会保留证据,返回的 short_id 让之后的问题可以继续检索同一批页面,而不必重新抓取。

一份简报要花多少?

按用量计费,当前费率在价格页面。prompt 会在花额度之前请求你确认。

可以每周跑一次吗?

可以,但这段 prompt 只运行一次。把调度放在能执行同一套 workflow 的 agent 或 cron 里。

来源在付费墙后面怎么办?

跳过并标记为不可用。简报不会用一个编造的事实或引语去填补付费墙后的空白。

相关 workflow

改成你的版本

同一套配方,按你实际的交付方式调整。

把简报写入文件

把回答、页面节选和 X 引语拼成 Markdown,再交给报告工具或提交到文档仓库。来源链接要始终跟在主张旁边——简报的价值取决于引用。

定时运行

把 `answer()` 包进 cron,每次把简报写到一个带日期的文件。同一个 LiveDoc 会持续积累来源,第四周可以直接用前三周收集的证据来回答。

跳过 LiveDoc

如果你已经有数据库,可以把 chat 答案和抓取到的页面存进去。LiveDoc 步骤是为了检索,不是默认的存储方案。

这套配方背后的参考页面,以及下一步可以看什么。