Skip to content

SEO 内容规划 Agent

本页说明 SEO 内容规划 Agent 如何调研公开 SERP 与竞争内容,对照规划库中的已覆盖主题生成选题清单与 content brief。读完本页,你能理解这个场景为什么以 Web Agent 为核心、规划状态为什么放在规划库或 CMS 而不是 Memory,以及什么时候才需要交互式确认。

适用场景

Growth 或 content 团队需要基于公开 SERP、竞品内容和站点自身的规划状态安排下一批内容。SERP 与竞品内容随时在变,人工汇总时容易漏掉已覆盖的主题,也难以持续跟踪竞争内容的变化;选题决策需要每条都有数据或页面来源支撑,否则内容团队无从判断优先级。

典型触发时机:

  • 新一季内容日历规划启动,需要基于关键词空白产出选题清单。
  • 某组关键词流量下滑,需要调研竞品内容并评估更新优先级。
  • 站点进入新主题领域,需要梳理关键词空白和已覆盖主题的边界。

工程挑战

  • SERP 数据强时效:排名与内容形态每周在变,采集时间不带上,规划就建立在过期样本上;跨关键词组比较时,各组数据还必须来自相近的时间窗才有可比性。
  • 规划状态属于系统而不是记忆:已覆盖主题、内容日历和关键词策略是团队共享、随发布流程更新的结构化状态。把它们放进个人记忆,会和 CMS 的实际发布状态脱节——选题重复或互相冲突就是从这里开始的。
  • 证据链:每条选题的优先级依据都要能回溯到具体 SERP 或数据来源,否则内容团队无法判断该不该做,规划评审也无从复核。

模块组合

模块角色说明
GenAuth核心运行时以静默委托签发短时效凭证(所有产品调用必需);本场景默认无需交互式确认,接入登录态或写动作时才升级 interactive。
Web Agent核心通过 WebSearch 查询公开 SERP 与竞争内容,逐条保留来源 URL 与采集时间。
GUMem不使用关键词策略、已覆盖主题和内容日历是团队共享的规划状态,放在规划库或 CMS 里按版本维护、随发布流程更新;不存在需要跨会话沉淀的个人记忆。

SEO 内容规划 Agent 场景架构

何时需要交互式确认

所有产品调用都需要 GenAuth 委托令牌;公开只读场景用静默委托即可。公开 SERP 调研不需要用户逐次确认授权,静默签发的运行时凭证已经提供这个场景需要的约束:凭证短时效、可随时撤销、每次调用都带 grantIdauditId 可供追溯。

需要升级为 mode: 'interactive' 交互式确认、让用户在 Qoni Console 明确确认的情况:

  • 登录态访问:任务需要进入 Search Console、analytics 或 CMS 后台等登录后才可见的数据——本页示例不涉及;页面表现数据由你的应用自行导出后注入任务。
  • 写动作:发布、覆盖或删除 CMS 内容——本场景默认排除,选题清单由内容团队复核后按发布流程执行。

注意:本页示例申请的是产品级委托(products: ['webSearch'])。可查询范围这类细粒度边界由 GenAuth 的 Agent Profile 或策略层配置强制执行,不由任务 prompt 承担。完整语义见 Delegate Token 与缩权

工作流程

SEO 内容规划 Agent 工作流程

  1. 用户选择站点、主题或关键词范围。

  2. 应用从规划库或 CMS 读取关键词策略、已覆盖主题和内容日历(带版本),并获取静默运行时凭证。

  3. Web Agent 通过 WebSearch 逐组查询公开 SERP,记录排名页面、内容角度和来源 URL 与采集时间。

    检查点:每条 SERP 数据都带来源 URL 与采集时间;跨关键词组比较时确认采集时间窗相近。

  4. Agent 对照已覆盖主题去重、找差距,生成选题清单、content brief 和优先级建议。

    检查点:每条选题的优先级依据都应能回溯到具体数据或页面来源;无来源支撑的判断不进交付物。

  5. 内容团队复核清单;确认后的选题和日历决策写回规划库或 CMS,作为下一轮规划的输入。

示例代码

下面的示例使用官方 Qoni SDK@qoniai/qoni)把这个场景接到你的服务端:静默运行时凭证 → 从规划库读取策略与已覆盖主题 → 一次 webSearch.run() 完成 SERP 调研 → 确认后的选题写回规划库。

ts
import { Qoni } from '@qoniai/qoni'

const qoni = new Qoni({
  accessKey: process.env.QONI_ACCESS_KEY!,
  secretKey: process.env.QONI_SECRET_KEY!,
})

export async function planContent(
  userId: string,
  siteId: string,
  keywordGroups: string[],
) {
  // 1. 静默运行时凭证:公开 SERP 调研不涉及站点登录
  const { data: grant } = await qoni.delegateToken({
    user: { id: userId },
    agent: 'seo-content-planner',
    products: ['webSearch'],
  })

  // 2. 任务前:从规划库 / CMS 读取策略与已覆盖主题(不是 Memory)
  const plan = await loadPlanningState(siteId)
  // 例如 { version: '2026-Q3', strategy: ..., coveredTopics: [...], calendar: [...] }

  // 3. 一次 WebSearch 完成 SERP 调研:逐组关键词查询公开结果
  const search = await qoni.webSearch.run({
    token: grant.token,
    prompt: `
      Research public SERPs for these keyword groups:
      ${keywordGroups.join(', ')}.
      For each group, list top-ranking pages, content angles, and gaps
      versus the covered topics below. Record the source URL and
      collection time for every result; keep collection windows
      comparable across groups. Do not publish, overwrite, or edit any
      CMS content, and never promise ranking outcomes.

      Planning state (version ${plan.version}):
      ${JSON.stringify(plan)}
    `,
    maxResultsPerQuery: 8,
  })
  const result = await search.wait()

  // 4. 应用侧校验:无来源或缺采集时间的条目丢弃
  const topics = parseTopicPlan(result.output).filter(
    (t) => t.sourceUrl && t.collectedAt,
  )

  // 5. 内容团队确认后:选题与日历决策写回规划库(不是 Memory)
  //    await savePlanningDecisions(siteId, confirmedTopics)

  return {
    topicPlan: topics,
    planVersion: plan.version,
    audit: { auditId: grant.auditId, permissionBoundary: grant.grantedScopes },
  }
}

选题清单的输出结构由任务描述约定:这里约定逐条返回带 sourceUrlcollectedAt 的条目,应用侧 parseTopicPlan 负责解析与校验,缺来源或缺采集时间的条目直接丢弃。SDK 顶层只返回通用的 RunResultrunIdstatusoutputartifacts 等)。

数据与记忆边界

这个场景涉及四类数据,没有一类属于 GUMem:

  • 规划状态:关键词策略、已覆盖主题、内容日历——团队共享的结构化状态,放在规划库或 CMS 里按版本维护,任务时注入,确认后的选题决策也写回这里。
  • 业务状态:选题清单、content brief 和 SERP 采集样本——归档供规划评审与复核。
  • 审计记录:grantIdauditId 构成的委托与行为链——由 GenAuth 维护。
  • 用户 Memory:本场景不使用。如果未来要沉淀某个编辑的个人偏好(例如 brief 的写作口吻),那才是 GUMem 的位置;团队共享的规划状态不属于个人记忆。

失败处理

情况推荐处理
SERP 结果不稳定或抓取失败按失败处理并记录采集时间,不用不完整的样本得出趋势结论。
关键词组之间采集时间窗差距过大重新采集对齐时间窗后再比较,不混用新旧样本。
输出条目缺少来源或采集时间应用侧校验直接丢弃该条目,并在清单中标注丢弃数量。
需要登录才可见的分析数据本任务不访问;由应用另行导出注入,或另行发起交互式委托。

生产注意点

不要自动发布或覆盖 CMS 内容:选题清单由内容团队复核后按发布流程执行。对排名和竞品数据要保留来源与采集时间;SERP 数据有时效性,超过合理时间窗的数据应重新采集而不是直接复用。选题和优先级是基于当前数据的建议,不应向用户承诺排名效果。

下一步