做 Claude Slides 自动化,TaoToken 怎么放进 CI
2026/9/17 18:45:05 网站建设 项目流程

1. 为什么把 Claude Slides 自动化放进 CI:从官方视频到工程落地

Anthropic 官方视频发布了 Claude Slides、Claude Design 和 Claude Docs 三款新功能,视频本身没有正文文本,具体能力细节以视频内容为准。对 DevOps 团队来说,这件事真正值得关注的点不是“又多了一个界面入口”,而是演示材料开始具备被流水线调用的可能:把需求变更、接口文档、测试结果和发布记录汇总起来,交给模型生成一套可交付的幻灯片,再作为 CI 制品归档。要把这个流程跑通,绕不开两个工程问题:模型调用走哪个端点、凭据怎么安全注入。TaoToken 的做法是把 Key 获取和 Base URL 配置收敛到统一入口,先到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=ci_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_source=taotoken_aicg_blog_end&utm_content=ci_env 完成注册并创建 API Key,然后把 Key 放进 CI 平台的 Secret 管理中。GitHub Actions 用 Repository secrets,GitLab CI 用 Masked Variables,Jenkins 用 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/checkout@v4 - name: Setup Node uses: actions/setup-node@v4 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", encoding="utf-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", data=json.dumps(payload).encode("utf-8"), headers={ "content-type": "application/json", "x-api-key": key, "anthropic-version": "2023-06-01" }, method="POST" ) with urllib.request.urlopen(req, timeout=180) as resp: data = json.load(resp) slides_md = data["content"][0]["text"] with open("slides.md", "w", encoding="utf-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", encoding="utf-8") as f: json.dump(manifest, f, ensure_ascii=False, indent=2) 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", encoding="utf-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", encoding="utf-8") as f: json.dump(manifest, f, ensure_ascii=False, indent=2) PY - name: Upload artifact uses: actions/upload-artifact@v4 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/cache@v4 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 的 timeout=180,并在流水线里设置 timeout-minutes。对于临时网络抖动,可以在脚本里做最多三次重试,重试间隔采用指数退避。不要无限重试,否则会拖垮构建队列。

import time, urllib.error for attempt in range(3): try: with urllib.request.urlopen(req, timeout=180) 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.json;Codex 使用独立的 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_source=taotoken_aicg_blog_end&utm_content=ci_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_source=taotoken_aicg_blog_end&utm_content=ci_chat
  • Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=ci_plan
  • 创建 API Key:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=ci_keys
  • Claude Code 文档:https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=ci_docs

把上面的流水线片段复制到你的仓库,替换 Secret 名称和提示词,先跑一次 workflow_dispatch,确认 slides.md、slides.pdf 和 manifest.json 都能正常上传。之后再接入主分支合并事件或每日定时任务,让演示材料跟着代码版本自动更新。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询