- ansible/: VM provisioning playbooks and roles - provision-vm.yml: create KVM VM from Ubuntu cloud image - install.yml: install OpenClaw on guest (upstream) - customize.yml: swappiness, virtiofs fstab, linger - roles/vm/: libvirt domain XML, cloud-init templates - inventory.yml + host_vars/zap.yml: zap instance config - backup-openclaw-vm.sh: daily rsync + MinIO upload - restore-openclaw-vm.sh: full redeploy from scratch - README.md: full operational documentation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
163 lines
7.9 KiB
Bash
Executable File
163 lines
7.9 KiB
Bash
Executable File
#!/bin/sh
|
|
# Registers models into LiteLLM's database so they are UI-manageable.
|
|
# Idempotent: skips models that are already in the DB.
|
|
|
|
LITELLM_URL="${LITELLM_URL:-http://localhost:18804}"
|
|
LITELLM_MASTER_KEY="${LITELLM_MASTER_KEY:?LITELLM_MASTER_KEY is required}"
|
|
|
|
# Fetch existing DB model names once
|
|
EXISTING=$(curl -s "$LITELLM_URL/v2/model/info" \
|
|
-H "Authorization: Bearer $LITELLM_MASTER_KEY" | \
|
|
python3 -c "
|
|
import sys, json
|
|
data = json.load(sys.stdin)
|
|
for m in data.get('data', []):
|
|
if m.get('model_info', {}).get('db_model'):
|
|
print(m['model_name'])
|
|
" 2>/dev/null)
|
|
|
|
add_model() {
|
|
local model_name="$1"
|
|
local litellm_model="$2"
|
|
local api_key_env="$3"
|
|
local api_base="${4:-}"
|
|
|
|
if echo "$EXISTING" | grep -qx "$model_name"; then
|
|
echo " [skip] $model_name"
|
|
return
|
|
fi
|
|
|
|
if [ -n "$api_base" ]; then
|
|
base_json=",\"api_base\":\"$api_base\""
|
|
else
|
|
base_json=""
|
|
fi
|
|
|
|
local body="{\"model_name\":\"$model_name\",\"litellm_params\":{\"model\":\"$litellm_model\",\"api_key\":\"os.environ/$api_key_env\"$base_json}}"
|
|
|
|
local status
|
|
status=$(curl -s -o /tmp/model_resp.json -w "%{http_code}" \
|
|
-X POST "$LITELLM_URL/model/new" \
|
|
-H "Authorization: Bearer $LITELLM_MASTER_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$body")
|
|
|
|
if [ "$status" = "200" ] || [ "$status" = "201" ]; then
|
|
echo " [ok] $model_name"
|
|
else
|
|
echo " [fail] $model_name — HTTP $status: $(cat /tmp/model_resp.json)"
|
|
fi
|
|
}
|
|
|
|
# GitHub Copilot models use token-file auth, no api_key needed.
|
|
add_copilot_model() {
|
|
local model_name="$1"
|
|
local copilot_model="$2"
|
|
|
|
if echo "$EXISTING" | grep -qx "$model_name"; then
|
|
echo " [skip] $model_name"
|
|
return
|
|
fi
|
|
|
|
local body="{\"model_name\":\"$model_name\",\"litellm_params\":{\"model\":\"github_copilot/$copilot_model\",\"extra_headers\":{\"editor-version\":\"vscode/1.85.1\",\"editor-plugin-version\":\"copilot/1.155.0\",\"Copilot-Integration-Id\":\"vscode-chat\",\"user-agent\":\"GithubCopilot/1.155.0\"}}}"
|
|
|
|
local status
|
|
status=$(curl -s -o /tmp/model_resp.json -w "%{http_code}" \
|
|
-X POST "$LITELLM_URL/model/new" \
|
|
-H "Authorization: Bearer $LITELLM_MASTER_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$body")
|
|
|
|
if [ "$status" = "200" ] || [ "$status" = "201" ]; then
|
|
echo " [ok] $model_name"
|
|
else
|
|
echo " [fail] $model_name — HTTP $status: $(cat /tmp/model_resp.json)"
|
|
fi
|
|
}
|
|
|
|
echo "Registering models in LiteLLM DB..."
|
|
|
|
# OpenAI — GPT series
|
|
add_model "gpt-4o" "openai/gpt-4o" "OPENAI_API_KEY"
|
|
add_model "gpt-4o-mini" "openai/gpt-4o-mini" "OPENAI_API_KEY"
|
|
add_model "gpt-4.1" "openai/gpt-4.1" "OPENAI_API_KEY"
|
|
add_model "gpt-4.1-mini" "openai/gpt-4.1-mini" "OPENAI_API_KEY"
|
|
add_model "gpt-4.1-nano" "openai/gpt-4.1-nano" "OPENAI_API_KEY"
|
|
add_model "gpt-5" "openai/gpt-5" "OPENAI_API_KEY"
|
|
add_model "gpt-5-mini" "openai/gpt-5-mini" "OPENAI_API_KEY"
|
|
add_model "gpt-5-nano" "openai/gpt-5-nano" "OPENAI_API_KEY"
|
|
add_model "gpt-5-pro" "openai/gpt-5-pro" "OPENAI_API_KEY"
|
|
add_model "gpt-5.1" "openai/gpt-5.1" "OPENAI_API_KEY"
|
|
add_model "gpt-5.2" "openai/gpt-5.2" "OPENAI_API_KEY"
|
|
add_model "gpt-5.2-pro" "openai/gpt-5.2-pro" "OPENAI_API_KEY"
|
|
# OpenAI — o-series reasoning
|
|
add_model "o1" "openai/o1" "OPENAI_API_KEY"
|
|
add_model "o1-pro" "openai/o1-pro" "OPENAI_API_KEY"
|
|
add_model "o3" "openai/o3" "OPENAI_API_KEY"
|
|
add_model "o3-mini" "openai/o3-mini" "OPENAI_API_KEY"
|
|
add_model "o4-mini" "openai/o4-mini" "OPENAI_API_KEY"
|
|
# OpenAI — Codex series
|
|
add_model "gpt-5-codex" "openai/gpt-5-codex" "OPENAI_API_KEY"
|
|
add_model "gpt-5.1-codex" "openai/gpt-5.1-codex" "OPENAI_API_KEY"
|
|
add_model "gpt-5.1-codex-max" "openai/gpt-5.1-codex-max" "OPENAI_API_KEY"
|
|
add_model "gpt-5.1-codex-mini" "openai/gpt-5.1-codex-mini" "OPENAI_API_KEY"
|
|
add_model "gpt-5.2-codex" "openai/gpt-5.2-codex" "OPENAI_API_KEY"
|
|
add_model "gpt-5.3-codex" "openai/gpt-5.3-codex" "OPENAI_API_KEY"
|
|
|
|
# Anthropic
|
|
add_model "claude-opus-4-6" "anthropic/claude-opus-4-6" "ANTHROPIC_API_KEY"
|
|
add_model "claude-sonnet-4-6" "anthropic/claude-sonnet-4-6" "ANTHROPIC_API_KEY"
|
|
add_model "claude-opus-4-5" "anthropic/claude-opus-4-5-20251101" "ANTHROPIC_API_KEY"
|
|
add_model "claude-opus-4-1" "anthropic/claude-opus-4-1-20250805" "ANTHROPIC_API_KEY"
|
|
add_model "claude-sonnet-4-5" "anthropic/claude-sonnet-4-5-20250929" "ANTHROPIC_API_KEY"
|
|
add_model "claude-opus-4" "anthropic/claude-opus-4-20250514" "ANTHROPIC_API_KEY"
|
|
add_model "claude-sonnet-4" "anthropic/claude-sonnet-4-20250514" "ANTHROPIC_API_KEY"
|
|
add_model "claude-haiku-4-5" "anthropic/claude-haiku-4-5-20251001" "ANTHROPIC_API_KEY"
|
|
add_model "claude-3-haiku" "anthropic/claude-3-haiku-20240307" "ANTHROPIC_API_KEY"
|
|
|
|
# Google Gemini
|
|
add_model "gemini-2.0-flash" "gemini/gemini-2.0-flash" "GEMINI_API_KEY"
|
|
add_model "gemini-2.0-flash-lite" "gemini/gemini-2.0-flash-lite" "GEMINI_API_KEY"
|
|
add_model "gemini-2.5-flash-lite" "gemini/gemini-2.5-flash-lite" "GEMINI_API_KEY"
|
|
add_model "gemini-2.5-flash" "gemini/gemini-2.5-flash" "GEMINI_API_KEY"
|
|
add_model "gemini-2.5-pro" "gemini/gemini-2.5-pro" "GEMINI_API_KEY"
|
|
add_model "gemini-3-flash-preview" "gemini/gemini-3-flash-preview" "GEMINI_API_KEY"
|
|
add_model "gemini-3-pro-preview" "gemini/gemini-3-pro-preview" "GEMINI_API_KEY"
|
|
add_model "gemini-3.1-pro-preview" "gemini/gemini-3.1-pro-preview" "GEMINI_API_KEY"
|
|
add_model "gemini-flash-latest" "gemini/gemini-flash-latest" "GEMINI_API_KEY"
|
|
add_model "gemini-flash-lite-latest" "gemini/gemini-flash-lite-latest" "GEMINI_API_KEY"
|
|
add_model "gemini-pro-latest" "gemini/gemini-pro-latest" "GEMINI_API_KEY"
|
|
|
|
# ZAI / GLM
|
|
add_model "zai-glm-4.5" "openai/glm-4.5" "ZAI_API_KEY" "https://api.z.ai/api/coding/paas/v4"
|
|
add_model "zai-glm-4.5-air" "openai/glm-4.5-air" "ZAI_API_KEY" "https://api.z.ai/api/coding/paas/v4"
|
|
add_model "zai-glm-4.6" "openai/glm-4.6" "ZAI_API_KEY" "https://api.z.ai/api/coding/paas/v4"
|
|
add_model "zai-glm-4.7" "openai/glm-4.7" "ZAI_API_KEY" "https://api.z.ai/api/coding/paas/v4"
|
|
add_model "zai-glm-5" "openai/glm-5" "ZAI_API_KEY" "https://api.z.ai/api/coding/paas/v4"
|
|
|
|
# GitHub Copilot (token-file auth, no API key)
|
|
add_copilot_model "copilot-gpt-4o" "gpt-4o"
|
|
add_copilot_model "copilot-gpt-4.1" "gpt-4.1"
|
|
add_copilot_model "copilot-gpt-5-mini" "gpt-5-mini"
|
|
add_copilot_model "copilot-gpt-5.1" "gpt-5.1"
|
|
add_copilot_model "copilot-gpt-5.2" "gpt-5.2"
|
|
add_copilot_model "copilot-gpt-5.1-codex" "gpt-5.1-codex"
|
|
add_copilot_model "copilot-gpt-5.1-codex-max" "gpt-5.1-codex-max"
|
|
add_copilot_model "copilot-gpt-5.1-codex-mini" "gpt-5.1-codex-mini"
|
|
add_copilot_model "copilot-gpt-5.2-codex" "gpt-5.2-codex"
|
|
add_copilot_model "copilot-gpt-5.3-codex" "gpt-5.3-codex"
|
|
add_copilot_model "copilot-claude-opus-4.6" "claude-opus-4.6"
|
|
add_copilot_model "copilot-claude-opus-4.6-fast" "claude-opus-4.6-fast"
|
|
add_copilot_model "copilot-claude-sonnet-4.6" "claude-sonnet-4.6"
|
|
add_copilot_model "copilot-claude-sonnet-4.5" "claude-sonnet-4.5"
|
|
add_copilot_model "copilot-claude-sonnet-4" "claude-sonnet-4"
|
|
add_copilot_model "copilot-claude-opus-4.5" "claude-opus-4.5"
|
|
add_copilot_model "copilot-claude-haiku-4.5" "claude-haiku-4.5"
|
|
add_copilot_model "copilot-gemini-2.5-pro" "gemini-2.5-pro"
|
|
add_copilot_model "copilot-gemini-3-flash" "gemini-3-flash-preview"
|
|
add_copilot_model "copilot-gemini-3-pro" "gemini-3-pro-preview"
|
|
add_copilot_model "copilot-gemini-3.1-pro" "gemini-3.1-pro-preview"
|
|
add_copilot_model "copilot-grok-code-fast" "grok-code-fast-1"
|
|
|
|
echo "Done."
|