Programme sollen nicht Box und Karte aussuchen muessen. Die ARIA-Bridge kennt
alle Boxen samt Karten-Belegung und verteilt (bridge/llm_cluster.py):
- Auswahl: unter allen online Boxen mit dem Modell die mit den wenigsten
laufenden Anfragen, bei Gleichstand reihum. Eine Karte / alles frei →
alles dorthin ("verteilen, wenn noetig").
- Ausfall: geht eine Box waehrend der Anfrage offline (kein Ping mehr), wird
sie EINMAL an eine andere Box mit demselben Modell gegeben. Modell-Fehler
(z.B. Kontext zu lang) werden nicht wiederholt — waeren ueberall gleich.
- Fehler kommen als Fehler (ok=false + errorCode), nie als Antwort-Text: ein
Programm wuerde ihn sonst als Aussage der KI in seinen Verlauf schreiben —
so ist bei ARIA schon mal ein ganzer Chat kaputtgegangen.
RVS: llm_cluster_models_request → llm_cluster_models (jedes Modell EINMAL,
ctx = kleinstes Kontextfenster unter seinen Karten), llm_cluster_request →
llm_cluster_response. In der RVS-Allow-List freigegeben.
ARIA nutzt denselben Router (mit ihrer 30-s-Frist fuer den lokalen
Schnellweg) — vorher Round-Robin ohne Ausfall-Ersatz, und errorCode ging
verloren.
xtts/openai_rvs_wrapper: fuer Programme, die nur "OpenAI-kompatibel" koennen
(OpenHands & Co.). Kleiner Container NEBEN dem Programm, fuer das der Cluster
dann http://127.0.0.1:8099/v1 ist; braucht nur eine ausgehende Verbindung zum
RVS. /v1/models (jedes Modell einmal, context_length), /v1/chat/completions
(auch stream und tools), Fehler als HTTP mit OpenAI-Fehlerobjekt. Hilfsseite
auf / zeigt Status, Base URL und Modelle. Fuer Programme in Docker: Netz
aria-llm, Name openai-rvs-wrapper. .env.example mit RVS_HOST/PORT/TOKEN.
(Ein OpenAI-Endpunkt direkt auf der VM war kurz drin und ist wieder raus —
der Wrapper braucht keinen offenen Port auf der VM.)
docs/LLM-SCHNITTSTELLE.md neu gegliedert: A) Cluster ueber RVS (empfohlen),
B) Wrapper, C) direkt an eine Box (Sonderfall), plus "Umstellen" fuer
bestehende Clients (Software-Schmiede).
Tests: mit echtem RVS und zwei echten llm-adaptern als zwei Boxen —
Modell einmal gelistet, 6 parallele Anfragen 3/3 verteilt, Box friert
mitten in der Anfrage ein → nach 15 s von der anderen beantwortet
(attempts=2), danach direkt die gesunde, nicht geladenes Modell →
model_unavailable ohne content. Wrapper als Docker-Container gegen das
offizielle OpenAI-SDK: models.list, create mit/ohne stream, NotFoundError,
AuthenticationError. Das Doku-Beispiel lief unveraendert (nur Adresse).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
83 lines
4.4 KiB
Bash
83 lines
4.4 KiB
Bash
# ════════════════════════════════════════════════
|
|
# ARIA — Umgebungsvariablen
|
|
# Kopieren nach .env und Werte eintragen
|
|
# ════════════════════════════════════════════════
|
|
|
|
# ── ARIA Auth Token ──────────────────────────────
|
|
# Authentifizierung fuer den OpenClaw Gateway (aria-core).
|
|
# Wird von Diagnostic, Bridge und App genutzt um sich am Gateway anzumelden.
|
|
# Alle Services die mit aria-core kommunizieren brauchen diesen Token.
|
|
# Generieren: openssl rand -hex 32
|
|
ARIA_AUTH_TOKEN=change-me-to-a-long-random-string
|
|
|
|
# ── RVS — Rendezvous-Server ─────────────────────
|
|
# Der RVS ist ein WebSocket-Relay im Rechenzentrum.
|
|
# App, Bridge, Diagnostic und XTTS-Bridge verbinden sich hierueber.
|
|
# Alle muessen den gleichen Host, Port und Token nutzen.
|
|
|
|
# Hostname des RVS-Servers (z.B. rvs.example.de oder example.com)
|
|
# WICHTIG: muss oeffentlich aufloesbar sein (DNS), nicht nur intern.
|
|
# Wird auch fuer OAuth-Callback-URLs verwendet — Spotify/Google/etc.
|
|
# redirecten Stefan im Browser an https://{RVS_HOST}/oauth/callback/{service}.
|
|
RVS_HOST=rvs.example.de
|
|
|
|
# Port auf dem der RVS laeuft (muss mit rvs/docker-compose.yml uebereinstimmen)
|
|
RVS_PORT=443
|
|
|
|
# Oeffentlich erreichbarer TLS-Port — was Browser/Provider von aussen sehen.
|
|
# Meist identisch mit RVS_PORT, kann aber abweichen wenn ein TLS-Terminator
|
|
# (Caddy/Nginx) davor steht der z.B. 444 auf intern 3000 mappt. Wird fuer
|
|
# die OAuth-Callback-URL benutzt; muss zu dem Eintrag im Provider-Dashboard
|
|
# passen. Leer/ungesetzt = RVS_PORT wird verwendet.
|
|
RVS_PORT_PUBLIC=
|
|
|
|
# TLS (wss://) verwenden? true = verschluesselt, false = unverschluesselt (ws://)
|
|
RVS_TLS=true
|
|
|
|
# Bei TLS-Fehler automatisch auf ws:// (ohne TLS) fallback?
|
|
# Nuetzlich wenn kein TLS-Zertifikat vorhanden (z.B. Entwicklung)
|
|
RVS_TLS_FALLBACK=true
|
|
|
|
# Pairing-Token: Wer den gleichen Token hat, landet im gleichen RVS-Room.
|
|
# Wird von generate-token.sh automatisch generiert und hier eingetragen.
|
|
# Die Android App bekommt den Token per QR-Code beim Pairing.
|
|
# WICHTIG: Muss auf ARIA-VM, Gaming-PC (xtts/.env) und App identisch sein!
|
|
# Generieren: ./generate-token.sh (traegt den Token automatisch ein)
|
|
RVS_TOKEN=
|
|
|
|
# ── Brain-Timeouts ───────────────────────────────
|
|
# Brain redet via HTTP mit dem Proxy-Container. Da der Proxy non-streaming
|
|
# antwortet (Response kommt erst nach subprocess-close), kann ein Brain-Call
|
|
# bei langen Agent-Sessions (Pentests, Multi-Step-Tasks) >1h dauern.
|
|
# PROXY_TIMEOUT_SEC ist der httpx-Read-Timeout im Brain — wir setzen ihn
|
|
# bewusst hoch (24h), der Proxy hat einen eigenen Idle-Watchdog
|
|
# (ARIA_IDLE_TIMEOUT_MS in der proxy-Logik, default 20min Inaktivitaet)
|
|
# der den Subprocess killt wenn wirklich was haengt.
|
|
# Connect/Write/Pool bleiben klein damit toter Proxy in 10s erkannt wird.
|
|
PROXY_TIMEOUT_SEC=86400
|
|
# Diese drei sind defensive Defaults — aendern nur wenn netzwerk-bedingt noetig.
|
|
# PROXY_CONNECT_TIMEOUT_SEC=10
|
|
# PROXY_WRITE_TIMEOUT_SEC=30
|
|
# PROXY_POOL_TIMEOUT_SEC=10
|
|
|
|
# ── Gitea — Release-Verwaltung ───────────────────
|
|
# Wird von release.sh genutzt um APKs auf Gitea zu veroeffentlichen.
|
|
# Kennwort wird beim Release interaktiv abgefragt (nicht in .env!).
|
|
GITEA_URL=https://git.hacker-net.de
|
|
GITEA_REPO=Hacker-Software/ARIA-AGENT
|
|
GITEA_USER=duffyduck
|
|
|
|
# ── Auto-Update — APK auf RVS-Server kopieren ───
|
|
# SSH-Ziel fuer scp: release.sh kopiert die APK dorthin.
|
|
# Der RVS-Server stellt sie dann per WebSocket an die App bereit.
|
|
# Format: user@host (z.B. root@aria-rvs oder root@rvs.example.de)
|
|
# Leer lassen = Auto-Update ueberspringen, APK manuell auf RVS kopieren.
|
|
RVS_UPDATE_HOST=
|
|
|
|
# ── LLM-Cluster ───────────────────────────────────────────────────────
|
|
# Die ARIA-Bridge verteilt Anfragen an die lokalen Modelle aller KI-Boxen
|
|
# (llm_cluster_* ueber RVS). Wie lange sie auf eine Antwort wartet, bevor sie
|
|
# eine andere Box versucht bzw. aufgibt:
|
|
#CLUSTER_LLM_TIMEOUT_S=600
|
|
# OpenAI-kompatible Programme (OpenHands & Co.): xtts/openai_rvs_wrapper
|