Felo API PlatformFelo API Platform

内容

用受众真正在问的问题填满一个月内容

用 Chat 梳理主题,找出受众在 X 上问的问题,拉一条参考视频转录找真实角度,再写一张四周内容日历,每一行都标注证据。

构建时间25 分钟难度进阶更新于2026-10-30
适合谁内容负责人社媒运营创作者

复制 prompt

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

为[受众]规划四周关于[主题]的内容。

渠道:[渠道]。允许的形式:[形式列表]。发布日:[星期几]。语言:[语言]。
参考视频(可选):[YouTube URL 或视频 ID]。受众问题时间范围:过去 [90] 天。

输出一个 Markdown 日历表,每个想法一行:
| 日期 | 形式 | 工作标题 | 角度 | 证据 |
- 日期:接下来四周内,使用允许的发布日。
- 形式:允许的形式之一。
- 工作标题:这篇内容叫什么。
- 角度:用一句话说明它对受众的承诺。
- 证据:支撑这个想法的提问、帖子、页面或视频时间戳。

表格之后补充:
1. 这个月依托的三个主题。
2. 哪些想法来自受众提问,哪些来自参考视频,哪些是你自己的假设。
3. 写每篇内容前还需要调研什么。
4. 附链接和日期的来源列表。

规则:
- 这些是想法,不是保证。不要承诺触达、点击、排名或增长。
- 不要编造趋势、搜索量、互动数据或引文。
- 每个受众问题都要对应到带日期的帖子或页面。证据不足时,把想法标注为假设。
- 参考视频只用于它实际覆盖的角度;简短引用并附时间戳。
- 消耗额度前,先展示计划执行的搜索和抽取并等待我批准。
- 不要排期帖子、在 CMS 创建草稿或发布任何内容。
- 将结果写入 ./content-calendar.md,并在对话中总结。

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

你会得到什么

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

日历示例(节选)

内容日历 — 示例月份

主题

  1. 清洁时间是隐性成本。
  2. 台面空间决定购买。
  3. 自用购买 vs 送礼购买。

日历

日期形式工作标题角度证据
2026-11-02轮播5 分钟清洁测试展示没人拍的清洁步骤@example_home,2026-10-24
2026-11-04短视频测量台面空间在真实台面上比较占地参考视频 — 42 秒
2026-11-09邮件简报密封圈为什么会坏解释买家反复报告的故障模式@example_buyer,2026-10-19

想法来自哪里

两行来自带日期的受众提问,一行来自参考视频;如果是假设行,会明确标注。

先调研什么

退货率和密封圈更换政策——上面的来源都没有覆盖。

来源

  • https://example.com/category-guide — 2026-10-12
  • https://x.com/example_home/status/... — 2026-10-24

实际调用

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

展开实际 API 调用
  1. 用 Chat 梳理主题

    问 Chat 这个主题下受众最常关心的子话题,保留来源。

    calendar.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; snippet: string }[];
      };
    };
    
    const topic = "portable espresso makers";
    const audience = "home espresso beginners";
    
    const themes = await felo<ChatData>("/v2/chat", {
      query: `Themes, recurring questions, and content gaps around ${topic} for ${audience}`,
    });
    
    const sources = themes.data.resources.slice(0, 5);

    示例输出

    {
      "answer": "Beginners ask about cleanup, counter space, and grind size …",
      "sources": [
        { "link": "https://example.com/guide", "title": "…", "snippet": "…" }
      ]
    }
  2. 找受众在 X 上问的问题

    在 X 搜索主题相关的提问,限定最近 90 天,保留账号和日期。

    calendar.ts
    type XData = {
      data: {
        tweets: {
          content: string;
          author: { username: string };
          created_at: string;
          url: string;
        }[];
      };
    };
    
    const since = Math.floor((Date.now() - 90 * 24 * 60 * 60 * 1000) / 1000);
    
    const questions = await felo<XData>("/v2/x/tweet/search", {
      query: `"${topic}" (recommend OR beginner OR how)`,
      limit: 50,
      since_time: since,
    });
    
    const asked = questions.data.tweets;

    示例输出

    { "data": { "tweets": [
      {
        "content": "How do you clean one of these without taking it apart?",
        "author": { "username": "example_home" },
        "created_at": "2026-10-24T11:30:00Z",
        "url": "https://x.com/example_home/status/..."
      }
    ] } }
  3. 拉一条参考视频转录

    用 YouTube Subtitling 拉一条相关视频,找一个可以复用的真实角度。

    calendar.ts
    type SubtitleData = {
      data: {
        title: string;
        contents: { text: string; start: number; duration: number }[];
      };
    };
    
    const videoCode = "dQw4w9WgXcQ"; // replace with your reference video id
    
    const video = await felo<SubtitleData>(
      `/v2/youtube/subtitling?video_code=${videoCode}&language=en&with_time=true`,
    );

    示例输出

    {
      "title": "Example Video Title",
      "contents": [
        { "text": "Subtitle text", "start": 42.3, "duration": 8.1 }
      ]
    }
  4. 排四周日历

    按日期、形式、工作标题、角度和证据排成 Markdown 表格。

    calendar.ts
    const start = new Date();
    const day = (offset: number) => {
      const date = new Date(start);
      date.setDate(date.getDate() + offset);
      return date.toISOString().slice(0, 10);
    };
    
    type Idea = {
      dayOffset: number;
      format: string;
      title: string;
      angle: string;
      evidence: string;
    };
    
    // Rows come from the themes, the dated questions, and the transcript.
    const anchor = video.data.contents[0];
    
    const ideas: Idea[] = [
      {
        dayOffset: 1,
        format: "carousel",
        title: "The 5-minute cleanup test",
        angle: "Show the cleanup step nobody films",
        evidence: asked[0]?.url ?? "hypothesis",
      },
      {
        dayOffset: 3,
        format: "short video",
        title: "Counter space, measured",
        angle: "Compare footprints on one real counter",
        evidence: anchor
          ? `${video.data.title} — ${Math.round(anchor.start)}s`
          : video.data.title,
      },
    ];
    
    const calendar = [
      "| Date | Format | Working title | Angle | Evidence |",
      "| --- | --- | --- | --- | --- |",
      ...ideas.map(
        (idea) =>
          `| ${day(idea.dayOffset)} | ${idea.format} | ${idea.title} | ${idea.angle} | ${idea.evidence} |`,
      ),
    ].join("\n");
    
    console.log(calendar);

    示例输出

    | Date | Format | Working title | Angle | Evidence |
    | --- | --- | --- | --- | --- |
    | 2026-11-02 | carousel | The 5-minute cleanup test | Show the cleanup step nobody films | https://x.com/example_home/status/... |
    | 2026-11-04 | short video | Counter space, measured | Compare footprints on one real counter | Example Video Title — 42s |
  5. 存进 LiveDoc

    把日历和来源存进 LiveDoc,月底复盘时可以直接检索。

    calendar.ts
    type LiveDocData = { data: { short_id: string } };
    
    const plan = await felo<LiveDocData>("/v2/livedocs", {
      name: `Content calendar: ${topic}`,
      description: "Monthly plan with themes, calendar rows, and evidence",
    });
    
    await felo(`/v2/livedocs/${plan.data.short_id}/resources/urls`, {
      urls: sources.map((source) => ({ url: source.link, title: source.title })),
    });
    
    await felo(`/v2/livedocs/${plan.data.short_id}/resources/doc`, {
      title: `Content calendar — ${day(0).slice(0, 7)}`,
      content: calendar,
    });
    
    type Retrieved = { data: { title: string; content: string; score: number }[] };
    
    const lastMonth = await felo<Retrieved>(
      `/v2/livedocs/${plan.data.short_id}/resources/retrieve`,
      { query: "what did we plan last month" },
    ).then((res) => res.data.filter((hit) => hit.score >= 0.7));

    示例输出

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

包含什么

  • 来自 Chat 的主题地图
  • X 上带日期的受众问题
  • 一条参考视频的转录和角度
  • 按四周排好的内容日历
  • 保存计划和来源的 LiveDoc

不做什么

  • 不预测表现,也不保证流量
  • 不读取你的历史 analytics
  • 不自动写完整帖子或发布
  • 没有参考视频时可以跳过该步骤
  • 日历是建议,不是承诺

常见问题

日历里的选题从哪来?

来自 Chat 的主题地图、X 上受众真实提问,以及一条参考视频的角度。每条都保留证据链接或日期。

它知道过去什么内容表现好吗?

不知道。它不读取你的 analytics;历史表现需要你自己补进去。

会顺便把帖子写好吗?

不会。它产出日历和角度,写作仍由你或写作 agent 完成。

没有参考视频怎么办?

跳过该步骤即可,主题和 X 问题仍然可以支撑日历。

可以自动排期吗?

不可以。它只生成计划文件,发布排期需要你自己的工具。

一次规划要花多少?

Chat、X 搜索和视频转录按用量计费;当前费率在价格页面,prompt 会先请求确认。

相关 workflow

改成你的版本

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

只排两周

把四周压缩成两周,适合刚开始稳定输出的团队。

按渠道拆分

为 newsletter、X 和 YouTube 各排一列,同一主题不同形式。

加入产品发布节点

把发布日和活动日作为固定行,再围绕它们填内容。

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