用 30 行 Python 让 AI 帮你分析 Codex Session 的 TTFT 和 TPS——自己的性能数据自己掌握
用 30 行 Python 让 AI 帮你分析 Codex Session 的 TTFT 和 TPS——自己的性能数据自己掌握
很多人用 Codex 的时候有个困惑:感觉"有时候快,有时候慢",但说不清楚到底慢在哪。
实际上 Codex 客户端会记录完整的 session 日志,里面藏着每次请求的首字延迟(TTFT)和每秒 token 数(TPS)。只是没人帮你把这些数据提出来、喂给 AI 分析。
今天我们就做这件事:用 Python 解析本地 Codex session 日志,然后调用 LLM 接口,让模型帮你总结性能瓶颈、给出优化建议。
先搞清楚两个指标
TTFT(Time To First Token):从发送请求到收到第一个 token 的时间。这个指标主要反映网络延迟 + 模型调度时间。TTFT 高,用户感知上就是"卡了一下才开始输出"。
TPS(Tokens Per Second):模型实际生成 token 的速度。这个主要受模型大小和服务端负载影响。
两者是独立的问题,分开优化。
第一步:提取 Codex session 数据
Codex 的 session 记录通常在本地 ~/.codex/sessions/ 目录下,每个 session 是一个 JSON 文件。结构大致如下:
{
"session_id": "abc123",
"requests": [
{
"timestamp": "2025-07-10T14:23:01Z",
"model": "gpt-4o",
"ttft_ms": 320,
"total_tokens": 850,
"duration_ms": 4200
}
]
}
我们先写一个解析脚本,把所有 session 的性能数据聚合出来:
import json
import os
from pathlib import Path
def load_sessions(session_dir: str = "~/.codex/sessions") -> list[dict]:
"""加载所有 session 日志,提取性能指标"""
base = Path(session_dir).expanduser()
records = []
for f in base.glob("*.json"):
try:
data = json.loads(f.read_text())
for req in data.get("requests", []):
duration_ms = req.get("duration_ms", 0)
total_tokens = req.get("total_tokens", 0)
tps = (total_tokens / duration_ms * 1000) if duration_ms > 0 else 0
records.append({
"session_id": data.get("session_id", f.stem),
"timestamp": req.get("timestamp", ""),
"model": req.get("model", "unknown"),
"ttft_ms": req.get("ttft_ms", 0),
"tps": round(tps, 2),
"total_tokens": total_tokens,
})
except Exception:
continue
return records
第二步:让 AI 帮你分析
数据提出来了,接下来把它喂给模型,让它帮你做统计分析和给建议。
这里用 OpenAI 格式的接口,改一个 base_url 就能切换到国内直连的服务,不需要改其他任何代码:
from openai import OpenAI
import statistics
def analyze_with_ai(records: list[dict]) -> str:
# 只需改这一行,就能用国内直连、价格便宜 60%+ 的 API
client = OpenAI(
api_key="你的 API Key",
base_url="https://api2everything.xyz/v1",
)
# 整理成摘要,避免 token 浪费
ttft_values = [r["ttft_ms"] for r in records if r["ttft_ms"] > 0]
tps_values = [r["tps"] for r in records if r["tps"] > 0]
models_used = list({r["model"] for r in records})
summary = f"""
共分析 {len(records)} 条请求记录。
TTFT 统计(毫秒):
- 平均值:{statistics.mean(ttft_values):.0f}
- 中位数:{statistics.median(ttft_values):.0f}
- 最大值:{max(ttft_values)}
- P90:{sorted(ttft_values)[int(len(ttft_values)*0.9)]:.0f}
TPS 统计(tokens/s):
- 平均值:{statistics.mean(tps_values):.1f}
- 中位数:{statistics.median(tps_values):.1f}
- 最小值:{min(tps_values):.1f}
使用的模型:{', '.join(models_used)}
"""
response = client.chat.completions.create(
model="gpt-4o-mini", # 分析任务用小模型,省钱
messages=[
{
"role": "system",
"content": "你是一位 LLM 性能优化专家,擅长分析 API 调用的延迟数据并给出实用建议。",
},
{
"role": "user",
"content": f"以下是我的 Codex 使用数据,请帮我分析性能状况,识别瓶颈,并给出 3 条具体优化建议:\n{summary}",
},
],
)
return response.choices[0].message.content
if __name__ == "__main__":
records = load_sessions()
if not records:
print("没找到 session 数据,请检查 ~/.codex/sessions/ 目录")
else:
print(f"加载了 {len(records)} 条记录,正在分析...\n")
result = analyze_with_ai(records)
print(result)
实际跑出来的效果
把上面两段代码合并保存为 analyze_codex.py,直接运行:
python analyze_codex.py
模型会输出类似这样的分析:
你的 P90 TTFT 达到 1200ms,明显高于正常水平(通常 < 500ms),建议排查高峰时段的请求集中情况。TPS 均值 42 tokens/s 处于中等水平,gpt-4o 的 TPS 显著低于 gpt-4o-mini,对于不需要强推理的任务可以降级模型以提升响应速度……
这比你自己去看一堆数字有效得多。
几个可以继续扩展的方向
- 按时间段分组,看不同时间段的性能差异(早上 vs 深夜)
- 加上模型对比维度,自动推荐性价比最高的模型选择
- 接入 Webhook,每周自动发一次摘要报告
关于 API 费用
上面代码用了 gpt-4o-mini 做分析,本身就很便宜。如果你还在用官方 API,可以考虑换到 无量 Api——同样的 OpenAI 格式,国内直连无需代理,价格比官方便宜 65% 左右(SVIP 打 7.7 折),支持 GPT-4o、Claude 4、Gemini、DeepSeek 等 300+ 模型。
注册就送 ¥1 余额,余额永久有效,改一行 base_url 就能用,迁移成本几乎为零。
跑完之后你的 TTFT 数据好看吗?或者遇到什么解析问题?评论区聊聊,我尽量回。
觉得有用的话点个赞,这类工具向的内容我会继续写。