做 Claude Slides 自动化,TaoToken 怎么放进 CI 📅 发布时间:2026/9/17 18:45:23 👁 浏览次数: 1. 为什么把 Claude Slides 自动化放进 CI从官方视频到工程落地Anthropic 官方视频发布了 Claude Slides、Claude Design 和 Claude Docs 三款新功能视频本身没有正文文本具体能力细节以视频内容为准。对 DevOps 团队来说这件事真正值得关注的点不是“又多了一个界面入口”而是演示材料开始具备被流水线调用的可能把需求变更、接口文档、测试结果和发布记录汇总起来交给模型生成一套可交付的幻灯片再作为 CI 制品归档。要把这个流程跑通绕不开两个工程问题模型调用走哪个端点、凭据怎么安全注入。TaoToken 的做法是把 Key 获取和 Base URL 配置收敛到统一入口先到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentci_intro 拿 TaoToken Key再把客户端 Base URL 设为 https://taotoken.net/api。这样 CI 中消耗 Token 的环节就变成了一个可审计、可替换、可缓存的标准步骤。很多团队第一次尝试把 Claude Slides 放进 CI 时会直接写一个 shell 脚本调用模型然后把结果塞进某台构建机的桌面目录。这种做法在本地演示可行一进流水线就暴露三个问题密钥硬编码、模型端点散落在多个脚本、制品没有版本信息。DevOps 视角下幻灯片不是“点一下导出的文件”而是流水线的一种输出物。它应该有输入、有步骤、有校验、有产物清单。本文不讨论 Claude Slides 界面里具体有哪些按钮因为官方视频没有提供正文说明本文只讨论可复现的接入方式在 CI 环境变量里配置 TaoToken 的 Base URL 和 Key用脚本调用兼容 Anthropic 的消息接口生成 Marp 或 Reveal.js 能识别的 Markdown再渲染成 PDF 或 PPTX最后上传制品并记录 manifest。这样做还有一个好处演示材料的生成过程可以和代码版本绑定。每次主分支合并、每次 Release Tag、每次每日构建都可以按需生成对应版本的幻灯片。Token 消耗集中在 CI 任务里用量归属清晰失败可重试超时可中断不会影响开发者的本地环境。下面从配置注入开始一步步把 TaoToken 放进 CI。2. TaoToken 在 CI 中的三种注入方式环境变量、settings.json、config.toml在 CI 里使用 TaoToken第一步永远不是写流水线而是先拿到 Key。到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentci_env 完成注册并创建 API Key然后把 Key 放进 CI 平台的 Secret 管理中。GitHub Actions 用 Repository secretsGitLab CI 用 Masked VariablesJenkins 用 Credentials。不要把 YOUR_API_KEY 直接写进 YAML 或脚本占位符只用于本地示例。最通用的注入方式是环境变量。Claude Code 以及大部分兼容 Anthropic 的客户端都会读取 ANTHROPIC_BASE_URL 和 ANTHROPIC_API_KEY。Base URL 固定为 https://taotoken.net/api不要在后面多加 /v1也不要在前面少写 /api。Key 使用你在控制台创建的密钥。env: ANTHROPIC_BASE_URL: https://taotoken.net/api ANTHROPIC_API_KEY: ${{ secrets.TAOTOKEN_API_KEY }} ANTHROPIC_MODEL: claude-3-5-sonnet TAOTOKEN_API_KEY: ${{ secrets.TAOTOKEN_API_KEY }}如果你的 CI 使用 Claude Code可以在项目里放一个 settings.json。注意区分用户级和项目级配置CI 中优先使用环境变量覆盖避免把个人配置带进流水线。{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: YOUR_API_KEY }, permissions: { allow: [ Bash(npx marp:*), Bash(python3:*) ] } }如果同一个 CI 环境里还要跑 Codex必须单独维护 config.toml。Codex 的配置体系和 Anthropic 客户端不同不要把 ANTHROPIC_* 变量直接套到 Codex 上否则会出现认证失败或端点不匹配。下面是一个分离配置的示例实际字段以你使用的 Codex 版本为准。# Codex 独立配置不要复用 ANTHROPIC_* 变量 model claude-3-5-sonnet base_url https://taotoken.net/api api_key YOUR_API_KEY至于 CC Switch 三件套可以理解为全局环境变量、用户级 settings.json、项目级 settings.json 三层。本地开发可以三层并存CI 中只保留环境变量层和必要的项目级配置这样构建机不会依赖某个开发者的个人目录。三件套的优先级建议是CI Secret 项目级 settings.json 用户级 settings.json。只要 Base URL 和 Key 正确后续调用模型生成幻灯片就只是普通的 HTTP 请求。3. 流水线片段从 Markdown 到制品包的完整 Job下面给出一段可运行的 GitHub Actions 工作流片段。它的目标不是直接调用某个封闭的 Claude Slides API因为官方视频没有给出 API 细节它的目标是把模型生成演示材料这件事拆成可控步骤读取仓库文档调用 TaoToken 的 Anthropic 兼容端点生成 Marp Markdown渲染 PDF生成 manifest最后上传制品。你可以把提示词替换成自己的业务上下文。name: claude-slides-ci on: push: branches: [ main ] workflow_dispatch: jobs: build-slides: runs-on: ubuntu-latest timeout-minutes: 20 env: ANTHROPIC_BASE_URL: https://taotoken.net/api ANTHROPIC_API_KEY: ${{ secrets.TAOTOKEN_API_KEY }} steps: - name: Checkout uses: actions/checkoutv4 - name: Setup Node uses: actions/setup-nodev4 with: node-version: 20 - name: Install Marp CLI run: npm install -g marp-team/marp-cli - name: Generate slides markdown run: | python3 - PY import os, json, urllib.request, hashlib, datetime base os.environ[ANTHROPIC_BASE_URL].rstrip(/) key os.environ[ANTHROPIC_API_KEY] with open(CHANGELOG.md, r, encodingutf-8) as f: changelog f.read() prompt f请根据下面的变更记录生成一份 8 页左右的演示材料。 要求 1. 输出 Marp 兼容 Markdown 2. 每页使用 --- 分隔 3. 第一页是标题页 4. 最后一页是下一步计划 5. 不要输出解释性文字只输出 Markdown。 变更记录 {changelog[:6000]} payload { model: os.environ.get(ANTHROPIC_MODEL, claude-3-5-sonnet), max_tokens: 4096, messages: [ {role: user, content: prompt} ] } req urllib.request.Request( f{base}/v1/messages, datajson.dumps(payload).encode(utf-8), headers{ content-type: application/json, x-api-key: key, anthropic-version: 2023-06-01 }, methodPOST ) with urllib.request.urlopen(req, timeout180) as resp: data json.load(resp) slides_md data[content][0][text] with open(slides.md, w, encodingutf-8) as f: f.write(slides_md) manifest { commit: os.environ.get(GITHUB_SHA, local), model: payload[model], generated_at: datetime.datetime.utcnow().isoformat() Z, files: [slides.md, slides.pdf], sha256: { slides.md: hashlib.sha256(slides_md.encode(utf-8)).hexdigest() } } with open(manifest.json, w, encodingutf-8) as f: json.dump(manifest, f, ensure_asciiFalse, indent2) PY - name: Render PDF run: | marp slides.md --pdf --allow-local-files -o slides.pdf - name: Update manifest hash run: | python3 - PY import json, hashlib with open(manifest.json, r, encodingutf-8) as f: manifest json.load(f) with open(slides.pdf, rb) as f: manifest[sha256][slides.pdf] hashlib.sha256(f.read()).hexdigest() with open(manifest.json, w, encodingutf-8) as f: json.dump(manifest, f, ensure_asciiFalse, indent2) PY - name: Upload artifact uses: actions/upload-artifactv4 with: name: claude-slides path: | slides.md slides.pdf manifest.json这段流水线有三个关键点。第一Key 来自 Secret不在日志中打印。第二Base URL 使用 https://taotoken.net/api请求路径拼接为 /v1/messages这是 Anthropic 兼容接口的常见形式具体以 TaoToken 控制台文档为准。第三制品不只上传 PDF还上传 Markdown 和 manifest方便后续审计和二次渲染。如果你使用 GitLab CI可以把同样的逻辑放进 .gitlab-ci.yml。核心差异只是变量声明和 artifact 关键字。stages: - build claude-slides: stage: build image: node:20 variables: ANTHROPIC_BASE_URL: https://taotoken.net/api ANTHROPIC_API_KEY: $TAOTOKEN_API_KEY script: - npm install -g marp-team/marp-cli - python3 scripts/generate_slides.py - marp slides.md --pdf --allow-local-files -o slides.pdf - python3 scripts/update_manifest.py artifacts: paths: - slides.md - slides.pdf - manifest.json expire_in: 30 days注意脚本中的 generate_slides.py 就是上面内联 Python 的独立版本。把长脚本从 YAML 里拆出来更利于本地复现和单元测试。CI 只负责提供环境变量和触发条件模型调用逻辑放在仓库脚本里这样开发者在本地也可以用同样的 Base URL 和 Key 跑一遍。4. 制品清单与校验CI 里到底产出什么、怎么验幻灯片自动化的失败往往不是模型调用失败而是产物不可信。PDF 生成了但只有一页、Markdown 生成了但 Marp 语法错误、manifest 没记录模型版本这些问题如果不校验制品上传后也没人敢用。一个可复现的 CI 任务至少应该产出以下文件。文件作用是否必须slides.md模型生成的 Marp Markdown可读可改是slides.pdf渲染后的演示文稿便于分发是slides.pptx可选的 PPTX便于二次编辑否manifest.json记录 commit、模型、时间、哈希是checksums.txt所有制品的 SHA256 汇总建议slides.log脱敏后的调用日志建议校验脚本可以放在流水线的最后一步。它不调用模型只检查制品是否完整。#!/usr/bin/env bash set -euo pipefail test -s slides.md test -s slides.pdf test -s manifest.json pdfinfo slides.pdf | grep -E Pages: [1-9][0-9]* jq -e .commit ! null manifest.json jq -e .model ! null manifest.json jq -e .sha256[slides.md] ! null manifest.json sha256sum slides.md slides.pdf checksums.txt如果希望更严格可以在 manifest 里记录幻灯片页数。Marp 渲染后可以通过 pdfinfo 获取页数再写回 manifest。PAGES$(pdfinfo slides.pdf | awk /^Pages:/ {print $2}) jq --arg pages $PAGES .slide_count ($pages | tonumber) manifest.json manifest.tmp mv manifest.tmp manifest.json制品上传时建议把 checksums.txt 也带上。这样下载方可以先校验哈希再打开 PDF。对于需要长期归档的场景可以把 manifest 和 checksums 一起存到对象存储并在 CI 日志里输出制品地址。注意CI 日志不要输出完整 Key最多输出 Key 的前四位和后四位或者只输出“Key 已注入”的布尔值。从成本角度看Token 消耗集中在生成 Markdown 这一步。渲染 PDF 是本地工具链不消耗模型 Token。因此优化方向有两个一是压缩提示词只把必要的变更记录传给模型二是对同一 commit 缓存 slides.md避免重复构建时重复调用。GitHub Actions 可以用 actions/cache把 slides.md 和 manifest.json 按 commit SHA 缓存命中后直接跳过模型调用。- name: Cache slides uses: actions/cachev4 with: path: | slides.md manifest.json key: slides-${{ github.sha }} - name: Generate slides markdown if: steps.cache-slides.outputs.cache-hit ! true run: python3 scripts/generate_slides.py缓存命中时流水线仍然会执行渲染和校验但不会再次消耗 TaoToken 的 Token。这个设计对每日构建尤其友好。5. 排障清单401、404、模型名、网络超时即使配置看起来正确CI 中仍然可能遇到认证、路径、模型名和网络问题。下面按现象整理排查顺序。所有命令都在本地或 CI 日志中执行不要连接任何生产数据库。401 Unauthorized最常见原因是 Key 没注入成功。检查 CI Secret 名称是否和 YAML 中引用一致检查 ANTHROPIC_API_KEY 是否为空。另一个原因是 Base URL 写成了带 /v1 的地址导致请求路径变成 /v1/v1/messages。正确做法是 Base URL 只写到 https://taotoken.net/api由客户端或脚本拼接 /v1/messages。404 Not Found通常是路径拼接错误。可以先用 curl 做最小验证curl -sS -o /dev/null -w %{http_code}\n \ -X POST https://taotoken.net/api/v1/messages \ -H content-type: application/json \ -H x-api-key: $ANTHROPIC_API_KEY \ -H anthropic-version: 2023-06-01 \ -d {model:claude-3-5-sonnet,max_tokens:16,messages:[{role:user,content:ping}]}如果返回 404先确认 TaoToken 控制台中的接口路径说明再检查 Base URL 是否被某层配置覆盖。模型名错误如果返回 model not found说明请求里的模型名在当前账号下不可用。不要盲目使用旧模型名先到控制台查看可用模型列表。把可用模型名写入 CI 变量 ANTHROPIC_MODEL而不是硬编码在脚本里。超时或连接重置CI 环境访问外部接口时可能受网络策略、代理或 DNS 影响。给请求设置明确超时例如 urllib 的 timeout180并在流水线里设置 timeout-minutes。对于临时网络抖动可以在脚本里做最多三次重试重试间隔采用指数退避。不要无限重试否则会拖垮构建队列。import time, urllib.error for attempt in range(3): try: with urllib.request.urlopen(req, timeout180) as resp: data json.load(resp) break except urllib.error.URLError as e: if attempt 2: raise time.sleep(2 ** attempt)Codex 配置冲突如果同一个 CI 里既有 Claude Code 又有 Codex务必隔离配置。Claude Code 使用 ANTHROPIC_* 环境变量或 settings.jsonCodex 使用独立的 config.toml。不要把 ANTHROPIC_API_KEY 导出给 Codex 进程也不要把 Codex 的 base_url 和 Anthropic 的 Base URL 混在同一个变量里。CC Switch 三件套在本地可以灵活切换在 CI 中建议只保留一套有效配置减少排障变量。制品校验失败如果 PDF 页数为 0先检查 slides.md 是否被 Marp 正确解析。常见原因是模型输出了非 Markdown 的说明文字或者代码块包裹了整个内容。可以在生成脚本里增加后处理去掉开头的markdown 和结尾的只保留正文。另一个原因是 Marp 需要 --allow-local-files 才能读取本地图片CI 中如果幻灯片引用图片记得开启该参数。6. 把 TaoToken 放进 CI 的最小闭环与 CTA回到最初的目标做 Claude Slides 自动化把 TaoToken 放进 CI。最小闭环可以总结为五步。第一步到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentci_summary 获取 TaoToken Key。第二步在 CI 平台创建 Secret把 Key 存为 TAOTOKEN_API_KEY。第三步在流水线中设置 ANTHROPIC_BASE_URL 为 https://taotoken.net/api并注入 ANTHROPIC_API_KEY。第四步用脚本调用兼容 Anthropic 的消息接口根据仓库文档生成 Marp Markdown。第五步渲染 PDF、生成 manifest、执行校验、上传制品。这个闭环不依赖特定 CI 平台GitHub Actions、GitLab CI、Jenkins、CircleCI 都可以套用。关键是把模型调用封装成仓库内的脚本把凭据交给 CI Secret把输出物变成可校验的制品。Claude Slides、Claude Design、Claude Docs 的具体界面能力以官方视频为准但工程侧的接入方式可以先稳定下来Base URL 固定、Key 可轮换、模型名可配置、制品可追溯。如果你还没有创建 Key可以从下面这条路径开始先体验模型对话确认端点可用再选择 Coding Plan 获得更适合持续集成的额度然后创建 API Key 并写入 CI Secret最后参考 Claude Code 文档完成客户端配置。模型对话https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentci_chatCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentci_plan创建 API Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentci_keysClaude Code 文档https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentci_docs把上面的流水线片段复制到你的仓库替换 Secret 名称和提示词先跑一次 workflow_dispatch确认 slides.md、slides.pdf 和 manifest.json 都能正常上传。之后再接入主分支合并事件或每日定时任务让演示材料跟着代码版本自动更新。