ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何用 Harness 的 Agent 与 Sub-Agent 一句话交付产品功能?TaoToken 统一 Key 配置实战

如何用 Harness 的 Agent 与 Sub-Agent 一句话交付产品功能?TaoToken 统一 Key 配置实战 1. 从 Vibe Coding 到 Harness一句话交付产品功能到底难在哪如果你已经在用 Claude Code 或类似的 AI 编码工具写代码大概率经历过这个阶段让 AI 写一个功能它写得挺快但改起来要命。页面某个元素位置不对来回沟通几十分钟提示词一长AI 就开始“上下文焦虑”提前收尾前后端两个仓库各自为战联调时发现接口对不上又得重新来一轮。这就是 Vibe Coding 的典型困境——AI 写代码人统筹状态。代码能跑但流程是碎的。Harness 模式想解决的就是这个问题。它的核心思路是代码库是唯一事实源Agent 自治流转状态。你只需要说一句话比如“给视频大模型增加评估任务类型”后面的需求分析、前后端开发、集成测试、E2E 测试全部由 Sub-Agent 自动流转完成。人只在 PRD 审核环节介入一次。听起来很美好但落地时有三个硬骨头第一代码库必须统一。前后端分仓时Agent 看不到全貌跨仓库的知识只存在人脑里Agent 访问不到。用 Git Submodule 把前后端整合到一个主仓库是成本最低的 AI-First 重构方式。第二Agent 之间需要交接协议。6 个 Sub-Agent 各管一段如果交接靠“哑巴交流”任务断连、状态错乱、故障无法追溯分布式协作的价值直接归零。第三API 通道要统一。多个 Agent 并行跑每个都要调模型Key 管理、额度分配、通道切换如果靠手工维护流水线跑不起来。这篇会重点讲怎么用 TaoToken 统一 Key 和 API 通道把这条链路串起来。下面按实际搭建顺序走一遍先配 TaoToken 通道再搭仓库骨架然后写 config.toml 和 settings.json最后验证 Sub-Agent 调用。2. TaoToken 前置统一 Key 与 API 通道Harness 模式下你的 Agent 流水线里至少有 6 个 Sub-Agent 在跑每个 Agent 都要调模型。如果每个 Agent 单独配 Key会出现三个问题额度分散不好管、通道切换要改多处配置、某个 Key 限流时整个流水线卡住。TaoToken 的作用是把这些统一起来。你只需要一个 Key通过一个 API 端点就能让所有 Agent 走同一条通道。对于 Harness 这种多 Agent 并行的场景统一通道意味着额度集中管理、切换模型只改一个地方、限流时统一降级。2.1 获取 Key 与确认端点先到控制台创建 API Key。地址是https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite创建后你会拿到一个以sk-开头的 Key。API 端点统一用https://taotoken.net/api注意这个端点不带 UTM 参数是纯 API 地址。模型对话、Coding Plan、控制台分别对应模型对话https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewriteCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite2.2 环境变量注入最省事的方式是把 Key 写进环境变量所有 Agent 共享。在~/.zshrc或~/.bashrc里加export TAOTOKEN_API_KEYsk-你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api然后source ~/.zshrc生效。这样 Claude Code、Codex CLI、以及你自己写的脚本都能读到同一个 Key不用在每个 Agent 配置里重复填。注意不要把 Key 硬编码进settings.json或config.toml后提交到仓库。用环境变量引用配置文件里只写变量名。3. 可复制配置CLAUDE.md Git Submodule config.toml settings.json这一节是整篇的核心给出可以直接抄的骨架。按顺序来先建仓库结构再写 CLAUDE.md然后配 config.toml 和 settings.json最后用 CC Switch 做多配置切换。3.1 Git Submodule 单仓结构主仓库叫versus前后端作为子模块挂进来mkdir versus cd versus git init git submodule add versus-server仓库地址 versus-server git submodule add versus-fe仓库地址 versus-fe目录结构长这样versus/ ├── versus-server/ # 服务端子模块 (Go Gin) │ └── CLAUDE.md # 服务端项目指令 ├── versus-fe/ # 前端子模块 (React Vite) │ └── CLAUDE.md # 前端项目指令 ├── scripts/ │ ├── setup.sh # 初始化开发环境 │ ├── pull-all.sh # 递归拉取所有子模块 │ └── status.sh # 查看仓库状态 ├── .claude/ │ ├── settings.json # Agent 与 MCP 插件全局配置 │ ├── settings.local.json # 本地工具权限授权不入库 │ ├── agents/ # 6 个协作 Agent 定义 │ │ ├── requirement-designer.md │ │ ├── go-api-implementer.md │ │ ├── frontend-engineer.md │ │ ├── test-case-designer.md │ │ ├── integration-test-runner.md │ │ └── e2e-test-executor.md │ └── agent-memory/ # Agent 跨会话记忆 ├── docs/ │ └── requirements/ # 按 REQ-ID 组织的需求产物 ├── CLAUDE.md # 项目整体知识 └── dev.sh # 一键启动前后端子模块的坑在于拉主仓库代码时要递归拉子模块子模块有改动时要同时提交主仓库更新版本索引。写个pull-all.sh省事#!/bin/bash git pull git submodule update --init --recursive git submodule foreach git checkout main git pull3.2 CLAUDE.md 定义任务边界主仓库的CLAUDE.md放跨前后端、跨 Agent 的全局知识。子模块的CLAUDE.md放各自领域知识。主仓库的骨架# versus 项目全局知识 ## 项目背景 大模型评测平台前端 React Vite后端 Go Gin。 ## 仓库结构 - versus-server/后端服务子模块 - versus-fe/前端服务子模块 - docs/requirements/按 REQ-ID 组织的需求产物 ## Agent 协作规则 - 所有 Agent 定义在 .claude/agents/ 下 - Agent 交接必须输出 AGENT-HANDOFF 块 - PRD 阶段需要人工审核其余阶段自动流转 ## 全局约束 - 后端端口 8899前端端口 3000 - 集成测试用 8899/3000E2E 测试用 8901/3001 - 禁止修改 .claude/ 目录下的 Agent 定义子模块的CLAUDE.md写架构和编码规范比如versus-server/CLAUDE.md# versus-server 服务端知识 ## 架构 Go Gin分层handler → service → repository ## 编码规范 - 所有接口返回统一 Response 结构 - 错误码定义在 pkg/errcode/ - 新增接口必须补 api-summary.md ## 约束 - 不要改 versus-fe/ 下的任何文件 - 接口变更必须同步更新 docs/requirements/{REQ-ID}/api-summary.md3.3 config.toml 骨架如果你用 Codex CLI 或类似工具config.toml是主配置。关键是模型通道指向 TaoToken[model] provider taotoken base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY model claude-sonnet-4-20250514 [agent] max_sub_agents 6 handoff_protocol AGENT-HANDOFF memory_dir .claude/agent-memory [agent.ports] backend 8899 frontend 3000 e2e_backend 8901 e2e_frontend 3001api_key_env指向环境变量名不写明文。base_url统一走 TaoToken所有 Agent 共享一条通道。3.4 settings.json 骨架Claude Code 的.claude/settings.json管 Agent 和 MCP 插件{ model: { provider: taotoken, baseUrl: https://taotoken.net/api, apiKeyEnv: TAOTOKEN_API_KEY }, agents: { dir: .claude/agents, memoryDir: .claude/agent-memory }, mcpServers: { chrome-devtools: { command: npx, args: [-y, chrome-devtools-mcplatest] } }, permissions: { allow: [Bash(git:*), Bash(go:*), Bash(npm:*)] } }settings.local.json放本地工具权限授权加进.gitignore不入库。3.5 CC Switch 切换配置如果你有多个环境开发/测试/生产用 CC Switch 做配置切换。它本质是管理多份settings.json切换时软链到.claude/settings.json。# 保存当前配置为 dev profile cc-switch save dev # 切换到 test profile cc-switch use test # 列出所有 profile cc-switch list每个 profile 里baseUrl和apiKeyEnv可以不同但都指向 TaoToken 的端点只是 Key 不同。这样切换环境不用改代码只切配置。4. 验证请求Sub-Agent 调用与成功结果配置写完得验证整条链路能跑通。分三步先验证 TaoToken 通道再验证单个 Agent最后验证 Handoff 流转。4.1 验证 TaoToken 通道用 curl 直接打 API确认 Key 和端点没问题curl -s https://taotoken.net/api/v1/messages \ -H x-api-key: $TAOTOKEN_API_KEY \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: claude-sonnet-4-20250514, max_tokens: 64, messages: [{role: user, content: 回复 OK}] }返回里能看到content字段就说明通道通了。如果返回 401检查 Key 是否写对返回 404检查base_url是否多了斜杠。4.2 验证单个 Sub-Agent在 Claude Code 里直接调用requirement-designerAgent启动 requirement-designer为“视频大模型增加评估任务类型”生成 PRD需求 ID 用 REQ-021Agent 跑完后检查docs/requirements/REQ-021/PRD.md是否生成。同时看输出末尾有没有 Handoff 块---AGENT-HANDOFF--- requirement-id: REQ-021 status: awaiting_review output: docs/requirements/REQ-021/PRD.md next-step: wait_for_human_approval after-approval-next-step: launch go-api-implementer after-approval-prompt: 根据需求 REQ-021 的 PRD 实现后端接口。PRD路径: docs/requirements/REQ-021/PRD.md review-message: PRD 已生成请审核 docs/requirements/REQ-021/PRD.md确认无误后回复继续启动后端实现 ---END-HANDOFF---看到这个块说明 Agent 交接协议生效了。4.3 验证 Handoff 流转回复“继续”主会话会解析 Handoff 块自动启动go-api-implementer。后端 Agent 跑完后会输出新的 Handoff 块next-step指向frontend-engineer。前端跑完指向test-case-designer然后并行启动integration-test-runner和e2e-test-executor。整个链路跑通后docs/requirements/REQ-021/下应该有REQ-021/ ├── PRD.md ├── api-summary.md ├── api-test-cases.json ├── e2e-test-cases.json └── summary.mdsummary.md里status: all_passed就说明这个需求从一句话到功能落地全跑完了。5. 本篇常见错排查5.1 Sub-Agent 不启动主会话没反应最常见的原因是 Handoff 块格式不对。检查三点---AGENT-HANDOFF---和---END-HANDOFF---是否成对出现status字段是否是协议里定义的值completed/awaiting_review/has_bugs/all_passednext-step是否指向了已定义的 Agent 名。如果格式没问题但还是不启动检查.claude/agents/下对应的 Agent 文件是否存在文件名是否和next-step里写的一致。5.2 Git Submodule 拉取后子模块目录为空主仓库 clone 后子模块目录是空的需要递归初始化git submodule update --init --recursive如果子模块有更新但主仓库没同步进子模块目录git pull然后回主仓库git add versus-server git commit更新版本索引。5.3 TaoToken 返回 401 或 403先确认环境变量是否生效echo $TAOTOKEN_API_KEY。如果为空说明source没执行或写错了文件。如果 Key 有值但还是 401检查 Key 是否过期或被禁用到控制台重新生成一个。403 通常是权限问题检查 Key 是否绑定了正确的模型权限。5.4 E2E 测试端口冲突E2E 测试用 8901/3001集成测试用 8899/3000。如果端口被占用E2E Agent 启动服务会失败。检查settings.json里的端口配置确保和dev.sh里的端口不冲突。跑 E2E 前先lsof -i:8901确认端口空闲。5.5 Agent 修改了不该改的文件在CLAUDE.md里加硬性约束比如“禁止修改 .claude/ 目录下的任何内容”。如果 Agent 还是改了检查约束是否写在了主仓库的CLAUDE.md里子模块的CLAUDE.md对主仓库操作无效。另外可以在settings.json的permissions.deny里加规则从工具层面禁止。6. 把这条链路跑起来回到最开始的问题一句话交付产品功能难的不是 AI 写代码难的是让多个 Agent 在统一的事实源上安全流转。这篇给的方案是三件事Git Submodule 把前后端整合成单仓让 Agent 看到全貌CLAUDE.md 定义任务边界让 Agent 知道什么能改什么不能改TaoToken 统一 Key 和 API 通道让所有 Agent 共享一条通道额度集中管、切换只改一处。配置骨架可以直接抄但有几个地方要根据你的项目调config.toml里的模型名换成你实际用的settings.json里的 MCP 插件按需增减CLAUDE.md里的端口和目录结构改成你自己的。跑通之后你可以从最简单的需求开始试比如加一个字段、改一个接口。等 Handoff 流转稳定了再上复杂的多 Agent 并行。踩过的坑基本都在第 5 节里遇到问题先查 Handoff 块格式和端口冲突这两个占排查量的大头。如果你还没配 TaoToken 的 Key从控制台创建一个开始https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档在这里里面有各语言 SDK 的调用示例https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite长期跑编码和 Agent 流水线的话Coding Plan 比按量计费更划算https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite先把单 Agent 跑通再串 Handoff最后上并行测试。这条链路一旦跑起来你会发现省下的不是写代码的时间是前后端联调来回扯皮的时间。
返回列表