Felo API PlatformFelo API Platform

研究

把一個問題變成有來源的研究簡報

先問一遍網路,把答案背後的頁面抓成 Markdown,再加入 X 上的實務者聲音,最後把證據存進一個之後還能繼續查詢的 LiveDoc。

建置時間20 分鐘難度進階更新於2026-10-29
適合誰創辦人與營運者市場研究員GTM 團隊

複製 prompt

把方括號裡的欄位替換掉,然後貼到 Claude Code、Codex 或任何能存取終端機的 AI。它會安裝 Felo skill、在花額度前詢問,並執行這套工作流程。

為[問題或決策]製作一份附來源的研究簡報。

範圍:[市場、地區、語言]。時間範圍:[過去 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

來源分歧

廠商基準顯示幾乎持平;獨立測試在多步退款上仍有差距。

仍然未知

這個差距會因更好的工具使用而縮小,還是需要更大的模型。

實際呼叫

給開發者:同一套工作流程的可複製程式碼,依執行順序排列。

展開實際 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": "Recent developments include …",
      "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
    "# Example Article\n\nExtracted article content…"
  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 只執行一次。把排程放在能執行同一套工作流程的 agent 或 cron 裡。

來源在付費牆後面怎麼辦?

跳過並標記為不可用。簡報不會用一個編造的事實或引語去填補付費牆後的空白。

相關工作流程

改成你的版本

同一套配方,依你實際的交付方式調整。

把簡報寫入檔案

把回答、頁面節錄和 X 引語拼成 Markdown,再交給報告工具或提交到文件倉庫。來源連結要始終跟在主張旁邊——簡報的價值取決於引用。

定時執行

把 `answer()` 包進 cron,每次把簡報寫到一個帶日期的檔案。同一個 LiveDoc 會持續累積來源,第四週可以直接用前三週收集的證據來回答。

跳過 LiveDoc

如果你已經有資料庫,可以把 chat 答案和抓取到的頁面存進去。LiveDoc 步驟是為了檢索,不是預設的儲存方案。

這套配方背後的參考頁面,以及下一步可以看什麼。