1. 从 Grosser 的 inbound 指标,反推 Agent Token 接入清单
在复现 Jeanne DeWitt Grosser 谈到的 inbound 销售开发高自动化之前,建议先到 TaoToken 官网 取一个可用的 Key,并把所有 AI 工具的 Base URL 统一设为https://taotoken.net/api。原因很现实:很多团队把注意力放在“自动化率看板”上,却在 Claude Code 的settings.json、Codex 的config.toml、CC Switch 的 provider 配置里各写一套 endpoint,最后采样脚本读到的model_request_id对不上,出现 401 或 404 时只能凭感觉排查。公开访谈里,Vercel COO Grosser 描述 inbound 销售开发已经高度自动化,团队编制明显收缩,智能体年度开销落在数千美元量级。这个结论对工程团队真正的启发不是“再买一个 AI 工具”,而是把 inbound Agent 的 Token、模型调用、阶段日志、人工接管点做成可复现的指标链路。本文不去评论访谈本身,而是给出一套可跟做的落地路径:先拿 Key,再配 Claude Code / Codex / CC Switch,最后用指标映射表和本地采样脚本验证你的 inbound Agent 是否真的接近 90% 自动化口径。文中的命令和脚本都由你在本地执行,不连接生产库,也不要把 Key 写进仓库。
2. 指标映射表:把“90% 自动化”拆成可采样字段
访谈里的 90% 自动化,落到工程上不能只用一个总数字概括。更合理的做法是把 inbound 销售开发拆成阶段,每个阶段都记录“谁完成、耗时多少、是否人工接管、模型调用 ID 是什么”。否则你只能看到“自动化率下降”,却不知道是线索丰富失败、资格判断频繁转人工,还是预约会议环节 prompt 轮次爆炸导致超时。
可以先建一张指标映射表,字段按你的 CRM 和 Agent 日志实际情况增删,但结构建议如下:
| 漏斗阶段 | 人工动作 | Agent 动作 | 采样字段 | 指标口径 |
|---|---|---|---|---|
| 入站捕获 | 检查来源、去重 | 归一化渠道、识别表单意图 | lead_id、source、captured_at | 入站总量、重复率 |
| 线索丰富 | 查公司信息、补联系人 | 总结描述、打行业标签 | enrich_started_at、enrich_done_at、model_request_id | 自动丰富率、平均耗时 |
| 初步资格 | 判断预算、场景、优先级 | 评分、生成追问、标记风险 | qualify_score、qualify_done_at、need_human | 自动资格率、人工介入率 |
| 路由分配 | 手动分派销售 | 按规则和模型路由 | owner_assign_mode、owner_id、routed_at | 自动路由率、错分率 |
| 预约会议 | 邮件往返确认时间 | 生成回复、发送预约链接 | meeting_booked_at、reply_count、agent_turns | 预约率、平均轮次 |
| CRM 同步 | 手工复制摘要 | 写入字段和摘要 | crm_sync_status、error_code | 同步成功率、失败原因 |
| 人工接管 | 销售接手 | 触发升级 | handoff_at、handoff_reason | 人工介入率、接管原因分布 |
这张表的关键在于“阶段权重”。如果你的 inbound Agent 只在线索丰富和初步资格上自动化,但路由和预约仍靠人工,那么整体自动化率不可能接近 90%。你可以先定义:
阶段自动化率 = 该阶段无 handoff 且 status=completed 的 lead 数 / 进入该阶段的 lead 数 整体自动化率 = Σ(阶段自动化率 × 阶段权重) 人工介入率 = 发生 handoff 的 lead 数 / 总 lead 数阶段权重建议按销售团队实际耗时分配,而不是按阶段数量平均分。比如预约会议和资格判断通常比单纯丰富信息更消耗人力,就应该给更高权重。这样你才能解释“为什么模型调用次数增加了,但整体自动化率没有上升”。
可复现产出第一件是“指标映射表”,第二件是“采样脚本”。映射表可以用 Markdown 或 CSV 维护,采样脚本从本地导出的 CSV 读取事件,不直接连接 CRM 生产库,避免误操作。导出的字段至少包含:
lead_id,source,captured_at,enrich_done_at,qualify_done_at,meeting_booked_at,handoff_at,status,model_request_id,input_tokens,output_tokens,error_code L001,form,2025-01-01T09:00:00+0800,2025-01-01T09:00:07+0800,2025-01-01T09:00:12+0800,,,completed,req_1,1200,180, L002,chat,2025-01-01T09:05:00+0800,2025-01-01T09:05:10+0800,2025-01-01T09:05:19+0800,2025-01-01T09:12:00+0800,,completed,req_2,2100,320, L003,event,2025-01-01T09:10:00+0800,2025-01-01T09:10:08+0800,,,2025-01-01T09:11:00+0800,handoff,req_3,900,150,need_enterprise_quote有了这些字段,才谈得上复现 Grosser 提到的自动化口径。下一步是让 Agent 能稳定调到模型,而不是在 Key 和 Base URL 上反复踩坑。
3. 接入前准备:在 TaoToken 创建 Key,确认 Base URL
无论你用 Claude Code、Codex,还是用 CC Switch 管理多套配置,第一步都是准备凭据。打开 TaoToken 官网,登录后进入控制台。如果你还没有 Key,可以直接到 API Keys 页面 创建。创建后你会拿到一串 Key,本文统一用YOUR_API_KEY占位,不要把它提交到 Git,也不要写进前端代码。
配置时只认两个核心值:
Base URL: https://taotoken.net/api API Key: YOUR_API_KEY注意 Base URL 后面不要自行拼乱七八糟的路径。不同工具对 Base URL 的处理方式不同:有的会在后面自动补/v1/messages,有的会补/v1/chat/completions。你先按https://taotoken.net/api配置,如果出现 404,再检查是不是在工具里又多写了/v1或/api。把 Base URL 和 Key 放在环境变量里,是后续采样和排障最省事的方式。
本地可以先这样验证环境变量:
export TAOTOKEN_BASE_URL="https://taotoken.net/api" export TAOTOKEN_API_KEY="YOUR_API_KEY" env | grep -E 'TAOTOKEN|ANTHROPIC|OPENAI'如果你用 Claude Code,环境变量可能以ANTHROPIC_*为主;如果你用 Codex,则重点是config.toml里的 provider 条目和对应 Key 引用。不要把 Claude Code 的ANTHROPIC_AUTH_TOKEN直接塞到 Codex 的配置里,也不要把 Codex 的config.toml格式套到 Claude Code 的settings.json。两者分开维护,排障时才能快速定位。
如果你还没决定用哪种模型或套餐,可以先通过 模型对话 做一次小流量验证,确认 Key 可用。需要长期跑 coding 或 Agent 工作流,再看 Coding Plan。但无论走哪条路径,Base URL 都先固定为https://taotoken.net/api。
4. Claude Code 配置:settings.json 与 ANTHROPIC_* 的边界
Claude Code 的配置入口通常是~/.claude/settings.json,同时也会读取 shell 环境变量。实际排障时最常见的问题是:终端里已经export ANTHROPIC_BASE_URL,但 Claude Code 读的是settings.json里的旧值,或者反过来。建议以settings.json为主,shell 环境变量作为临时覆盖,并在修改后重启终端。
一个可复制的settings.json示例:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "YOUR_CLAUDE_MODEL_ID" } }如果你希望临时切换,也可以用 shell 覆盖:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY" export ANTHROPIC_MODEL="YOUR_CLAUDE_MODEL_ID"这里要注意几个细节。第一,ANTHROPIC_AUTH_TOKEN和ANTHROPIC_API_KEY在不同版本或不同封装里可能读取方式不同,如果一种不生效,检查工具文档或控制台给出的示例,不要同时写多个来源导致覆盖顺序混乱。第二,ANTHROPIC_MODEL请填你实际可用的模型 ID,不要照抄网上随便看到的名称。第三,修改settings.json后,最好新开一个终端窗口再运行 Claude Code,避免旧环境变量残留。
验证 Claude Code 是否真的走到了 TaoToken,可以观察请求日志、模型返回或工具启动时的 endpoint 信息。如果仍然报 401,先执行:
env | grep ANTHROPIC确认当前 shell 里的ANTHROPIC_BASE_URL是不是https://taotoken.net/api,以及 Key 是否有多余空格。如果报 404,检查是不是在ANTHROPIC_BASE_URL后面多加了/v1。Claude Code 的配置搞定后,再进入 Codex,不要把两套环境变量混在一起。
5. Codex 配置:config.toml 不要混用 ANTHROPIC_*
Codex 的配置通常放在~/.codex/config.toml,它和 Claude Code 的settings.json不是同一套东西。这里最忌讳的是把ANTHROPIC_*环境变量写到 Codex 的 provider 配置里,结果 Claude Code 能用,Codex 一直 401。正确做法是在config.toml中声明一个 TaoToken provider,然后把 Key 通过独立环境变量传入。
一个可参考的config.toml示例:
model = "YOUR_CODEX_MODEL_ID" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY"然后在 shell 中设置:
export TAOTOKEN_API_KEY="YOUR_API_KEY"如果你的 Codex 版本要求使用 OpenAI 兼容环境变量,那么可以让env_key指向对应的变量名,但核心原则不变:Codex 走 Codex 的配置,Claude Code 走 Claude Code 的配置。不要把ANTHROPIC_AUTH_TOKEN写进config.toml,也不要指望 Codex 自动读取 Claude Code 的settings.json。
配置完成后,可以先用一个最短任务验证。比如让 Codex 只生成一个简单文件,观察是否报错。如果出现 404,优先检查base_url是否被写成了https://taotoken.net/api/v1或https://taotoken.net/api/。如果出现 401,检查TAOTOKEN_API_KEY是否在当前终端可见:
printenv TAOTOKEN_API_KEY如果输出为空,说明环境变量没有加载;如果输出有值但依然 401,检查 Key 是否被复制完整、是否被引号包裹、是否包含换行。Codex 一旦通了,就可以把 inbound Agent 的任务跑起来,但指标采样仍建议从本地 CSV 开始,不要一上来就直连生产数据库。
6. CC Switch 三件套:provider、Key 引用、回滚开关
如果你同时维护 Claude Code、Codex 和多套模型配置,CC Switch 这类切换工具会很有用。它的核心不是“多装一个软件”,而是把配置拆成可回滚的三件套。为了避免把环境搞乱,建议统一成以下三件套:
- provider 定义:名称、Base URL、默认模型或模型别名。
- Key 引用:只写环境变量名,不写明文 Key。
- 回滚开关:默认 provider、备用 provider、出错时切回哪个配置。
可以用一份本地 YAML 作为配置清单,便于自己审计:
providers: taotoken: base_url: https://taotoken.net/api key_env: TAOTOKEN_API_KEY default_model: YOUR_MODEL_ID fallback: base_url: YOUR_BACKUP_BASE_URL key_env: BACKUP_API_KEY default_model: YOUR_BACKUP_MODEL_ID active: taotoken rollback: fallback这份清单不要求某个工具直接识别,它的价值是让你在 CC Switch 或手工切换时有一张明确的对照表。你在 TaoToken 官网 创建 Key 后,只需把TAOTOKEN_API_KEY注入当前环境,再把 provider 的base_url指向https://taotoken.net/api。如果切换后 Claude Code 正常而 Codex 失败,就看三件套里的 Key 引用是不是写错了:Claude Code 可能用ANTHROPIC_AUTH_TOKEN,Codex 可能读TAOTOKEN_API_KEY。
回滚开关同样重要。inbound Agent 跑批时如果某次模型供应商限流或超时,不要临场改代码,而是通过 CC Switch 切到备用 provider,同时保留model_request_id和provider字段,方便后续对比自动化率。这样你才能把“工具切换”变成可观测事件,而不是一次没有记录的救火。
7. 采样脚本:本地生成 inbound Agent 指标
当 Claude Code、Codex 和 CC Switch 都能稳定调用https://taotoken.net/api后,就可以跑采样脚本。脚本只读本地导出的 CSV,不连接 CRM 生产库,也不执行任何线上写操作。你可以把第 2 节的 CSV 字段先导出到inbound_agent_events.csv,然后运行下面的 Python 脚本:
#!/usr/bin/env python3 import csv import json from datetime import datetime from statistics import median FMT = "%Y-%m-%dT%H:%M:%S%z" def parse_ts(value: str): if not value: return None return datetime.strptime(value, FMT) def diff_seconds(start, end): if not start or not end: return None return (end - start).total_seconds() rows = [] with open("inbound_agent_events.csv", newline="", encoding="utf-8") as f: for item in csv.DictReader(f): captured = parse_ts(item.get("captured_at", "")) enrich_done = parse_ts(item.get("enrich_done_at", "")) qualify_done = parse_ts(item.get("qualify_done_at", "")) booked = parse_ts(item.get("meeting_booked_at", "")) rows.append({ **item, "enrich_s": diff_seconds(captured, enrich_done), "qualify_s": diff_seconds(enrich_done, qualify_done), "book_s": diff_seconds(qualify_done, booked), "handoff": bool(item.get("handoff_at", "")), }) total = len(rows) auto_completed = sum( 1 for r in rows if not r["handoff"] and r.get("status") == "completed" ) handoff_count = sum(1 for r in rows if r["handoff"]) booked_count = sum(1 for r in rows if r.get("meeting_booked_at")) qualify_latency = [r["qualify_s"] for r in rows if r["qualify_s"] is not None] report = { "total_leads": total, "auto_completed_rate": round(auto_completed / total, 4) if total else 0, "handoff_rate": round(handoff_count / total, 4) if total else 0, "meeting_booked_rate": round(booked_count / total, 4) if total else 0, "qualify_p50_seconds": median(qualify_latency) if qualify_latency else None, } print(json.dumps(report, ensure_ascii=False, indent=2))运行后你会得到一份本地 JSON 报告:
python3 inbound_metrics.py这个脚本能回答几个关键问题:有多少线索在没有人工接管的情况下走完了流程、人工接管比例是多少、预约会议比例是多少、资格判断的中位耗时是多少。如果你要把结果映射到 Grosser 提到的自动化口径,可以继续按阶段加权计算整体自动化率。注意,脚本中的status、handoff_at、meeting_booked_at需要与你的 Agent 日志字段保持一致,否则会出现“看板好看、实际失真”的问题。
8. 排障:401、404、429、超时与 provider 混用
接入阶段最常见的错误不是模型不会回答,而是配置层出错。下面这张表可以作为本地排障清单:
| 现象 | 常见原因 | 检查动作 |
|---|---|---|
| 401 Unauthorized | Key 未加载、Key 错误、环境变量被旧值覆盖 | 执行env | grep -E 'ANTHROPIC|TAOTOKEN',确认 Key 无空格和换行 |
| 404 Not Found | Base URL 多写/v1、少写路径、工具版本不匹配 | 确认 Base URL 为https://taotoken.net/api,再检查工具是否自动补路径 |
| 429 Too Many Requests | 并发过高、短时间批量采样、重试策略过激 | 降低并发,加入退避,记录retry_after和model_request_id |
| 请求超时 | 长 prompt、网络抖动、批量任务未拆分 | 拆分任务,设置合理超时,记录 p95 耗时 |
| Claude Code 正常,Codex 失败 | 把ANTHROPIC_*误配到 Codex | 检查config.toml的env_key和TAOTOKEN_API_KEY |
| CC Switch 切换后全部失败 | provider 名称、Key 引用、模型别名不一致 | 对照三件套清单,确认base_url未被写错 |
排障时一定要记录model_request_id。它能帮你把一次失败请求和某次 Agent 运行关联起来。如果只有一条“失败了”的日志,没有 request ID,你很难区分是 Key 问题、模型问题,还是本地网络抖动。对于 inbound Agent 这种多阶段任务,建议每个阶段都记录stage_name、provider、model、started_at、finished_at、error_code。这样即使某天自动化率下降,你也能快速定位到具体阶段。
另外,不要把 Claude Code 的ANTHROPIC_BASE_URL和 Codex 的base_url写成同一个变量名后到处 export。它们可以共享同一个 TaoToken Base URL,但配置入口要分开:Claude Code 改settings.json或ANTHROPIC_*,Codex 改config.toml和独立 Key 环境变量。分开之后,CC Switch 的三件套才有意义。
9. 成本映射:把“年成本数千美元”拆成每千次 inbound 动作
访谈里提到智能体年度开销在数千美元量级,这个数字放到工程团队内部,必须拆成可核算的指标才有用。你可以用控制台账单或请求日志中的input_tokens、output_tokens回填,然后计算每千次 inbound 动作的成本。公式如下:
单次请求成本 = input_tokens / 1_000_000 * input单价 + output_tokens / 1_000_000 * output单价 每千次动作成本 = 总请求成本 / 动作数 * 1000用 Python 可以快速算:
def cost_per_1k(rows, input_price, output_price): total_cost = 0.0 for r in rows: total_cost += int(r.get("input_tokens") or 0) / 1_000_000 * input_price total_cost += int(r.get("output_tokens") or 0) / 1_000_000 * output_price return total_cost / len(rows) * 1000 if rows else 0这里的input_price和output_price不要写死在代码里,从 TaoToken 控制台或你实际使用的模型价格读取。然后按阶段汇总:线索丰富、资格判断、路由、预约会议分别花了多少 Token,每千次动作成本是多少,人工接管一次少花了多少。这样你才能判断“自动化率提升”是否真的带来成本收益,而不是只看到模型调用量上涨。
如果你发现预约会议阶段消耗最多,可以考虑减少无意义往返轮次,或者把长上下文总结提前缓存。如果你发现资格判断阶段人工接管率最高,先检查 prompt 是否缺少企业规模、使用场景、预算窗口等字段,而不是直接换模型。成本映射表和指标映射表要一起看,才能解释 Grosser 所描述的那种“人员减少、成本可控、流程自动化”的组合结果。
10. 文末 CTA:从模型对话到 Coding Plan,再到创建 Key 和 Claude Code 文档
如果你准备复现 inbound Agent 指标,建议按下面顺序走,不要一上来就把所有配置写死到项目里:
- 先用 模型对话 验证 Key 和 Base URL 是否可用。
- 如果要把 Agent 工作流长期用于 coding 或批量任务,再看 Coding Plan。
- 到 API Keys 创建或轮换你的
YOUR_API_KEY。 - 最后按 Claude Code 文档 配置
settings.json和ANTHROPIC_*,Codex 则单独维护config.toml,不要混用。
整个流程的核心只有一句话:先把 Token 和 Base URL 管稳,再谈 inbound Agent 的自动化率。你可以从 TaoToken 官网 开始,拿到 Key 后把 Base URL 设为https://taotoken.net/api,然后用本文的指标映射表和采样脚本跑一轮本地数据。等 Claude Code、Codex、CC Switch 三件套都验证通过,你得到的就不只是一个访谈里的 90% 数字,而是一条可观测、可回滚、可成本核算的 inbound Agent 工程链路。