AI Podcasting 是一个面向客户、由智能体驱动的播客单集操作技能,用于在指定仓库中执行单集提交与介绍文案更新。它直接调用版本化的 WIN 客户端 API(https://api.aipodcast.ing/client/v1),不通过前端或浏览器 UI 自动化,服务端会校验已认证主体的操作范围与允许的节目。
用途 该技能用于客户侧、智能体驱动的单集操作,主要覆盖两类任务:提交新的主单集来源,以及为已有未发布单集更新介绍、标题、缩略图等素材。
主要能力 技能通过主 CLI scripts/ai_podcasting_client.py 提供以下子命令:
- doctor:校验凭证、客户身份、TCR 节目授权以及所需操作范围。建议在安装或轮换凭证后、以及调试被拒操作前运行。
- list-episodes:列出 TCR 单集,默认返回丰富的逐集摘要,支持 --publication-state all|published|unpublished 以及可选的 --start-date、--end-date 筛选,结果按最新优先排序后再应用 --limit。使用 --include-raw 可额外返回经过清理的上游单集对象。
- submit-episode:通过 /client/v1/episodes 创建可重试的新单集,使用命令请求 ID 作为 Idempotency-Key;不确定的提交可用 --request-id <same-id> 重试,只有刻意创建独立单集时才使用新请求 ID。
- update-intro-copy:通过 /client/v1/episodes/{sourceId}/intro 为已有未发布单集更新介绍、标题、缩略图、片尾等素材。
此外,scripts/aip_local_upload_helper.py 用于在用户提供本地文件路径且没有来源 URL 时上传本地文件,返回临时的 R2 cache/ URL 供主 CLI 使用。上传用途限定为 episode_main、episode_asset、episode_intro、episode_outro 或 thumbnail,其 URL 不应视为永久资源。
使用方式 认证设置:不要将实际 API 密钥粘贴到技能、payload JSON、命令参数或聊天中。密钥由 Adi 通过带外方式分享,需先存储到本地环境:
mkdir -p ~/.secrets/aipodcasting printf 'AIPODCASTING_CLIENT_API_KEY=<key-from-Adi>\n' > ~/.secrets/aipodcasting/env chmod 600 ~/.secrets/aipodcasting/env
如果密钥文件位于其他位置,设置 AIPODCASTING_CLIENT_API_KEY_FILE 为该绝对路径;该变量只选择文件,不包含凭证本身。直接使用原始 API 时,以 Authorization: Bearer <key-from-Adi> 发送同一密钥。客户安装或升级请遵循 references/client-setup.md,并在运行变更操作前要求 doctor 成功。
快速开始示例: 检查凭证与授权: python3 scripts/ai_podcasting_client.py --json doctor 列出单集以查找目标 ID: python3 scripts/ai_podcasting_client.py --json list-episodes 提交新单集: python3 scripts/ai_podcasting_client.py --json submit-episode --payload-file references/submit-episode.example.json 更新已有单集介绍文案: python3 scripts/ai_podcasting_client.py --json update-intro-copy --source-id <EPISODE_SOURCE_ID> --payload-file references/update-intro-copy-tcr.example.json 上传本地辅助文件并获取临时公共 URL: python3 scripts/aip_local_upload_helper.py --json --purpose thumbnail /absolute/path/to/file.png
媒体来源规则(TCR):当存在 Descript 项目/合成/来源 URL 时,应使用该 URL 作为来源,不要仅为创建来源文件而导出、上传或提交 MP4。预期的 Descript Web URL 形如 https://web.descript.com/<project-id>/<composition-id>,应从 Descript 复制实际 URL,不要伪造 ID。主来源使用 mainSourceUrl,介绍来源使用 introSourceUrl。MP4 URL 和本地 MP4 路径仅为回退输入;若同时已知 Descript URL 和 MP4,应提交 Descript URL 并省略 MP4。TCR 主单集提交拒绝 .mp3 主来源输入,应改用原始录音、会话或视频来源链接(如 Riverside、YouTube 或直接的非 MP3 媒体 URL),这不是仅限 Riverside 的白名单。
接口说明:固定端点为 https://api.aipodcast.ing/client/v1,固定节目为 TCR,认证使用来自 ~/.secrets/aipodcasting/env 或 AIPODCASTING_CLIENT_API_KEY_FILE 指定文件的 bearer token。CLI 不接受 base-url 覆盖或基于环境变量的 base URL 变更,也不接受节目选择。JSON 是默认输出契约,仅在操作员检查时使用 --plain 或 --human。JSON 模式返回包含 schema_version、command、status、data、error、meta 的稳定信封。
输入要求:submit-episode 需要 --payload-file 且包含 mainSourceUrl;update-intro-copy 需要 --source-id 与 --payload-file,目标为已有未发布单集。常见补丁字段包括 introSourceUrl、title、videoThumbnails、thumbnailText、transcript、instructionsToEditor、customNewsletterDraftUrl、audioThumbnailLink、outroMusicLink。videoThumbnails 可为单个公共 HTTP/HTTPS URL 或 URL 列表,客户端会将其规范化为 deliverables.thumbnails.video.url(第一个)与 deliverables.thumbnails.video.variants(全部有序列表)。customNewsletterDraftUrl 存储客户提供的 Ghost 新闻稿草稿链接,本身不会发布或替换生成的新闻稿。
对话策略:当聊天上下文中缺少值时,先扫描当前线程复用用户已提供的值,不要重复询问。若用户措辞无法区分是提交新主单集还是更新已有单集介绍,应先澄清,询问“Do you want to: 1. submit a new main episode source 2. update intro/title/thumbnail assets for an existing episode”,用户选择后再继续。介绍更新仅适用于未发布单集;若缺少 source_id,立即以 --publication-state unpublished 运行 list-episodes,并以枚举列表让用户选择,用户回复编号时映射到对应 source_id 继续。仅询问用户想要更改的字段。可选值不明确时应省略而非猜测。仅在用户明确要求预览时才使用 --dry-run。对于文件类型字段,客户端接受公共 HTTP/HTTPS URL 或本地文件路径;若用户提供本地路径,先运行 scripts/aip_local_upload_helper.py 并使用其返回的公共 URL,不要将未解析的本地文件系统路径传入单集 API payload。
适用场景 适用于客户希望以智能体驱动方式执行 TCR 播客单集操作,包括提交新单集、列出与筛选单集、更新未发布单集的介绍/标题/缩略图等素材,以及上传本地辅助文件获取临时 URL。
限制 所有提交与列表操作锁定到 TCR 节目,不支持节目选择或 base-url 覆盖。凭证只能从指定文件读取,不接受密钥标志或密钥值环境变量回退。介绍更新仅适用于未发布单集。本地上传 URL 为临时缓存对象,不应视为永久资源。TCR 主单集提交拒绝 .mp3 主来源输入。技能与参考路径均相对于技能目录本身,而非仓库根目录。