别再写 Python 脚本了:用一个 Bash 脚本搞定 LLM API 快速测试
别再写 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 脚本,你会发现高效其实可以这么简单。
本文作者:BOSh
本文链接:http://bosh.zz.ac/posts/5039135a.html
版权声明:本文由BoSh发布,部分内容来源于网络。