别再写 Python 脚本了:用一个 Bash 脚本搞定 LLM API 快速测试
做 LLM 开发最烦人的事之一,就是每次面对一个新的 API 接口时,都要花时间去验证它能不能用。不管是 vLLM 部署的私有模型,还是各种第三方转发 API,最基本的需求其实很简单:能不能通?有哪些模型?响应快不快?
很多人的习惯是写个简单的 Python 脚本,安装 openai 库,然后跑一遍。但说实话,为了测个接口而配置虚拟环境、处理依赖冲突,简直是浪费生命。尤其是当你只需要快速确认一下 Base URL 对不对的时候,这种方案太重了。
于是我写了个小工具:apitest.sh。没用 Python,没用任何第三方库,纯 Bash + curl + jq。只要你的电脑能开终端,几秒钟就能把测试跑完。
为什么我坚持用 Bash?
在这个 Python 统治 AI 的时代,用 Bash 写工具看起来像是在开倒车,但实际操作起来,Bash 在这种“一次性探测”任务中简直是神器:
- 真正意义上的零依赖:
curl 是类 Unix 系统的标配。你不需要 pip install,不需要担心 requirements.txt 版本不对。 - 启动零延迟:Bash 脚本是瞬时启动的。对比 Python 启动解释器、加载库的时间,这种体感差异在频繁测试时非常明显。
- 系统级便捷:把它丢进
/usr/local/bin,它就变成了一个原生的系统命令。在任何目录下输入 apitest 就能开始工作,不需要在文件夹之间跳来跳去。
这个脚本是怎么工作的?
apitest.sh 没搞那些复杂的架构,它只盯着 API 测试最核心的三个环节:
1. 实时模型发现
API 供应商的模型列表变动极其频繁。如果你在脚本里硬编码 gpt-4o,结果对方升级到了 gpt-4o-latest,你就会收到一个莫名其妙的 404 错误。
apitest.sh 直接调用 /models 接口,动态抓取所有可用模型。我把抓到的 ID 和 Name 转换成了一个带编号的列表。你不需要记住那些长得离谱的模型 ID,直接输入 1 或 2 就能选。
2. 容错重试逻辑
网络抖动是常态,尤其是当你连接某些不稳定的转发接口时,偶尔出现一个空响应或超时太正常了。
如果每次失败都要重新输入 URL 和 Key,那体验太糟糕。我在代码里加了一个简单的 while 循环:如果 API 没给回复,它会自动重试最多 2 次。这种设计能过滤掉 90% 的瞬时网络问题。
3. 极简交互菜单
我给它做了一个简单的菜单界面。你不需要在启动命令里传一堆参数(那样太难记了),而是在运行后根据提示输入信息。这种交互方式让工具变得像一个小程序一样简单。
完整代码实现
这里是 apitest.sh 的全部代码。你可以直接复制,或者直接下载。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| #!/bin/bash
read -p "请输入 Base URL: " base_url
read -p "请输入 API Key: " api_key
base_url=${base_url%/}
models_url="${base_url}/models"
chat_url="${base_url}/chat/completions"
models_id=()
models_name=()
while true; do
echo -e "\n=== API 检测与测试菜单 ==="
echo "1. 获取模型列表"
echo "2. 使用编号进行聊天测试 (带自动重试)"
echo "3. 退出"
read -p "请选择 (1-3): " choice
case $choice in
1)
models_id=(); models_name=()
while IFS= read -r line; do
models_id+=("$(echo "$line" | cut -d'|' -f1)")
models_name+=("$(echo "$line" | cut -d'|' -f2)")
done < <(curl -s -H "Authorization: Bearer $api_key" "$models_url" | jq -r '.data[] | "\(.id)|\(.name // .id)"')
for i in "${!models_id[@]}"; do printf "%d) ID: %-30s | Name: %s\n" "$((i+1))" "${models_id[$i]}" "${models_name[$i]}"; done
;;
2)
if [ ${#models_id[@]} -eq 0 ]; then echo "请先执行选项 1!"; continue; fi
read -p "请输入模型编号: " idx
if [[ "$idx" =~ ^[0-9]+$ ]] && [ "$idx" -ge 1 ] && [ "$idx" -le "${#models_id[@]}" ]; then
selected_model=${models_id[$((idx-1))]}
read -p "请输入消息: " user_content
max_retries=2
attempt=0
success=false
while [ $attempt -le $max_retries ]; do
echo "正在尝试 (第 $((attempt+1)) 次)..."
response=$(curl -s "$chat_url" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $api_key" \
-d "{
\"model\": \"$selected_model\",
\"messages\": [{\"role\": \"user\", \"content\": \"$user_content\"}],
\"max_tokens\": 100
}")
reply=$(echo "$response" | jq -r '.choices[0].message.content // empty')
if [ -n "$reply" ]; then
echo -e "\n模型回复:\n$reply"
success=true
break
else
echo "警告: 未收到有效回复。"
attempt=$((attempt+1))
fi
done
[ "$success" = false ] && echo "错误: 经过多次尝试,依然无法获取回复。"
else
echo "无效编号。"
fi
;;
3) break ;;
*) echo "无效选择。" ;;
esac
done
|
快速上手指南
第一步:安装 jq
这个脚本唯一依赖的工具是 jq(用来解析 JSON 的神级工具)。如果没装,赶紧装一个:
- Ubuntu/Debian:
sudo apt install jq - CentOS/RHEL:
sudo dnf install jq - macOS:
brew install jq
第二步:部署脚本
- 保存文件:把代码保存为
apitest。 - 给权限:
- 全局可用(推荐):
1
| sudo mv apitest /usr/local/bin/apitest
|
第三步:开始测试
在终端输入 apitest,终端会提示你输入 Base URL 和 API Key。
- 选
1 看模型列表 $
ightarrow$ 选 2 输入编号和问题 $
ightarrow$ 拿结果。
总结
apitest.sh 走的是一条极简路线:不要为了简单的需求去构建复杂的系统。
接下来的计划是给它加几个实用功能:统计首字延迟 (TTFT)、记录响应时间、以及支持从 .env 文件读取配置。
如果你也受够了为简单的接口测试而写冗长代码,试试这个 Bash 脚本,你会发现高效其实可以这么简单。