#!/usr/bin/env bash # 本地可跑的检查:假 dsh 模拟 GLM 额度用尽 → 应切 DeepSeek;冷却过后应切回 GLM。 set -u D="$(cd "$(dirname "$0")" && pwd)"; T=$(mktemp -d) export DSH_FB_STATE="$T/state" DSH_FB_MIN_COOLDOWN=2 DSH_FB_MARGIN=0 HOME="$T" cat > "$T/fake" <<'F' #!/usr/bin/env bash if [[ "$*" == *deepseek* ]]; then echo "answer-from-deepseek"; exit 0; fi if [ -e "$GLM_DOWN" ]; then echo "dsh: ${GLM_MSG:-QUOTA usage limit}" >&2; exit 1; fi echo "answer-from-glm" F chmod +x "$T/fake"; export GLM_DOWN="$T/down" . "$D/fallback.sh"; DSH_FB_PATCH="$T/deepseek.yml" run() { dsh_with_fallback "$T/fake" @PATCH@ task 2>/dev/null; } [ "$(run)" = answer-from-glm ] || { echo "FAIL 1 平时应走 GLM"; exit 1; } touch "$GLM_DOWN" [ "$(run)" = answer-from-deepseek ] || { echo "FAIL 2 额度用尽应切 DeepSeek"; exit 1; } rm "$GLM_DOWN" [ "$(run)" = answer-from-deepseek ] || { echo "FAIL 3 冷却期内应继续 DeepSeek"; exit 1; } sleep 3 [ "$(run)" = answer-from-glm ] || { echo "FAIL 4 冷却后 GLM 恢复应切回"; exit 1; } # 额度类:冷却取 next_flush_time(3 种格式);取不到=MIN_COOLDOWN;瞬时类 1302=SHORT export DSH_FB_MIN_COOLDOWN=100 DSH_FB_SHORT=7 chk() { # chk <名字> <最小秒> <最大秒> rm -f "$DSH_FB_STATE"; touch "$GLM_DOWN"; export GLM_MSG="$2"; run >/dev/null d=$(( $(cat "$DSH_FB_STATE") - $(date +%s) )) [ "$d" -ge "$3" ] && [ "$d" -le "$4" ] || { echo "FAIL $1 期望 $3~$4s,实得 +${d}s"; exit 1; } } now=$(date +%s) chk "秒级时间戳" "1308 {\"next_flush_time\":$((now+4))}" 1 8 chk "毫秒时间戳" "1310 {\"next_flush_time\": $(( (now+4)*1000 ))}" 1 8 chk "日期串(北京时间)" "1308 已达到使用上限 next_flush_time: $(python3 -c 'import time;print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime(time.time()+8*3600+4)))')" 1 8 chk "额度类无时间=最短冷却" "1308 已达到 5 小时的使用上限" 95 105 chk "瞬时 1302=短冷却" "1302 您的账户已达到速率限制" 5 9 rm -f "$DSH_FB_STATE"; touch "$GLM_DOWN"; export GLM_MSG="boom"; run >/dev/null; [ ! -e "$DSH_FB_STATE" ] || { echo "FAIL 未知错误不应切换"; exit 1; } echo PASS