Initial commit: OpenClaw ops workspace
This commit is contained in:
74
skills/model-selector/scripts/list-models.sh
Executable file
74
skills/model-selector/scripts/list-models.sh
Executable file
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env bash
|
||||
# list-models.sh — Query the LLM proxy /v1/models endpoint
|
||||
# Usage:
|
||||
# list-models.sh # List all model IDs (sorted)
|
||||
# list-models.sh --providers # List unique provider names
|
||||
# list-models.sh --json # Raw JSON response
|
||||
set -euo pipefail
|
||||
|
||||
# Resolve proxy URL and API key from environment or defaults
|
||||
PROXY_URL="${LLM_PROXY_URL:-https://llm-proxy.ext.ben.io/v1}"
|
||||
PROXY_KEY="${PROXY_API_KEY:-${LLM_PROXY_API_KEY:-}}"
|
||||
|
||||
if [[ -z "$PROXY_KEY" ]]; then
|
||||
# Try to read from openclaw config
|
||||
for cfg_path in \
|
||||
"${OPENCLAW_STATE_DIR:-$HOME/.openclaw/state}/openclaw.json" \
|
||||
"${OPENCLAW_CONFIG_DIR:-$HOME/.openclaw/config}/openclaw.json"; do
|
||||
if [[ -f "$cfg_path" ]]; then
|
||||
# Extract apiKey from llm-proxy provider config (handles JSON5 comments)
|
||||
key=$(grep -A5 '"llm-proxy"' "$cfg_path" | grep '"apiKey"' | head -1 | sed 's/.*"apiKey"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/' || true)
|
||||
if [[ -n "$key" && "$key" != *'${'* ]]; then
|
||||
PROXY_KEY="$key"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ -z "$PROXY_KEY" ]]; then
|
||||
echo "ERROR: No API key found. Set PROXY_API_KEY or LLM_PROXY_API_KEY environment variable." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Strip trailing /v1 from PROXY_URL if present, then always append /v1/models
|
||||
# This prevents double /v1/v1/ when LLM_PROXY_URL already includes /v1
|
||||
PROXY_BASE="${PROXY_URL%/v1}"
|
||||
PROXY_BASE="${PROXY_BASE%/}"
|
||||
|
||||
response=$(curl -s -f -H "Authorization: Bearer $PROXY_KEY" "${PROXY_BASE}/v1/models" 2>&1) || {
|
||||
echo "ERROR: Failed to query ${PROXY_BASE}/v1/models" >&2
|
||||
echo "$response" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
case "${1:-}" in
|
||||
--providers)
|
||||
echo "$response" | python3 -c "
|
||||
import sys, json
|
||||
data = json.load(sys.stdin)
|
||||
providers = sorted(set(m['id'].split('/')[0] for m in data.get('data', [])))
|
||||
for p in providers:
|
||||
print(p)
|
||||
"
|
||||
;;
|
||||
--json)
|
||||
echo "$response"
|
||||
;;
|
||||
--count)
|
||||
echo "$response" | python3 -c "
|
||||
import sys, json
|
||||
data = json.load(sys.stdin)
|
||||
print(len(data.get('data', [])))
|
||||
"
|
||||
;;
|
||||
*)
|
||||
echo "$response" | python3 -c "
|
||||
import sys, json
|
||||
data = json.load(sys.stdin)
|
||||
models = sorted(m['id'] for m in data.get('data', []))
|
||||
for m in models:
|
||||
print(m)
|
||||
"
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user