一个面向 OpenAI 兼容接口的本地测试工具,提供以下能力:
- 通用 HTTP 文本模型测试
- 通用 HTTP 图像接口调试
- 通用 HTTP 视频任务创建/查询与结果回查
- 结果聚合、图表分析、ZIP 报告导出
- CSV / JSONL / JSON 测试集批量执行与功能点校验
- 独立测试集管理页,可前端编辑、上传并保存到
datasets/
项目基于 Streamlit 构建 UI,使用 asyncio + aiohttp 执行异步请求,适合快速验证模型网关、供应商 API 或代理服务的稳定性和性能表现。
- 拉取模型:
GET /v1/models - 通用 HTTP 文本请求:默认按 OpenAI
POST /v1/chat/completions填充,也可手动输入请求 Method、URL、Headers、Body - JSON 输入支持注释,输入框会根据当前内容动态调整高度
- 支持上传测试集并用
{prompt}、{model}等变量渲染请求 Body - 支持多轮次、并发请求,结果写入
perf_test_results.csv - 指标统计:Total Time、token/s、Success Rate(Avg/P50/P99;TTFT/TPOT 仅历史流式数据可用)
- 通用 HTTP 图像请求:默认按 OpenAI
POST /v1/images/generations填充,也可手动输入请求 Method、URL、Headers、Body - JSON 输入支持注释,输入框会根据当前内容动态调整高度
- 支持测试集、并发数、轮次、成功率和延迟统计
- 自动解析 URL / base64 图片并落盘到
artifacts/image/... - 图像任务状态历史列表和图像产物文件浏览器已合并在通用 HTTP 图像任务测试内
- 通用 HTTP 创建任务:默认按 TokenRouter
POST https://api.tokenrouter.com/v1/video/generations填充,也可手动输入请求 Method、URL、Headers、Body - 通用 HTTP 查询/轮询:默认按 TokenRouter
GET https://api.tokenrouter.com/v1/video/generations/{task_id}填充,也可手动输入轮询 Method、URL 模板、Headers、Body 模板 - JSON 输入支持注释,输入框会根据当前内容动态调整高度
- 支持用字段路径解析
task_id、status、progress、result_url - 支持创建后自动轮询、并发创建、并发轮询与实时状态表
- 所有视频创建/轮询请求的参数、响应、耗时和错误会追加写入
video_request_logs.jsonl - 视频创建/轮询关键结果会写入
perf_test_results.csv,用于统一报告 - 视频任务状态历史列表和视频产物文件浏览器已合并在通用 HTTP 视频任务测试内
- 支持创建后自动轮询、状态追踪、结果 URL 落盘
- 单 Base URL 报告导出(ZIP)
- 多 Base URL 对比报告导出(ZIP)
- 支持按 text/image/video 模态筛选
- 导出内容包含明细、模型汇总与失败样本 CSV
支持 CSV、JSONL 和 JSON 数组。推荐字段:
type:text/image/videocase_id、case_name、tagspromptmessages:JSON,用于文本多轮消息model_params:JSON,会合并进请求 Bodyexpected_checks:JSON,支持contains、not_contains、min_length、min_outputs、required_paths
也支持全动态 Payload 参数法:测试集可携带任意列名,Body 模版中用 {{列名}} 占位。
测试集 CSV 示例:
case_id,MODEL_NAME,PROMPT_TEXT,DURATION_VAL
case_001,dreamina-seedance-2-0-260128,一大片白色的雏菊花田,5
case_002,other-model-v1,赛博朋克风格城市,10Body 模版示例:
{
"model": "{{MODEL_NAME}}",
"prompt": "{{PROMPT_TEXT}}",
"metadata": {
"duration": {{DURATION_VAL}}
}
}测试集可在“测试集管理”页上传或直接编辑保存,文本/图像/视频测试页可从已保存测试集中导入执行。
- Python 3.10+
- Streamlit
- FastAPI
- aiohttp
- pandas
- tiktoken
- uv / uvicorn
- app.py:Streamlit 启动入口
- api_server.py:FastAPI 代理与调试页
- start_all.sh:一键启动 Streamlit + FastAPI
- perf_tester/ui.py:UI 总入口(四个 Tab)
- perf_tester/ui_text.py:文本压测、对话、图表与历史
- perf_tester/ui_image.py:图像测试与结果展示
- perf_tester/ui_video.py:视频任务创建/查询与自动轮询
- perf_tester/ui_export.py:报告导出
- perf_tester/storage.py:CSV 读写与 schema 兼容
- perf_tester/benchmark.py:模型拉取与流式请求执行
- Python >= 3.10
- 已安装 uv
uv syncuv run streamlit run app.py默认访问地址通常为 http://localhost:8501。
uv run uvicorn api_server:app --host 0.0.0.0 --port 8002 --reload可用接口:
GET /healthGET /playgroundPOST /proxy/chat/stream
./start_all.sh可选环境变量:
STREAMLIT_HOST=0.0.0.0 STREAMLIT_PORT=8501 API_HOST=0.0.0.0 API_PORT=8002 ./start_all.sh按 Ctrl+C 可同时停止两个进程。
- 在“文本模型测试”填写 Base URL 与 API Key。
- 点击“拉取模型”。
- 按需修改通用 HTTP 文本请求的 URL、Headers、Body,并设置并发与轮数。
- 点击“发送通用文本请求”,查看汇总指标、图表和明细。
分别在“文本模型测试”“图像模型测试”“视频模型测试”页操作,支持:
- 文本/图像 OpenAI 默认参数、视频 TokenRouter 默认参数一键填充
- 原始 JSON 响应查看
- 任务历史回查
- 本地产物浏览(图片/视频)
在“报告导出”页可导出:
- 单个 Base URL 报告
- 多个 Base URL 横向对比报告
程序在项目根目录维护以下 CSV 文件(不存在时自动创建):
history_config.csv:连接配置与模型缓存perf_test_results.csv:文本压测/对话结果明细task_status_history.csv:图像/视频任务状态历史datasets/*.csv:前端编辑或上传保存的测试集
图像和视频下载产物默认保存在:
artifacts/image/<provider>/<model>/...artifacts/video/<provider>/<model>/...
TTFT:首个有效 token 延迟TPOT:首 token 后平均每 token 耗时Total Time:请求总耗时token/s:total_tokens / total_timeSuccess Rate:成功请求占比
POST /proxy/chat/stream 请求体示例:
{
"base_url": "https://your-api-host",
"api_key": "sk-xxx",
"model": "your-model",
"prompt": "你好,请用三句话介绍你自己"
}返回格式为 text/event-stream,可在浏览器 Network 面板观察 data: 分块。
history_config.csv会保存 API Key 明文,仅建议在受控本地环境使用。- Base URL 建议填写到服务根路径(无需手动加
/v1)。 - 如果网关不支持特定推理控制字段,工具会自动降级重试,尽量兼容更多模型实现。
- 检查 Base URL 与 API Key 是否正确。
- 确认目标服务支持
GET /v1/models。
- 检查服务端是否按 SSE 标准返回
data:行与[DONE]。 - 检查上游限流、超时与模型可用状态。
- 确认响应中是否包含可下载 URL 或有效 base64 数据。
- 检查目标 URL 是否可被当前机器访问。