refactor: start-single.sh → start-coding-server.sh, stop-servers.sh → stop-coding-server.sh

Konsistente Benennung: Server-Skripte beschreiben ihre Funktion (coding-server),
nicht das spezifische Modell oder die Architektur. Alle Referenzen in Extension,
Tests, README und BEDIENUNGSANLEITUNG aktualisiert.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-15 05:45:36 +02:00
commit 3f66d4a387
6 changed files with 40 additions and 40 deletions

View file

@ -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"

View file

@ -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 13 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 |

View file

@ -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");

View file

@ -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

View file

@ -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", () => {