别再写 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 在这种“一次性探测”任务中简直是神器:

  1. 真正意义上的零依赖curl 是类 Unix 系统的标配。你不需要 pip install,不需要担心 requirements.txt 版本不对。
  2. 启动零延迟:Bash 脚本是瞬时启动的。对比 Python 启动解释器、加载库的时间,这种体感差异在频繁测试时非常明显。
  3. 系统级便捷:把它丢进 /usr/local/bin,它就变成了一个原生的系统命令。在任何目录下输入 apitest 就能开始工作,不需要在文件夹之间跳来跳去。

这个脚本是怎么工作的?

apitest.sh 没搞那些复杂的架构,它只盯着 API 测试最核心的三个环节:

1. 实时模型发现

API 供应商的模型列表变动极其频繁。如果你在脚本里硬编码 gpt-4o,结果对方升级到了 gpt-4o-latest,你就会收到一个莫名其妙的 404 错误。 apitest.sh 直接调用 /models 接口,动态抓取所有可用模型。我把抓到的 ID 和 Name 转换成了一个带编号的列表。你不需要记住那些长得离谱的模型 ID,直接输入 12 就能选。

2. 容错重试逻辑

网络抖动是常态,尤其是当你连接某些不稳定的转发接口时,偶尔出现一个空响应或超时太正常了。 如果每次失败都要重新输入 URL 和 Key,那体验太糟糕。我在代码里加了一个简单的 while 循环:如果 API 没给回复,它会自动重试最多 2 次。这种设计能过滤掉 90% 的瞬时网络问题。

3. 极简交互菜单

我给它做了一个简单的菜单界面。你不需要在启动命令里传一堆参数(那样太难记了),而是在运行后根据提示输入信息。这种交互方式让工具变得像一个小程序一样简单。

完整代码实现

这里是 apitest.sh 的全部代码。你可以直接复制,或者直接下载。

#!/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

第二步:部署脚本

  1. 保存文件:把代码保存为 apitest

  2. 给权限

    chmod +x apitest
  3. 全局可用(推荐):

    sudo mv apitest /usr/local/bin/apitest

第三步:开始测试

在终端输入 apitest,终端会提示你输入 Base URLAPI Key。 1. 选 1 看模型列表 $ ightarrow$ 选 2 输入编号和问题 $ ightarrow$ 拿结果。

总结

apitest.sh 走的是一条极简路线:不要为了简单的需求去构建复杂的系统。

接下来的计划是给它加几个实用功能:统计首字延迟 (TTFT)、记录响应时间、以及支持从 .env 文件读取配置。

如果你也受够了为简单的接口测试而写冗长代码,试试这个 Bash 脚本,你会发现高效其实可以这么简单。