File size: 2,389 Bytes
4998bdc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/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"