diff --git a/BEDIENUNGSANLEITUNG.md b/BEDIENUNGSANLEITUNG.md index dc26e24..84c6502 100644 --- a/BEDIENUNGSANLEITUNG.md +++ b/BEDIENUNGSANLEITUNG.md @@ -52,7 +52,7 @@ der Judge kritisiert direkt und konkret, der Coder repariert ohne Widerspruch. ```bash cd ~/pi_coder -./start-single.sh +./start-coding-server.sh ``` Ausgabe bei Erfolg: @@ -95,8 +95,8 @@ pi Der Server läuft standardmäßig auf **GPU 1** (überschreibbar): ```bash -./start-single.sh # GPU 1 (Standard) -GPU_DEVICE=0 ./start-single.sh # GPU 0 +./start-coding-server.sh # GPU 1 (Standard) +GPU_DEVICE=0 ./start-coding-server.sh # GPU 0 ``` Auf einem System mit mehreren GPUs empfiehlt es sich, GPU 0 (Display) freizuhalten @@ -112,7 +112,7 @@ nvidia-smi --query-gpu=index,name,memory.used,memory.free --format=csv ```bash cd ~/pi_coder -./start-single.sh +./start-coding-server.sh ``` Erwartete Ausgabe: @@ -127,7 +127,7 @@ Dauer: bis zu 5 Minuten. Danach ist das Modell im VRAM und sofort antwortbereit. ### Server stoppen ```bash -./stop-servers.sh +./stop-coding-server.sh ``` ### Status prüfen @@ -141,7 +141,7 @@ Dauer: bis zu 5 Minuten. Danach ist das Modell im VRAM und sofort antwortbereit. Falls die GGUF-Datei an einem anderen Ort liegt: ```bash -HF_HOME=/mnt/daten/huggingface ./start-single.sh +HF_HOME=/mnt/daten/huggingface ./start-coding-server.sh ``` --- @@ -856,7 +856,7 @@ Die Checkboxen werden automatisch abgehakt: ls $HF_HOME/models/qwen3/ # Oder mit explizitem Pfad starten: -HF_HOME=/korrekter/pfad ./start-single.sh +HF_HOME=/korrekter/pfad ./start-coding-server.sh ``` ### Server startet nicht / HTTP nicht erreichbar @@ -872,7 +872,7 @@ HF_HOME=/korrekter/pfad ./start-single.sh docker logs coding_model | tail -50 # Suche nach: "CUDA out of memory" oder "failed to allocate" ``` - → Kontext reduzieren: `-c 65536` statt `-c 262144` in `start-single.sh` + → Kontext reduzieren: `-c 65536` statt `-c 262144` in `start-coding-server.sh` 2. GPU nicht verfügbar: ```bash @@ -880,15 +880,15 @@ HF_HOME=/korrekter/pfad ./start-single.sh # GPU 1 testen: docker run --gpus '"device=1"' --rm nvidia/cuda:12.0-base nvidia-smi # Andere GPU testen: - GPU_DEVICE=0 ./start-single.sh + GPU_DEVICE=0 ./start-coding-server.sh ``` 3. Port 8001 bereits belegt: ```bash ss -tlnp | grep 8001 docker ps -a # alter Container noch vorhanden? - ./stop-servers.sh - ./start-single.sh + ./stop-coding-server.sh + ./start-coding-server.sh ``` ### "Agent is already processing a prompt" diff --git a/README.md b/README.md index 8236080..b6889e4 100644 --- a/README.md +++ b/README.md @@ -63,11 +63,11 @@ dasselbe Modell, derselbe Container, unterschiedliche Persona. sudo systemctl restart docker ``` - NVIDIA-GPU: empfohlen RTX 3090 (24 GB VRAM). Standard: GPU 1. Überschreibbar mit - `GPU_DEVICE=0 ./start-single.sh`. Bei 3 GPUs: GPU 0 für Display reservieren. + `GPU_DEVICE=0 ./start-coding-server.sh`. Bei 3 GPUs: GPU 0 für Display reservieren. - GGUF-Modell vorhanden unter: `$HF_HOME/models/qwen3/Qwen3.6-27B-Uncensored-HauhauCS-Aggressive-IQ4_XS.gguf` - Standard-Pfad: `HF_HOME=/home/dschlueter/nvme2n1p7_home/huggingface` - - Überschreibbar: `HF_HOME=/anderer/pfad ./start-single.sh` + - Überschreibbar: `HF_HOME=/anderer/pfad ./start-coding-server.sh` - [pi agent](https://github.com/earendil-works/pi) installiert (`~/.pi/`) --- @@ -86,7 +86,7 @@ cd ~/pi_coder # /reload # 4. Server starten -./start-single.sh +./start-coding-server.sh ``` Das Install-Skript sichert eine vorhandene `~/.pi/agent/settings.json` als `.bak` und @@ -105,23 +105,23 @@ Nach späteren Änderungen an `pi-coder-judge-extension.ts` oder `models.json`: ```bash # Server starten (empfohlen — dauert 1–3 Minuten) -./start-single.sh +./start-coding-server.sh # Server auf anderer GPU starten -GPU_DEVICE=0 ./start-single.sh +GPU_DEVICE=0 ./start-coding-server.sh # Stoppen -./stop-servers.sh +./stop-coding-server.sh # Status prüfen ./status.sh ``` -`start-single.sh` startet den Container und wartet bis HTTP-ready (max. 5 Minuten — die +`start-coding-server.sh` startet den Container und wartet bis HTTP-ready (max. 5 Minuten — die neue llama.cpp-Version prüft beim Start, ob Modell + KV-Cache in den VRAM passen, was zusätzliche Zeit kostet). -Wenn der Server bereits läuft und du `start-single.sh` aufrufst, wird der laufende +Wenn der Server bereits läuft und du `start-coding-server.sh` aufrufst, wird der laufende Container zuerst per `docker rm -f` gestoppt und dann neu gestartet — ein laufender Inference-Request wird dabei abgebrochen. @@ -149,7 +149,7 @@ Inference-Request wird dabei abgebrochen. | `-n 16384` | 16K | Maximale Ausgabelänge. | | `--temp 0.2` | — | Deterministisch — Coder-Rolle. Der Judge-System-Prompt gleicht die etwas höhere Temperatur aus. | | `--parallel 2` | — | 2 Slots, damit pi agent Folgeanfragen schnell hintereinander stellen kann. | -| `--gpus '"device=1"'` | — | Standard: GPU 1. Überschreibbar: `GPU_DEVICE=0 ./start-single.sh`. | +| `--gpus '"device=1"'` | — | Standard: GPU 1. Überschreibbar: `GPU_DEVICE=0 ./start-coding-server.sh`. | --- @@ -184,16 +184,16 @@ dürfen nennenswert VRAM belegen (z. B. TTS-Dienste, Ollama). Prüfen mit: nvidia-smi --query-gpu=index,memory.used,memory.free --format=csv ``` -Falls der VRAM nicht reicht: Kontext in `start-single.sh` auf `131072` oder `65536` reduzieren. +Falls der VRAM nicht reicht: Kontext in `start-coding-server.sh` auf `131072` oder `65536` reduzieren. ### Anpassung für andere GPU-Konfigurationen ```bash # Andere GPU verwenden: -GPU_DEVICE=0 ./start-single.sh +GPU_DEVICE=0 ./start-coding-server.sh # 2 GPUs für einen Server (sehr großer Kontext): -# start-single.sh anpassen: +# start-coding-server.sh anpassen: --gpus '"device=0,1"' \ --tensor-split 0.5,0.5 \ --main-gpu 0 \ @@ -253,8 +253,8 @@ und Extension-Guards gegen Regressionen. | `settings.json` | pi-agent-Settings (Default-Modell, aktivierte Modelle) — wird von Install-Skript deployt | | `run-tests.sh` | Tests ausführen | | `tests/` | Testdateien (pure-logic, config, extension-guards, scripts) | -| `start-single.sh` | Single-Server starten (Port 8001, Coder + Judge) | -| `stop-servers.sh` | Container stoppen | +| `start-coding-server.sh` | Single-Server starten (Port 8001, Coder + Judge) | +| `stop-coding-server.sh` | Container stoppen | | `status.sh` | Laufstatus anzeigen | | `install_servers_and_pi_coder_extension.sh` | Extension + models.json + settings.json nach `~/.pi/agent/` deployen | | `examples/` | Demo-Projekte (Python, Rust, Go, C, Bash, HTML/JS) für Live-Demos | diff --git a/pi-coder-judge-extension.ts b/pi-coder-judge-extension.ts index b170b35..8e8e9fc 100644 --- a/pi-coder-judge-extension.ts +++ b/pi-coder-judge-extension.ts @@ -1072,7 +1072,7 @@ export default function (pi: ExtensionAPI) { return; } if (!await waitUntilModelReady(pi, ctx, 8001, "coding_model")) { - ctx.ui.notify("Server nicht bereit (Port 8001) — start-single.sh ausführen", "error"); + ctx.ui.notify("Server nicht bereit (Port 8001) — start-coding-server.sh ausführen", "error"); return; } await writeTaskMd(pi, ctx, task); @@ -1086,7 +1086,7 @@ export default function (pi: ExtensionAPI) { description: "Review gegen TASK.md + git show HEAD → Judge-Rolle (:8001).", handler: async function (args: string, ctx: ExtensionCommandContext) { if (!await waitUntilModelReady(pi, ctx, 8001, "coding_model")) { - ctx.ui.notify("Server nicht bereit (Port 8001) — start-single.sh ausführen", "error"); + ctx.ui.notify("Server nicht bereit (Port 8001) — start-coding-server.sh ausführen", "error"); return; } await selectRole(pi, ctx, "judge"); @@ -1099,7 +1099,7 @@ export default function (pi: ExtensionAPI) { description: "Fixt Judge-Kritik, committet Ergebnis → Coder-Rolle (:8001).", handler: async function (args: string, ctx: ExtensionCommandContext) { if (!await waitUntilModelReady(pi, ctx, 8001, "coding_model")) { - ctx.ui.notify("Server nicht bereit (Port 8001) — start-single.sh ausführen", "error"); + ctx.ui.notify("Server nicht bereit (Port 8001) — start-coding-server.sh ausführen", "error"); return; } await selectRole(pi, ctx, "coder"); @@ -1112,7 +1112,7 @@ export default function (pi: ExtensionAPI) { description: "Finale Freigabe gegen TASK.md + git log → Judge-Rolle (:8001).", handler: async function (args: string, ctx: ExtensionCommandContext) { if (!await waitUntilModelReady(pi, ctx, 8001, "coding_model")) { - ctx.ui.notify("Server nicht bereit (Port 8001) — start-single.sh ausführen", "error"); + ctx.ui.notify("Server nicht bereit (Port 8001) — start-coding-server.sh ausführen", "error"); return; } await selectRole(pi, ctx, "judge"); @@ -1178,7 +1178,7 @@ export default function (pi: ExtensionAPI) { ctx.ui.setStatus("optimize", "Single-Server wird geprüft (Port 8001)…"); const serverReady = await waitUntilModelReady(pi, ctx, 8001, "coding_model"); if (!serverReady) { - finalNotify(ctx, "⛔ Server nicht erreichbar", "Port 8001 — kein HTTP 200 nach 3 min. start-single.sh ausführen"); + finalNotify(ctx, "⛔ Server nicht erreichbar", "Port 8001 — kein HTTP 200 nach 3 min. start-coding-server.sh ausführen"); return; } } else { @@ -1203,7 +1203,7 @@ export default function (pi: ExtensionAPI) { // echten Completion-Request bedeutet: Modell ist im VRAM und bereit. ctx.ui.setStatus("optimize", "Single-Server wird geprüft…"); if (!await waitUntilModelReady(pi, ctx, 8001, "coding_model")) { - finalNotify(ctx, "⛔ Server nicht erreichbar", "Port 8001 — kein HTTP 200 nach 3 min. start-single.sh ausführen"); + finalNotify(ctx, "⛔ Server nicht erreichbar", "Port 8001 — kein HTTP 200 nach 3 min. start-coding-server.sh ausführen"); return; } } @@ -1409,7 +1409,7 @@ export default function (pi: ExtensionAPI) { return; } if (!await waitUntilModelReady(pi, ctx, 8001, "coding_model")) { - ctx.ui.notify("Server nicht bereit (Port 8001) — start-single.sh ausführen", "error"); + ctx.ui.notify("Server nicht bereit (Port 8001) — start-coding-server.sh ausführen", "error"); return; } await selectRole(pi, ctx, "coder"); @@ -1422,7 +1422,7 @@ export default function (pi: ExtensionAPI) { description: "Schnelle OK/PROBLEM-Prüfung einer kleinen Codeänderung → Judge-Rolle (:8001).", handler: async function (args: string, ctx: ExtensionCommandContext) { if (!await waitUntilModelReady(pi, ctx, 8001, "coding_model")) { - ctx.ui.notify("Server nicht bereit (Port 8001) — start-single.sh ausführen", "error"); + ctx.ui.notify("Server nicht bereit (Port 8001) — start-coding-server.sh ausführen", "error"); return; } await selectRole(pi, ctx, "judge"); @@ -1490,7 +1490,7 @@ export default function (pi: ExtensionAPI) { return; } if (!await waitUntilModelReady(pi, ctx, 8001, "coding_model")) { - ctx.ui.notify("Server nicht bereit (Port 8001) — start-single.sh ausführen", "error"); + ctx.ui.notify("Server nicht bereit (Port 8001) — start-coding-server.sh ausführen", "error"); return; } await writeTaskMd(pi, ctx, task); @@ -1572,7 +1572,7 @@ export default function (pi: ExtensionAPI) { // Standard-Verhalten: unterbrochenen Prozess wieder aufnehmen if (!await waitUntilModelReady(pi, ctx, 8001, "coding_model")) { - ctx.ui.notify("Server nicht bereit (Port 8001) — start-single.sh ausführen", "error"); + ctx.ui.notify("Server nicht bereit (Port 8001) — start-coding-server.sh ausführen", "error"); return; } await selectRole(pi, ctx, "coder"); diff --git a/start-single.sh b/start-coding-server.sh similarity index 98% rename from start-single.sh rename to start-coding-server.sh index 9668f31..243da3f 100755 --- a/start-single.sh +++ b/start-coding-server.sh @@ -11,7 +11,7 @@ MODEL_ALIAS="coding_model" GPU_DEVICE="${GPU_DEVICE:-1}" echo "[*] Verwende HF_HOME = $HF_HOME" -echo "[*] GPU device = $GPU_DEVICE (überschreibbar: GPU_DEVICE=2 ./start-single.sh)" +echo "[*] GPU device = $GPU_DEVICE (überschreibbar: GPU_DEVICE=2 ./start-coding-server.sh)" if [ ! -f "$HF_HOME/$MODEL_REL_PATH" ]; then echo "[!] Modell-Datei nicht gefunden: $HF_HOME/$MODEL_REL_PATH" >&2 exit 1 diff --git a/stop-servers.sh b/stop-coding-server.sh similarity index 100% rename from stop-servers.sh rename to stop-coding-server.sh diff --git a/tests/scripts.test.mjs b/tests/scripts.test.mjs index df450d9..36c0c98 100644 --- a/tests/scripts.test.mjs +++ b/tests/scripts.test.mjs @@ -22,15 +22,15 @@ test("Dual-GPU-Skripte sind entfernt", () => { } }); -test("start-single.sh nutzt eine GPU und registriert Alias coding_model", () => { - const s = readRepoFile("start-single.sh"); +test("start-coding-server.sh nutzt eine GPU und registriert Alias coding_model", () => { + const s = readRepoFile("start-coding-server.sh"); assert.match(s, /--alias\s+"\$\{MODEL_ALIAS\}"/); assert.match(s, /MODEL_ALIAS="coding_model"/); assert.match(s, /device=\$\{GPU_DEVICE\}/, "GPU muss konfigurierbar/einzeln sein"); }); -test("stop-servers.sh stoppt den Single-Container", () => { - assert.match(readRepoFile("stop-servers.sh"), /coding_model/); +test("stop-coding-server.sh stoppt den Single-Container", () => { + assert.match(readRepoFile("stop-coding-server.sh"), /coding_model/); }); test("status.sh prüft den Single-Container", () => {