办公
把研究页面变成一套幻灯片
抽取页面,存成 LiveDoc 上下文,然后交给 PPT Task API 生成 deck,轮询拿到完成的链接。
复制 prompt
把方括号里的字段替换掉,然后粘贴到 Claude Code、Codex 或任何能访问终端的 AI。它会安装 Felo skill、在花额度前询问,并执行这套 workflow。
把这个来源变成一套幻灯片:[公开 URL 或 PDF 路径]。 受众:[谁来看]。页数:[6–10 页]。语言:[语言]。主题:[主题名或“default”]。 对公开页面(或上传文件)使用 Web Fetch,把来源保存为 LiveDoc 上下文,创建 PPT 任务,并轮询直到演示文稿完成。 输出: 1. 每页一行的幻灯片大纲。 2. 生成演示文稿的链接。 3. 作为上下文使用的 LiveDoc 链接。 规则: - 不要编造来源中没有的事实。缺口标注为“来源未提及”。 - PPT 任务会消耗额度,提交前先询问。 - 保留来源 URL、大纲和演示文稿链接。 - 不要在工作区外发布或分享演示文稿。 - 将大纲写入 ./deck-outline.md,并在对话中总结。
复制的内容也包含安装步骤和安全规则。
你会得到什么
一次运行的示例输出,不是实时生成。
来源 -> 幻灯片大纲
- 这份报告为什么重要
- 本季度发生了什么变化
- 三类客户细分
- 证据薄弱的地方
- 接下来测试什么
幻灯片:https://felo.ai/slides/... 上下文:https://felo.ai/livedoc/...
实际调用
给开发者:同一套 workflow 的可复制代码,按执行顺序排列。
展开实际 API 调用
抽取来源页面
用 Web Fetch 把公开页面抓成 Markdown,保留标题和正文。
deck.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 ExtractData = { data: { content: string } }; const page = await felo<ExtractData>("/v2/web/extract", { url: "https://example.com/research", output_format: "markdown", with_readability: true, });保存为 LiveDoc 上下文
创建 LiveDoc,把来源作为文档资源加进去,拿到 short_id。
deck.ts type LiveDocData = { data: { short_id: string } }; type ResourceData = { data: { id: string } }; const doc = await felo<LiveDocData>("/v2/livedocs", { name: "Quarterly research deck", description: "Source material for the next deck", }); const resource = await felo<ResourceData>( `/v2/livedocs/${doc.data.short_id}/resources/doc`, { title: "Source page", content: page.data.content, }, );提交幻灯片任务
调用 PPT Task API,传入页面内容和 LiveDoc short_id,拿到 task_id。
deck.ts type PptTaskData = { data: { task_id: string; livedoc_short_id: string }; }; const task = await felo<PptTaskData>("/v2/ppts", { query: "Six slides for a product review: findings, evidence, next steps", livedoc_short_id: doc.data.short_id, }); console.log(task.data.task_id);示例输出
{ "data": { "livedoc_short_id": "PvyKouzJirXjFdst4uKRK3", "ppt_business_id": "BfLPuQKmChk9SPmyQawxgr", "task_id": "019cad6d-e874-55ef-d577-686344b5a7e9" } }轮询直到完成
查询任务状态,直到完成并读取幻灯片链接。
deck.ts type TaskState = { data: { task_status: string; ppt_url?: string; live_doc_url?: string }; }; async function waitForDeck(taskId: string) { for (let attempt = 0; attempt < 40; attempt++) { const state = await felo<TaskState>(`/v2/tasks/${taskId}/historical`); if (state.data.task_status === "COMPLETED") return state.data; if (["FAILED", "EXPIRED", "CANCELED"].includes(state.data.task_status)) { throw new Error(`Deck task ${state.data.task_status}`); } await new Promise((resolve) => setTimeout(resolve, 3000)); } throw new Error("Deck task timed out"); } const result = await waitForDeck(task.data.task_id); console.log(result.ppt_url);示例输出
{ "task_status": "COMPLETED", "ppt_url": "https://felo.ai/slides/oM8A9iJHg8dT4ZKgHThQTx", "live_doc_url": "https://felo.ai/livedoc/oM8A9iJHg8dT4ZKgHThQTx" }
包含什么
- 来源页面的干净 Markdown 提取
- 保存为可复用上下文的 LiveDoc
- 返回完成链接的异步 PPT 任务
- 分享前可以 review 的幻灯片大纲
不做什么
- 来源必须是公开页面或已上传文件;仅登录页面可能失败
- 生成的幻灯片跟来源走,不覆盖完整品牌系统
- 一次运行生成一套 deck;批量需要循环
- 不编辑已有 deck,也不保证视觉完全匹配
- 不替你发布或分享 deck
常见问题
可以用 PDF 而不是 URL 吗?
可以。把 PPT 任务改成 multipart form data,上传文件;平台会把文件存成 LiveDoc 资源并创建 deck。
可以选择主题吗?
可以。先列出主题,再在创建任务时传主题 id。
一套 deck 要多久?
这是异步任务。轮询任务历史直到完成;长 deck 会比短 deck 慢。
会编辑我已有的 deck 吗?
不会。它从来源创建新 deck;编辑已有 deck 是另一套 workflow。
一套 deck 要花多少?
幻灯片生成按用量计费;当前费率在价格页面,prompt 会先请求确认。
来源可以复用吗?
可以。LiveDoc 保存来源,后续 deck 或 mindmap 可以复用它的 short_id。
相关 workflow
改成你的版本
同一套配方,按你实际的交付方式调整。
换成 PDF 来源
用 multipart 上传 PDF,平台会先存成 LiveDoc 资源。
指定主题
先列出可用主题,再在创建任务时传主题 id。
复用到下一套 deck
用同一个 LiveDoc short_id 创建新的 PPT 任务。
继续深入
这套配方背后的参考页面,以及下一步可以看什么。