diff --git a/services/hermes/setup_hermes.sh b/services/hermes/setup_hermes.sh index b895452..666ea96 100644 --- a/services/hermes/setup_hermes.sh +++ b/services/hermes/setup_hermes.sh @@ -34,6 +34,7 @@ log "=========================================================" # ----------------------------------------------------------------------------- OPENROUTER_API_KEY="" MISTRAL_API_KEY="" +MINIMAX_API_KEY="" if [[ -f "${SHARED_ENV}" ]]; then # shellcheck source=/dev/null @@ -113,9 +114,20 @@ else ' fi + # Standard-Provider für Hermes konfigurieren: MiniMax bevorzugen + if [[ -n "${MINIMAX_API_KEY:-}" ]]; then + log "Konfiguriere Hermes für MiniMax..." + docker exec -u node "${PAPERCLIP_CONTAINER}" hermes config set model.provider minimax 2>/dev/null || true + docker exec -u node "${PAPERCLIP_CONTAINER}" hermes config set model.default MiniMax-M3 2>/dev/null || true + elif [[ -n "${OPENROUTER_API_KEY:-}" ]]; then + log "Konfiguriere Hermes für OpenRouter..." + docker exec -u node "${PAPERCLIP_CONTAINER}" hermes config set model.provider auto 2>/dev/null || true + fi + # Verifikation im Container log "Verifiziere Hermes im PaperClip-Container:" docker exec -u node "${PAPERCLIP_CONTAINER}" hermes --version 2>&1 || true + docker exec -u node "${PAPERCLIP_CONTAINER}" hermes config get model 2>&1 || true docker exec -u node "${PAPERCLIP_CONTAINER}" /opt/hermes-venv/bin/python3 -c "import anthropic; print('anthropic package ok')" 2>&1 || true fi @@ -125,14 +137,18 @@ fi if docker ps --format '{{.Names}}' | grep -q "^${HERMES_CONTAINER}$"; then log "3/3 Standalone Hermes Container (${HERMES_CONTAINER}) ist aktiv." - # Sicherstellen, dass .env im Volume existiert - if [[ -n "${OPENROUTER_API_KEY}" ]]; then - docker exec -u root "${HERMES_CONTAINER}" bash -c "cat > /opt/data/.env </dev/null || true -chmod 600 /opt/data/.env -" + # Alle Keys aus shared.env kopieren + if [[ -f "${SHARED_ENV}" ]]; then + docker cp "${SHARED_ENV}" "${HERMES_CONTAINER}:/opt/data/.env" + docker exec -u root "${HERMES_CONTAINER}" bash -c ' + chown -R hermes:hermes /opt/data/.env 2>/dev/null || true + chmod 600 /opt/data/.env + ' + fi + + if [[ -n "${MINIMAX_API_KEY:-}" ]]; then + docker exec -u hermes "${HERMES_CONTAINER}" hermes config set model.provider minimax 2>/dev/null || true + docker exec -u hermes "${HERMES_CONTAINER}" hermes config set model.default MiniMax-M3 2>/dev/null || true fi else log "3/3 Standalone Hermes Container (${HERMES_CONTAINER}) nicht aktiv (wird bei Bedarf gestartet)." diff --git a/services/paperclip/docker-compose.yml b/services/paperclip/docker-compose.yml index b6ea222..71f0de9 100644 --- a/services/paperclip/docker-compose.yml +++ b/services/paperclip/docker-compose.yml @@ -35,7 +35,7 @@ services: PAPERCLIP_AUTH_BASE_URL_MODE: "explicit" PAPERCLIP_PUBLIC_URL: "https://paperclip.orfel.de" HERMES_GATEWAY_ALLOW_INSECURE_HTTP: "1" - PAPERCLIP_OPENCODE_PROVIDERS: '{"openrouter":{"npm":"@ai-sdk/openai-compatible","options":{"baseURL":"https://openrouter.ai/api/v1","apiKey":"{env:OPENROUTER_API_KEY}"},"models":{"anthropic/claude-sonnet-4-5":{},"anthropic/claude-3.5-sonnet":{},"google/gemini-2.5-pro":{},"deepseek/deepseek-r1":{},"openai/gpt-4o":{}}},"mistral":{"npm":"@ai-sdk/openai-compatible","options":{"apiKey":"{env:MISTRAL_API_KEY}"},"models":{"mistral/mistral-large":{}}},"minimax":{"npm":"@ai-sdk/openai-compatible","options":{"apiKey":"{env:MINIMAX_API_KEY}"},"models":{"minimax/abab6.5s":{}}},"poe":{"npm":"@ai-sdk/openai-compatible","options":{"apiKey":"{env:POE_API_KEY}"},"models":{"poe/claude-3-opus":{}}}}' + PAPERCLIP_OPENCODE_PROVIDERS: '{"openrouter":{"npm":"@ai-sdk/openai-compatible","options":{"baseURL":"https://openrouter.ai/api/v1","apiKey":"{env:OPENROUTER_API_KEY}"},"models":{"anthropic/claude-sonnet-4-5":{},"anthropic/claude-3.5-sonnet":{},"google/gemini-2.5-pro":{},"deepseek/deepseek-r1":{},"openai/gpt-4o":{}}},"mistral":{"npm":"@ai-sdk/openai-compatible","options":{"apiKey":"{env:MISTRAL_API_KEY}"},"models":{"mistral/mistral-large":{}}},"minimax":{"npm":"@ai-sdk/openai-compatible","options":{"baseURL":"https://api.minimax.io/v1","apiKey":"{env:MINIMAX_API_KEY}"},"models":{"minimax/abab6.5s":{},"minimax/MiniMax-Text-01":{},"minimax/MiniMax-M3":{}}},"poe":{"npm":"@ai-sdk/openai-compatible","options":{"apiKey":"{env:POE_API_KEY}"},"models":{"poe/claude-3-opus":{}}}}' volumes: - /opt/PaperClip-Data/paperclip:/paperclip - /opt/PaperClip-Data/paperclip-hermes-venv:/opt/hermes-venv