ProxyCLI / scripts /verify_claude_proxy.sh
PHhTTPS's picture
Replace hardcoded OAuth secrets with placeholders
4998bdc
#!/usr/bin/env bash
set -euo pipefail
# Quick health check for Claude Code through CLIProxyAPIPlus.
# It validates configuration placeholders, confirms the proxy is reachable,
# and performs a real /v1/messages call using the provided client key.
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
CONFIG_FILE="${CONFIG_FILE:-${ROOT_DIR}/config.yaml}"
BASE_URL="${BASE_URL:-http://localhost:7860}"
CLIENT_KEY="${CLIENT_KEY:-${ANTHROPIC_API_KEY:-${CLAUDE_API_KEY:-}}}"
MODEL="${MODEL:-claude-3-5-haiku-20241022}"
tmp_body="$(mktemp)"
cleanup() { rm -f "$tmp_body"; }
trap cleanup EXIT
info() { printf '[INFO] %s\n' "$*"; }
warn() { printf '[WARN] %s\n' "$*" >&2; }
fatal() { printf '[FAIL] %s\n' "$*" >&2; exit 1; }
info "Using BASE_URL=${BASE_URL}"
info "Using MODEL=${MODEL}"
# 1) Check for placeholder keys in config.yaml
if [[ -f "$CONFIG_FILE" ]]; then
if grep -nE 'DEIN_(CLAUDE|GEMINI|OPENROUTER)_KEY' "$CONFIG_FILE" >/dev/null; then
warn "config.yaml still contains placeholder provider keys (DEIN_*). Upstream requests will fail."
fi
else
warn "config file not found at ${CONFIG_FILE}"
fi
# 2) Ensure we have a client key
[[ -n "$CLIENT_KEY" ]] || fatal "No client key set. Export CLIENT_KEY or ANTHROPIC_API_KEY or CLAUDE_API_KEY."
# 3) /v1/models check
info "Checking /v1/models..."
models_status=$(curl -sS -o "$tmp_body" -w '%{http_code}' \
-H "Authorization: Bearer ${CLIENT_KEY}" \
"${BASE_URL}/v1/models") || fatal "curl to /v1/models failed"
if [[ "$models_status" != "200" ]]; then
cat "$tmp_body" >&2
fatal "/v1/models returned HTTP ${models_status}"
fi
info "/v1/models OK"
# 4) /v1/messages check
info "Checking /v1/messages with model=${MODEL}..."
payload=$(cat <<'JSON'
{
"model": "__MODEL__",
"messages": [
{"role": "user", "content": "ping"}
],
"max_tokens": 16
}
JSON
)
payload="${payload/__MODEL__/${MODEL}}"
msg_status=$(curl -sS -o "$tmp_body" -w '%{http_code}' \
-X POST "${BASE_URL}/v1/messages" \
-H "x-api-key: ${CLIENT_KEY}" \
-H "content-type: application/json" \
-d "$payload") || fatal "curl to /v1/messages failed"
if [[ "$msg_status" != "200" ]]; then
cat "$tmp_body" >&2
fatal "/v1/messages returned HTTP ${msg_status}"
fi
info "/v1/messages OK"
info "Claude proxy looks healthy. You can run Claude Code with:"
info "ANTHROPIC_API_KEY=${CLIENT_KEY} ANTHROPIC_BASE_URL=${BASE_URL} claude"