Files
PaperClip/services/hermes/service.init
T
Jannik 78d4a4894e feat: Generic service.init system + Hermes setup script
- NEW: services/hermes/service.init — wartet auf Hermes-API, konfiguriert
  Provider aus shared.env (OpenRouter bevorzugt), gibt Dashboard-URL aus
- NEW: services/paperclip/service.init — extrahiert PaperClip-Setup aus
  main() in eigenständiges Skript (Patch, Onboarding, Bootstrap-URL)
- NEW: run_service_inits() in deploy_script.sh — ruft automatisch alle
  service.init-Skripte nach dem Start auf
- CLEANUP: main() in deploy_script.sh ist jetzt schlank und generisch
2026-10-01 20:04:56 +02:00

124 lines
4.6 KiB
Bash

#!/usr/bin/env bash
###############################################################################
# hermes service.init — läuft nach dem Start des Hermes-Containers
# Richtet Hermes vollständig ein:
# 1. Wartet, bis die API antwortet
# 2. Konfiguriert den Standard-Provider (OpenRouter)
# 3. Gibt Status und Dashboard-URL aus
###############################################################################
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
SHARED_ENV="${SCRIPT_DIR}/../shared.env"
CONTAINER="hermes"
API_PORT="8642"
DASHBOARD_PORT="9119"
API_BASE="http://127.0.0.1:${API_PORT}"
log() { echo -e "\e[32m[HERMES-INIT]\e[0m $*"; }
warn() { echo -e "\e[33m[HERMES-INIT][WARN]\e[0m $*"; }
err() { echo -e "\e[31m[HERMES-INIT][ERROR]\e[0m $*" >&2; }
###############################################################################
# 1. Shared API Keys laden
###############################################################################
OPENROUTER_API_KEY=""
MISTRAL_API_KEY=""
if [[ -f "${SHARED_ENV}" ]]; then
# shellcheck source=/dev/null
source "${SHARED_ENV}"
fi
if [[ -z "${OPENROUTER_API_KEY}" && -z "${MISTRAL_API_KEY}" ]]; then
warn "Kein API Key in shared.env gefunden. Hermes wird ohne Provider-Konfiguration gestartet."
fi
###############################################################################
# 2. Auf Hermes-API warten
###############################################################################
log "Warte auf Hermes API (${API_BASE}/health)..."
for i in {1..30}; do
if docker exec "${CONTAINER}" wget -qO- "${API_BASE}/health" >/dev/null 2>&1; then
log "Hermes API antwortet!"
break
fi
if [[ $i -eq 30 ]]; then
err "Hermes API hat nach 60s nicht geantwortet. Logs:"
docker logs "${CONTAINER}" --tail 20 >&2
exit 1
fi
sleep 2
done
###############################################################################
# 3. Provider konfigurieren (idempotent)
###############################################################################
configure_provider() {
local provider_name="$1"
local api_key="$2"
local base_url="$3"
local model="$4"
log "Konfiguriere Provider: ${provider_name} (${base_url})..."
# Hermes REST API: Provider setzen
# POST /api/config/provider — setzt den Standard-LLM-Provider
local response
response=$(docker exec "${CONTAINER}" wget -qO- \
--header="Content-Type: application/json" \
--post-data="{\"provider\":\"${provider_name}\",\"apiKey\":\"${api_key}\",\"baseUrl\":\"${base_url}\",\"model\":\"${model}\"}" \
"${API_BASE}/api/config/provider" 2>/dev/null || echo "FAILED")
if [[ "${response}" == "FAILED" ]]; then
# Fallback: hermes CLI direkt im Container
log "REST-API-Konfiguration fehlgeschlagen — versuche hermes CLI..."
docker exec "${CONTAINER}" hermes config set \
--provider "${provider_name}" \
--api-key "${api_key}" \
--base-url "${base_url}" \
--model "${model}" 2>/dev/null || \
warn "CLI-Konfiguration ebenfalls fehlgeschlagen. Manuelle Konfiguration über ${DASHBOARD_URL} nötig."
else
log "Provider ${provider_name} erfolgreich konfiguriert."
fi
}
# Provider wählen: OpenRouter hat Vorrang vor Mistral
if [[ -n "${OPENROUTER_API_KEY}" ]]; then
configure_provider \
"openrouter" \
"${OPENROUTER_API_KEY}" \
"https://openrouter.ai/api/v1" \
"openrouter/auto"
elif [[ -n "${MISTRAL_API_KEY}" ]]; then
configure_provider \
"mistral" \
"${MISTRAL_API_KEY}" \
"https://api.mistral.ai/v1" \
"mistral-large-latest"
else
warn "Kein Provider konfiguriert — Hermes läuft ohne LLM."
fi
###############################################################################
# 4. Status & Dashboard-URL ausgeben
###############################################################################
DASHBOARD_URL="https://hermes.paperclip.orfel.de"
log "========================================================="
log " HERMES SETUP ABGESCHLOSSEN"
log "========================================================="
log " Dashboard: ${DASHBOARD_URL}"
log " Interne API: http://hermes:${API_PORT}"
log " PaperClip Adapter-URL: http://hermes:${API_PORT}"
log "========================================================="
log " In PaperClip einbinden:"
log " → Hire Agent → Adapter: hermes_gateway"
log " → Gateway URL: http://hermes:${API_PORT}"
log "========================================================="
echo ""
echo "Hermes Logs (letzte 10):"
docker logs "${CONTAINER}" --tail 10 2>&1