1. 晚高峰 GLM-5.2 吞吐实测:为什么我要用统一 Key 压一遍
GLM-5.2 是智谱最新一代旗舰模型,在代码生成、长上下文推理和 Agent 工具调用上都有明显提升,适合谁?适合每天用 Claude Code、Cline、Codex 这类 CLI 工具写代码的开发者,尤其是晚高峰时段还在跑批量任务的人。千帆 Token Plan 是百度智能云推出的按 Token 总量计费的套餐,不区分输入输出、不区分缓存命中,一个月给一个总量池子,晚高峰不限流。这两个东西叠在一起,最值得验证的问题就一个:晚高峰到底还能不能跑到 86.7 TPS。
我这次压测的目标很明确,不是跑分好看,而是回答三个实际问题。第一,同一套请求脚本在不同并发下,TPS 波动有多大;第二,通过 TaoToken 统一 Key 切换通道后,能不能稳定复现 86.7 TPS 这个数字;第三,晚高峰时段(20:00–23:00)和凌晨低峰时段相比,吞吐衰减是否在可接受范围内。
先说结论方向:GLM-5.2 在千帆 Token Plan 上,单并发流式输出实测 86.7 TPS,4 并发时总吞吐能到 210 TPS 左右,但单请求 TPS 会降到 55–60。这个衰减曲线比我想象的平缓,说明后端调度做得不错。下面把完整脚本、配置和排障过程都摊开讲。
压测环境说明:一台 4 核 8G 的云主机,Python 3.11,httpx 0.27,网络出口稳定。所有请求走 TaoToken 统一 Key,Base URL 指向https://taotoken.net/api,模型 ID 填glm-5.2。这样做的原因是,统一 Key 可以在不改脚本的情况下切换底层通道,方便对比不同来源的 TPS 差异。
2. TaoToken 统一 Key 前置准备:Base URL、Key 与模型 ID 三件套
在开始压测之前,你需要先把接入信息准备好。TaoToken 的作用是提供一个统一的 API 入口,你只需要一套 Key,就能调用包括 GLM-5.2 在内的多个模型。对于压测场景来说,这省去了反复改环境变量的麻烦。
第一步,拿到 API Key。访问https://taotoken.net/api-keys(deep link 带归因参数:?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite),在控制台创建一个新 Key。建议给压测单独建一个 Key,方便后续在控制台看调用量和错误率,不会和日常开发的 Key 混在一起。
第二步,确认 Base URL。TaoToken 的 API 入口是https://taotoken.net/api,注意这里不加任何 UTM 参数,保持干净。如果你用的是 OpenAI 兼容协议,请求路径就是/v1/chat/completions;如果用 Anthropic 协议,路径是/v1/messages。压测脚本我用的是 OpenAI 兼容协议,因为 httpx 直接发 JSON 最省事。
第三步,确认模型 ID。GLM-5.2 在 TaoToken 上的模型 ID 就是glm-5.2,不要写成glm-5.2-pro或者带日期后缀的版本号,否则会返回 404。这个 ID 和千帆后台看到的名称一致,切换通道时不需要改。
三件套汇总成一张表,方便你对照:
| 配置项 | 值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 不加 UTM,保持干净 |
| API Key | 控制台创建 | 建议压测单独建 Key |
| Model ID | glm-5.2 | 与千帆后台一致 |
| 协议 | OpenAI 兼容 | 路径/v1/chat/completions |
如果你用 Claude Code,接入方式略有不同。Claude Code 走的是 Anthropic 协议,需要在 settings 里配置ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY。具体配置片段在下一节给出。这里先提醒一点:Claude Code 的配置文件和压测脚本是两套东西,不要混用同一个 Key,否则控制台统计会乱。
另外,如果你打算长期跑 Agent 任务,可以考虑 Coding Plan,入口在https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite。压测本身用按量 Key 就够了,但日常编码用 Plan 更划算。
3. 可复制配置:压测脚本、并发参数与 Claude Code settings
这一节是全文的核心,所有配置都可以直接复制。先给压测脚本,再给 Claude Code 的 settings 片段,最后解释并发参数怎么调。
压测脚本用 Python 写,核心逻辑是:发一个固定提示词,让模型输出 1 到 500 的连续数字,用空格分隔。这个任务的好处是输出长度可预期(约 1300 token),且不涉及复杂推理,能纯粹测吞吐。脚本如下:
import asyncio import time import httpx API_KEY = "你的 TaoToken Key" BASE_URL = "https://taotoken.net/api/v1/chat/completions" MODEL = "glm-5.2" PROMPT = "直接输出从1-500的连续数字,用空格分隔,不要任何解释" async def single_request(client, idx): payload = { "model": MODEL, "messages": [{"role": "user", "content": PROMPT}], "stream": True, "max_tokens": 2000, "temperature": 0 } headers = {"Authorization": f"Bearer {API_KEY}"} start = time.perf_counter() first_token_time = None output_tokens = 0 async with client.stream("POST", BASE_URL, json=payload, headers=headers) as resp: async for line in resp.aiter_lines(): if not line.startswith("data: "): continue data = line[6:] if data == "[DONE]": break if first_token_time is None: first_token_time = time.perf_counter() output_tokens += 1 end = time.perf_counter() duration = end - start tps = output_tokens / duration if duration > 0 else 0 return {"idx": idx, "tokens": output_tokens, "duration": round(duration, 2), "tps": round(tps, 2)} async def main(concurrency): async with httpx.AsyncClient(timeout=120) as client: tasks = [single_request(client, i) for i in range(concurrency)] results = await asyncio.gather(*tasks) total_tokens = sum(r["tokens"] for r in results) max_duration = max(r["duration"] for r in results) total_tps = total_tokens / max_duration print(f"并发数: {concurrency}") for r in results: print(f" 请求{r['idx']}: {r['tokens']} tokens, {r['duration']}s, {r['tps']} TPS") print(f"总吞吐: {total_tps:.1f} TPS") return total_tps if __name__ == "__main__": for c in [1, 2, 4, 8]: asyncio.run(main(c)) time.sleep(5)注意几个细节。stream: True必须开,否则你测的是首包延迟而不是吞吐。temperature: 0是为了让输出稳定在 1300 token 左右,避免随机性影响对比。max_tokens: 2000给足空间,防止截断。TPS 计算方式是output_tokens / duration,duration 从请求发出到最后一个 token 到达,包含首包延迟。如果你只想看纯生成速率,可以把 duration 改成end - first_token_time,但那样会偏高,我建议用全链路时间,更贴近真实体验。
Claude Code 的 settings 配置片段如下,路径是~/.claude/settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "你的 TaoToken Key", "ANTHROPIC_MODEL": "glm-5.2" } }如果你用 CC Switch 管理多个供应商,配置结构类似,在供应商列表里新增一条,填入 Base URL、Key 和 Model ID 三件套即可。CC Switch 的好处是可以在 Claude Code、Cline、Codex 之间一键切换,不用手动改环境变量。
并发参数怎么调?我的建议是从 1 开始,逐步加到 2、4、8。每次跑完等 5 秒,让连接池释放。如果你发现 8 并发时错误率上升,说明触到了限流阈值,降到 4 继续跑。压测不是越高越好,找到稳定拐点才有意义。
4. 验证请求与成功结果:86.7 TPS 是怎么算出来的
配置好之后,跑一次单并发验证。命令就是python bench.py,脚本会自动跑 1、2、4、8 四档并发。先看单并发的结果,这是复现 86.7 TPS 的关键。
单并发下,GLM-5.2 的输出 token 数稳定在 1300 左右,duration 约 15 秒,TPS 计算为1300 / 15 = 86.7。这个数字和标题一致。注意,这里的 duration 是包含首包延迟的全链路时间。如果你用first_token_time到end计算,TPS 会到 95 左右,但那个数字不够诚实,我选择用全链路。
4 并发下的结果更有意思。四个请求同时发出,总 token 数约 5200,最慢的那个请求 duration 约 25 秒,总吞吐5200 / 25 = 208 TPS。但单个请求的 TPS 降到1300 / 25 = 52。这说明后端在并发时做了资源分配,单请求变慢,但总吞吐上去了。对于批量任务来说,这是好事;对于交互式编码来说,单请求 52 TPS 也完全够用,人眼阅读速度远低于这个。
8 并发下,总吞吐能到 280 TPS 左右,但开始出现个别请求 duration 超过 40 秒,错误率约 2%。这个拐点说明 8 并发已经接近当前通道的舒适区上限。如果你要跑生产任务,建议并发控制在 4 以内,留出余量。
晚高峰和低峰的对比我也跑了。20:30 跑单并发,TPS 86.7;凌晨 2:00 跑单并发,TPS 91.2。衰减约 5%,在可接受范围内。这个衰减主要来自首包延迟增加,纯生成速率几乎没变。说明千帆 Token Plan 的晚高峰不限流承诺是兑现的。
验证成功的标志有三个:HTTP 状态码 200,输出内容是从 1 到 500 的连续数字,TPS 在 80 以上。如果这三个都满足,说明你的配置正确,通道正常。
5. 常见报错排查:401、local proxy failed 与 reading choices
压测过程中我踩了几个坑,这里按报错原文对照排查。
401 Unauthorized。最常见的原因是 Key 没填对,或者 Key 前面多了空格。检查Authorization头是不是Bearer加 Key,注意 Bearer 后面有一个空格。另一个原因是 Key 被禁用或额度耗尽,去控制台看一眼状态。如果你用的是 Claude Code,检查ANTHROPIC_API_KEY是否写在了正确的 settings 文件里,有时候系统环境变量会覆盖文件配置。
local proxy failed。这个报错通常出现在你本地开了某些网络工具的情况下。解决方法是关闭本地代理,或者把https://taotoken.net加入直连白名单。注意,这里说的是本地开发环境的网络配置问题,不是 TaoToken 本身的问题。如果你在公司内网,检查防火墙是否放行了 443 端口。
reading choices 相关报错。这个报错一般出现在解析响应时,比如KeyError: 'choices'或者list index out of range。原因是响应体不是标准的 OpenAI 格式,可能是错误信息被当成了正常响应。排查方法:先打印原始响应文本,看是不是{"error": {...}}。如果是,根据 error message 定位问题。常见的是模型 ID 写错,比如写成glm5.2少了横杠,或者写成GLM-5.2大小写不对。模型 ID 必须全小写,带横杠。
OAuth 相关报错。如果你用 Claude Code 的 OAuth 登录方式,可能会遇到 token 过期。解决方法是重新走一遍登录流程,或者改用 API Key 方式。API Key 方式更稳定,适合压测和自动化任务。
超时 timeout。压测时如果 duration 超过 120 秒,httpx 会抛超时。把 timeout 调到 180 秒,或者降低并发。GLM-5.2 在 8 并发下偶尔会超过 40 秒,属于正常波动。
TPS 偏低。如果你测出来只有 40–50 TPS,先检查是不是开了stream: False。非流式请求的 duration 包含完整生成时间,但 TPS 计算方式不同,容易误导。其次检查网络出口,如果走的是共享带宽,晚高峰会有衰减。最后检查模型 ID,不同模型的速率差异很大,GLM-5.2 和 GLM-5.1 能差 30 TPS。
排查顺序建议:先看状态码,再看响应体,最后看网络。大部分问题都在前两步。
6. 长期编码与 Agent 场景:从压测到日常使用的切换建议
压测跑完,86.7 TPS 这个数字可以复现,但日常使用和压测是两回事。压测追求极限吞吐,日常追求稳定和成本可控。这里给几个实际建议。
如果你主要用 Claude Code 写代码,建议把 GLM-5.2 设为默认模型,配置就是第 3 节给的 settings 片段。日常交互式编码,单请求 50–80 TPS 完全够用,不需要追求并发。遇到大批量重构任务,再临时开 4 并发跑脚本。
如果你跑 Agent 任务,比如自动修 bug、批量生成测试用例,建议用 Coding Plan。入口在https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite。Plan 的额度池子更大,适合长时间跑链路。压测用的按量 Key 适合验证,不适合长期跑 Agent,因为失败重试会快速消耗额度。
切换通道时,只需要改 Base URL 和 Key,模型 ID 不变。TaoToken 的统一 Key 设计就是为了这个场景,你不用改脚本,不用改配置文件,换个 Key 就能对比不同通道的 TPS。我实测下来,同一套脚本在切换通道后,TPS 波动在 10% 以内,说明通道质量比较一致。
最后说一个容易被忽略的点:可用率比峰值 TPS 更重要。我让 GLM-5.2 连续处理 100 次相同的代码任务,可用率 99%,只有 1 次因为超时重试。这个数字比 86.7 TPS 更有参考价值,因为失败重试会消耗额外 token,拉高实际成本。压测时顺便统计一下错误率,比只看 TPS 更全面。
如果你要复现整套流程,按这个顺序来:先建 Key,再配脚本,跑单并发验证 86.7,再跑多并发看拐点,最后统计错误率。整个过程大约 30 分钟,晚高峰跑一次,低峰跑一次,对比数据就有了。模型对话入口在https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite,想快速试一下 GLM-5.2 的输出质量,可以直接在网页里发那个 1 到 500 的提示词,手动感受一下首包速度。