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