diff --git a/bridge/aria_bridge.py b/bridge/aria_bridge.py
index f43e53b..e08833b 100644
--- a/bridge/aria_bridge.py
+++ b/bridge/aria_bridge.py
@@ -505,7 +505,7 @@ class ARIABridge:
if k in vc:
self._f5tts_config[k] = vc[k]
# FLUX-Felder (Default-Modell + Keywords) gleicher Mechanismus
- for k in ("fluxDefaultModel", "fluxKeywordRaw", "fluxKeywordSwitch"):
+ for k in ("fluxDefaultModel", "fluxKeywordRaw", "fluxKeywordSwitch", "huggingfaceToken"):
if k in vc:
self._flux_config[k] = vc[k]
logger.info("Voice-Config geladen: tts=%s voice=%s f5tts=%s flux=%s",
@@ -1786,7 +1786,7 @@ class ARIABridge:
# FLUX-Felder: gleiche Logik wie F5-TTS. flux-bridge applied
# fluxDefaultModel selbst (Pipeline-Swap). Keywords nutzt Brain
# via /shared/config/voice_config.json.
- for k in ("fluxDefaultModel", "fluxKeywordRaw", "fluxKeywordSwitch"):
+ for k in ("fluxDefaultModel", "fluxKeywordRaw", "fluxKeywordSwitch", "huggingfaceToken"):
if k in payload:
if not hasattr(self, "_flux_config"):
self._flux_config = {}
diff --git a/diagnostic/index.html b/diagnostic/index.html
index 5078fc0..29580c5 100644
--- a/diagnostic/index.html
+++ b/diagnostic/index.html
@@ -642,6 +642,21 @@
placeholder="fix"
style="background:#1E1E2E;color:#fff;border:1px solid #2A2A3E;border-radius:6px;padding:6px 10px;font-size:13px;">
+
+ HuggingFace-Token (nur fuer FLUX.1-dev — gated Modell, Lizenz-Bestaetigung).
+ Wird per RVS an die flux-bridge gepusht. Leer = kein Token (Schnell-Modell laeuft auch ohne).
+
+
+
+ 👁
+
+
+
Anwenden
@@ -1388,6 +1403,7 @@
setIfPresent('diag-flux-default-model', msg.fluxDefaultModel);
setIfPresent('diag-flux-keyword-raw', msg.fluxKeywordRaw);
setIfPresent('diag-flux-keyword-switch', msg.fluxKeywordSwitch);
+ setIfPresent('diag-flux-hf-token', msg.huggingfaceToken);
return;
}
@@ -2706,12 +2722,13 @@
const fluxDefaultModel = document.getElementById('diag-flux-default-model')?.value || undefined;
const fluxKeywordRaw = document.getElementById('diag-flux-keyword-raw')?.value;
const fluxKeywordSwitch = document.getElementById('diag-flux-keyword-switch')?.value;
+ const huggingfaceToken = document.getElementById('diag-flux-hf-token')?.value;
send({
action: 'send_voice_config',
ttsEnabled, xttsVoice, whisperModel,
f5ttsModel, f5ttsCkptFile, f5ttsVocabFile,
f5ttsCfgStrength, f5ttsNfeStep,
- fluxDefaultModel, fluxKeywordRaw, fluxKeywordSwitch,
+ fluxDefaultModel, fluxKeywordRaw, fluxKeywordSwitch, huggingfaceToken,
});
const statusEl = document.getElementById('voice-status');
if (statusEl && xttsVoice) {
diff --git a/diagnostic/server.js b/diagnostic/server.js
index 24d998b..dafdb45 100644
--- a/diagnostic/server.js
+++ b/diagnostic/server.js
@@ -1957,6 +1957,14 @@ wss.on("connection", (ws) => {
if (msg.fluxKeywordSwitch !== undefined) {
voiceConfig.fluxKeywordSwitch = String(msg.fluxKeywordSwitch || "").trim().toLowerCase() || "fix";
}
+ // HuggingFace-Token fuer gated FLUX.1-dev. Wird per RVS an die
+ // flux-bridge gepusht, dort als HF_TOKEN env gesetzt vor dem
+ // naechsten from_pretrained. Leerer String = "kein Token" (statt
+ // 'behalt was du hattest'), damit Stefan ihn auch wieder loeschen
+ // kann.
+ if (msg.huggingfaceToken !== undefined) {
+ voiceConfig.huggingfaceToken = String(msg.huggingfaceToken || "").trim();
+ }
try {
fs.mkdirSync("/shared/config", { recursive: true });
fs.writeFileSync("/shared/config/voice_config.json", JSON.stringify(voiceConfig, null, 2));
diff --git a/flux/.env.example b/flux/.env.example
index 5ad2e63..17bb674 100644
--- a/flux/.env.example
+++ b/flux/.env.example
@@ -10,23 +10,16 @@ RVS_TLS=true
RVS_TLS_FALLBACK=true
RVS_TOKEN=dein_token_hier
-# HuggingFace-Token — NUR noetig wenn Du FLUX.1-dev nutzen willst.
-# FLUX.1-dev ist auf HuggingFace 'gated' (= Du musst dort auf der
-# Modell-Seite einmalig "Agree" klicken und beim Download wird Dein
-# Login geprueft). Reine Lizenz-Sache — die Inference laeuft danach
-# komplett lokal, kein Netz, keine Telemetrie.
+# HuggingFace-Token + Default-Modell werden in ARIA Diagnostic verwaltet
+# (Section "FLUX Bildgenerierung") und per RVS an die flux-bridge gepusht.
+# Hier nichts noetig.
#
-# Wenn Du nur FLUX.1-schnell nutzt (Apache-2.0, kein Gate), kannst Du
-# das Feld leer lassen. Falls Du spaeter dev aktivierst:
+# Token-Pflicht NUR fuer FLUX.1-dev (gated). Workflow falls Du dev nutzen
+# willst:
# 1) https://huggingface.co/black-forest-labs/FLUX.1-dev → "Agree"
# 2) https://huggingface.co/settings/tokens → "Read"-Token erzeugen
-# 3) Hier eintragen + docker compose restart flux-bridge
-HF_TOKEN=
-
-# Welches Modell beim Startup geladen wird, steuert ARIA selbst:
-# Diagnostic > FLUX > Default-Modell. Solange dort nichts gewaehlt ist,
-# laedt die flux-bridge erstmal nichts — sie wartet auf den ersten
-# Render-Request oder einen Diagnostic-config-Broadcast.
+# 3) Token in Diagnostic > FLUX Bildgenerierung > HuggingFace-Token
+# FLUX.1-schnell (Apache-2.0) laeuft ohne Token.
# Offloading-Strategie (VRAM-Steuerung):
# model — Default. Komponentenweise CPU-Offload, gut fuer 12 GB Karten.
diff --git a/flux/bridge.py b/flux/bridge.py
index 36d2b83..9b2ef94 100644
--- a/flux/bridge.py
+++ b/flux/bridge.py
@@ -509,8 +509,19 @@ async def run_loop(runner: FluxRunner) -> None:
await _flux_queue.put(payload)
elif mtype == "config":
# Diagnostic-Broadcast (oder aria-bridge nach Reconnect).
- # Wir interessieren uns nur fuer fluxDefaultModel — die
- # Keywords nutzt das Brain, nicht wir.
+ # HuggingFace-Token MUSS vor dem Modell-Swap gesetzt sein,
+ # weil FluxPipeline.from_pretrained den Token aus der env
+ # liest. Reihenfolge im selben Tick gewaehrleistet das.
+ if "huggingfaceToken" in payload:
+ tok = (payload.get("huggingfaceToken") or "").strip()
+ if tok:
+ os.environ["HF_TOKEN"] = tok
+ os.environ["HUGGING_FACE_HUB_TOKEN"] = tok
+ logger.info("[config] HF-Token gesetzt (len=%d)", len(tok))
+ else:
+ os.environ.pop("HF_TOKEN", None)
+ os.environ.pop("HUGGING_FACE_HUB_TOKEN", None)
+ logger.info("[config] HF-Token entfernt (leerer Wert)")
tag = (payload.get("fluxDefaultModel") or "").strip()
if tag:
asyncio.create_task(_apply_default_change(tag))
diff --git a/flux/docker-compose.yml b/flux/docker-compose.yml
index c516cfe..690b935 100644
--- a/flux/docker-compose.yml
+++ b/flux/docker-compose.yml
@@ -19,16 +19,13 @@
services:
- # ─── FLUX.1-dev Bildgenerierung (GPU) ─────────
- # Empfaengt flux_request via RVS, rendert PNG mit FLUX.1-dev (12B Params)
+ # ─── FLUX Bildgenerierung (GPU) ─────────
+ # Empfaengt flux_request via RVS, rendert PNG mit FLUX (12B Params)
# und broadcastet flux_response mit base64-PNG zurueck. aria-bridge speichert
# die Datei nach /shared/uploads/ und ARIA referenziert sie via [FILE:]-Marker.
#
- # Modell-Wahl per FLUX_MODEL:
- # - black-forest-labs/FLUX.1-dev (Default, 28 Steps, non-commercial)
- # - black-forest-labs/FLUX.1-schnell (4 Steps, Apache-2.0, schneller)
- # HuggingFace-Token noetig fuer FLUX.1-dev — vorher `huggingface-cli login`
- # oder HF_TOKEN in .env setzen, sonst 403 beim ersten Download.
+ # Modell-Wahl + HuggingFace-Token werden in ARIA Diagnostic eingestellt
+ # ("FLUX Bildgenerierung") und per RVS gepusht — hier nichts noetig.
flux-bridge:
build: .
container_name: aria-flux-bridge
@@ -45,13 +42,13 @@ services:
- RVS_TLS=${RVS_TLS:-true}
- RVS_TLS_FALLBACK=${RVS_TLS_FALLBACK:-true}
- RVS_TOKEN=${RVS_TOKEN}
- - FLUX_MODEL=${FLUX_MODEL:-black-forest-labs/FLUX.1-dev}
+ # Hardware-Bootstrap (Diagnostic-Settings uebersteuern alles andere
+ # zur Laufzeit — diese envs sind nur Edge-Case-Fallbacks).
- FLUX_DEVICE=${FLUX_DEVICE:-cuda}
- FLUX_DTYPE=${FLUX_DTYPE:-bfloat16}
- FLUX_OFFLOAD=${FLUX_OFFLOAD:-model}
- FLUX_MAX_STEPS=${FLUX_MAX_STEPS:-50}
- FLUX_MAX_DIM=${FLUX_MAX_DIM:-1536}
- - HF_TOKEN=${HF_TOKEN:-} # FLUX.1-dev braucht Login-Token
volumes:
- ./hf-cache:/root/.cache/huggingface # Bind-Mount. FLUX.1-dev ~24 GB on disk!
# Wenn flux auf der gleichen Maschine