Discourse AI 引发新的 SSL 和 Connection Reset by Peer 错误

正如您所写,我最初认为这是一个网络堆栈问题,但从同一个容器中重复调用 OpenAI API 却可以正常工作。

这也是在 2 月 21 日的最新提交中完成的。

为了证明这一点(不惜消耗 token),我编写了一个快速脚本来检查 OpenAI 网络堆栈。

  • 运行 600 秒(10 分钟)
  • 每秒进行一次聊天补全调用
  • 更改提示以避免缓存

在容器中执行 ./launcher enter app,保存以下脚本,使用 chmod +x test_openai.sh 使其可执行,然后使用 OPENAI_API_KEY=.... ./test_openai.sh 调用它。

test_openai.sh
#!/bin/bash

# 运行持续时间
DURATION_SECS=600

# 初始化计数器
successful=0
unsuccessful=0
declare -A error_messages

# 计算百分比的函数
calc_percentage() {
    local total=$(($1 + $2))
    if [ $total -eq 0 ]; then
        echo "0.00"
    else
        echo "scale=2; ($2 * 100) / $total" | bc
    fi
}

# 打印统计信息的函数
print_stats() {
    local percent=$(calc_percentage $successful $unsuccessful)
    echo "-------------------"
    echo "成功调用次数: $successful"
    echo "失败调用次数: $unsuccessful"
    echo "失败率: ${percent}%"
    echo "错误消息:"
    for error in "${!error_messages[@]}"; do
        echo "  - $error (${error_messages[$error]} 次)"
    done
}

end_time=$((SECONDS + DURATION_SECS))

counter=1
while [ $SECONDS -lt $end_time ]; do
    # 带超时进行 API 调用
    response=$(curl -s -w "\n%{http_code}" \
        -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $OPENAI_API_KEY" \
        -d "{
            \"model\": \"gpt-4o-mini\",
            \"messages\": [{\"role\": \"user\", \"content\": \"Use this number to choose a one word response: $counter\"}]
        }" \
        --connect-timeout 5 \
        --max-time 10 \
        https://api.openai.com/v1/chat/completions 2>&1)

    # 获取最后一行(状态码)和响应体
    http_code=$(echo "$response" | tail -n1)
    body=$(echo "$response" | sed '$d')

    # 检查调用是否成功
    if [ "$http_code" = "200" ]; then
        ((successful++))
    else
        ((unsuccessful++))
        # 提取错误消息
        error_msg=$(echo "$body" | grep -o '"message":"[^"]*"' | cut -d'"' -f4)
        if [ -z "$error_msg" ]; then
            error_msg="Connection error: $body"
        fi
        # 增加错误消息计数器
        ((error_messages["$error_msg"]++))
    fi

    # 打印当前统计信息
    print_stats

    ((counter++))
    
    # 等待 1 秒后进行下一次调用
    sleep 1
done

对于测试脚本,我的失败率低于 0.5%,在这个规模下是可以接受的。

这表明问题出在 Discourse 软件本身,而不是为其供电的容器或网络堆栈。

如果最近的提交没有修复它,我将进一步研究。

2 个赞