# Nelloz – hier starten

Dieser Ordner ist die neue, getrennte Nelloz-Version. Die internen OMNI-Protokollnamen
bleiben aus Kompatibilitätsgründen bestehen. Die alte Demo unter
`work/MiniCPM-o-Demo-main` wurde nicht verändert.

## NPM-Vorabpakete

Das installierbare, noch unveröffentlichte Nelloz-Paket und seine vollständigen
Befehle stehen in [NPM_INSTALL.md](NPM_INSTALL.md):

- `nelloz` / Befehl `nelloz` für Main-Computer und weitere UI-Computer;
- Server-Funktionen laufen über Cloudflare; eine lokale Server-npm-Distribution
  wird nicht mehr verteilt.

Die fertigen `.tgz`-Dateien liegen unter `npm-packages/dist/`.

## Was fertig ist

- Sichtbar ist nur ein heller grün-weißer Orb auf Schwarz.
- Der Orb folgt in Echtzeit sowohl dem Mikrofonpegel als auch der
  MiniCPM-Sprachausgabe.
- MiniCPM-o 4.5 bleibt die einzige hörbare Gesprächsinstanz und behält seinen
  laufenden Full-Duplex-Kontext, auch wenn ein Tool-Ergebnis zurückkommt.
- Ein schneller lokaler ASR-Sidetap erkennt Werkzeugabsichten, ohne den nativen
  Audio-/Video-Pfad von MiniCPM zu verlangsamen.
- Hermes und Qwen übernehmen Computer, Code, Dateien und Websuche. Vor einer
  Delegation sagt MiniCPM kurz „Warte kurz“; das Ergebnis kommt danach mit
  derselben MiniCPM-Stimme zurück.
- Der Main-PC und weitere OMNI-PCs können als benannte mTLS-Knoten gepaart
  werden. Jeder Knoten kann – nach expliziter Freigabe – Qwen/Hermes, Bildschirm,
  Maus/Tastatur, Dateien und seine eigene Webcam anbieten.

## Die vier Gesten

| Geste am Orb | Wirkung |
| --- | --- |
| kurz tippen | Live-Gespräch starten bzw. beenden |
| nach oben ziehen | weiße Texteingabe öffnen |
| halten | Mikrofon wirklich stumm/an; der Orb wird rot |
| nach links ziehen | lokale Kamera an/aus |
| nach rechts ziehen | nächste Eingabe an den Agenten; laufenden Agenten abbrechen |
| nach unten ziehen | ganze Live-Sitzung beenden |

## Hardwareentscheidung

Für dieses Echtzeitziel ist **eine MI300X** das vorgesehene Profil. Die zwölf
MI50 sind zwölf getrennte 16-GB-Speicher und kein gemeinsamer 192-GB-Pool; zudem
gehört MI50 nicht zum aktuellen unterstützten ROCm-Ziel dieser Konfiguration.
OMNI wählt sie deshalb nie automatisch und verspricht darauf keine
Echtzeitlatenz.

Die Zusatzpipeline ist für MI300X/ROCm vorbereitet. Wichtig: Die offizielle
MiniCPM-o-Demo beschreibt ihren präzisen lokalen Full-Duplex-Pfad weiterhin
primär für NVIDIA/CUDA. Der hier vorbereitete AMD-Pfad muss deshalb einmal auf
der konkreten MI300X mit den tatsächlich gebauten Images und Gewichten live
abgenommen werden; dieser Ordner behauptet keine ungeprüfte AMD-Modellparität.

## 1. Lokale Werte setzen

Nichts wird automatisch heruntergeladen. Es müssen bereits lokale
Container-Images und Checkpoints vorhanden sein.

```powershell
Copy-Item .\config\omni.env.example .\.env
```

Dann in `.env` mindestens alle leeren Werte, absoluten Modellpfade, unveränderlichen
Revisionen und drei voneinander verschiedenen Schlüssel ausfüllen:

- `OMNI_CONDUCTOR_TOKEN`
- `QWEN_API_KEY`
- `HERMES_API_KEY` – identisch zu Hermes `API_SERVER_KEY`

Fehlende lokale Dateien, Revisionen oder Schlüssel führen absichtlich zu einem
Startfehler statt zu einem Download oder unsicheren Fallback.

## 2. Qwen einmal lokal attestieren

Der Helfer liest nur kleine Metadaten und startet weder vLLM noch das Modell:

```powershell
python .\scripts\qwen_attest.py `
  --model-path D:\Modelle\Qwen3.8-27B `
  --model-id Qwen/Qwen3.8-27B `
  --revision <40-stelliger-verifizierter-Commit>
```

Den ausgegebenen SHA-256-Wert in `QWEN_CHECKPOINT_MANIFEST_SHA256` übernehmen.
`auto` verwendet natives MTP mit genau einem Spekulationstoken nur dann, wenn
der konkrete Checkpoint den echten MTP-Head samt Gewichten enthält. Sonst läuft
Qwen normal autoregressiv. DFlash2 bleibt aus, bis es auf genau dieser MI300X
gegen Qualität, Tool-JSON und p95-Latenz bestanden hat.

## 3. Hermes konfigurieren

Die Inhalte von `config/hermes.example.yaml` und
`config/hermes.env.example` in die entsprechende `~/.hermes/`-Konfiguration
übernehmen. `OMNI_ROOT` ist dabei der absolute Pfad zu diesem `outputs/OMNI`-
Ordner aus Sicht des Hermes-Prozesses. Danach:

```powershell
hermes gateway
```

Die Vorlage verbindet Hermes mit Qwen auf Loopback und registriert den
mitgelieferten `omni_windows`-MCP. Damit sind Bildschirm, Computer, Dateien und
Webcam echte Hermes-Werkzeuge. Der statische Bridge-Schlüssel allein reicht
nicht: Jeder Aufruf braucht zusätzlich den vom gepaarten Node-Gateway erzeugten,
kurzlebigen Run-Ticket.

## 4. Main-PC und weitere PCs paaren

Auf **jedem** Rechner mit Windows-Fähigkeiten läuft derselbe Companion. Für den
Main-PC gilt derselbe sichere Weg wie für einen externen Rechner; so erhält ein
entfernter Auftrag niemals heimlich lokale Rechte.

Der vollständige, ausführbare Ablauf für Offline-PKI, Zertifikatstransfer,
Einmalcode, SAS-Abgleich, Companion-Start, sichtbare Kameraanzeige und
Not-Aus steht in [desktop/windows/README.md](desktop/windows/README.md).

Wesentliche Regeln:

- kein Netzwerkscan und kein automatisches Vertrauen;
- mDNS zeigt nur Kandidaten, es paart niemanden;
- exakter gesprochener Rechnername wählt genau diesen gepaarten Knoten;
- Webcam startet nur mit passendem Geräte-Grant und sichtbarer lokaler Anzeige;
- fällt die Anzeige aus, wird die Kamera innerhalb des 100-ms-Watchdogs beendet;
- `Ctrl+Alt+Shift+Esc` ist der physische Not-Aus des Windows-Companions.

Erst nach abgeschlossenem Pairing auf dem Conductor setzen:

```text
OMNI_REMOTE_NODES_ENABLED=1
```

Discovery bleibt unabhängig davon aus, sofern sie nicht ausdrücklich benötigt
wird. Bereits gepaarte Knoten bleiben bei `OMNI_REMOTE_NODES_ENABLED=0` gesperrt.

## 5. Prüfen und bewusst starten

Die Offline-Prüfung öffnet keinen Socket und lädt kein Modell:

```powershell
python .\scripts\verify_pipeline.py --json
docker compose -f .\docker-compose.pipeline.yml `
  -f .\docker-compose.rocm-mi300x.yml config --quiet
```

Erst danach die gewünschten Profile bewusst starten:

```powershell
docker compose -f .\docker-compose.pipeline.yml `
  -f .\docker-compose.rocm-mi300x.yml `
  --profile core --profile minicpm --profile tools `
  --profile video --profile image up -d
```

Die Medien-Endpunkte laufen dabei leichtgewichtig; H3 und Hunyuan laden ihre
Gewichte erst beim ersten Auftrag. Nach dem Start
öffnet sich OMNI unter:

```text
http://127.0.0.1:8006/
```

Auf `localhost` dürfen Browser Mikrofon und Kamera verwenden. Bei Zugriff von
einem anderen Gerät ist HTTPS erforderlich.

## Relevante Details

- Gesamtpipeline und Latenzentscheidungen: [docs/omni-pipeline.md](docs/omni-pipeline.md)
- Qwen/MTP/DFlash2: [docs/qwen-runtime-launcher.md](docs/qwen-runtime-launcher.md)
- lokales ASR: [asr_service/README.md](asr_service/README.md)
- sichere Windows-/Remote-Knoten: [desktop/windows/README.md](desktop/windows/README.md)

## Stand dieser Übergabe

Quellcode, Verträge, Browseroberfläche, Mock-Dienste, Pairing, MCP-Handshake und
Offline-Routing wurden ohne Modellstart geprüft. Es wurden keine Gewichte
heruntergeladen und keine echte Kamera, Maus oder Tastatur angesteuert. Die
noch notwendige reale Abnahme ist der Start mit deinen exakten lokalen Images,
Checkpoints und der MI300X.
