# Vier Coding-Helper, ein lokales Modell

> Pi, OpenCode, Hermes und DeepSeek Harness gegeneinander — alle an demselben lokal laufenden Qwen-3.8-27B-Modell. Was der Unterschied im Ergebnis macht und wo er nicht reicht.

_Kicker: harness-bench · Datum: 2026-09-01 · Lesezeit: 8 min_

Ein Coding-Agent ist nur so gut wie das Paar aus Modell und Umgebung. Deshalb habe ich vier gängige Agenten an dasselbe, auf meinem eigenen Rechner laufende Modell angeschlossen und sie identische Terminal-Aufgaben lösen lassen. Das Ergebnis ist kein Leaderboard — es ist ein Blick darauf, was der Agent selbst aus dem Modell herausholt.

## Setup

### model

**Qwen 3.8 27B · NVFP4**

Lokales Modell, kein Cloud-Endpoint. Alle vier Agenten sprechen es über dieselbe OpenAI-kompatible Schnittstelle an.

### engine

**NInfer**

Eigenbau-Inferenz-Engine (C++/CUDA) auf einer RTX 5090.

Bewusst auf `max-concurrency 1` gefahren: Alle LLM-Requests laufen nacheinander durch eine einzige Decode-Lane. Das hält die Messung sauber — kein paralleles Gedränge, keine anderen Prozesse, die die Zahlen drücken.

### framework

**Harbor / Terminal-Bench 2.0**

Jeder Agent läuft pro Aufgabe in einer frischen, isolierten Docker-Umgebung. Versteckte Prüfungsskripte entscheiden über bestanden/nicht bestanden — der Agent sieht sie nie.

### scope

**10 Aufgaben · 1 Versuch(e) pro Zelle**

Zehn Aufgaben aus Terminal-Bench 2.0, ein Versuch pro (Agent, Aufgabe)-Paar. Das ist ein Indikator, kein Paper-Claim: Eine einzige schwache Stichprobe kann eine Zelle dominieren.

## Agenten

### Pi

_Leaner Coding-Agent (badlogic)_

- Integration: Standard-Adapter von Harbor
- Eigene Provider-Konfiguration, die den lokalen Endpunkt als OpenAI-kompatible Route einrichtet.

### OpenCode

_Open-Source-Terminal-Agent (anomalyco)_

- Integration: Standard-Adapter von Harbor
- Registriert das Modell im eigenen Config-Format, läuft mit deaktivierten Berechtigungsabfragen.

### Hermes

_Agent-Framework (Nous Research)_

- Integration: Standard-Adapter von Harbor
- Stock-Installation direkt aus dem Projekt, nativer OpenAI-Pfad gegen den lokalen Endpunkt.

### DeepSeek Harness

_Agent-Harness von DeepSeek (dsh)_

- Integration: Eigener Adapter für dieses Projekt
- Headless-Modus mit Custom-Provider. Developer-Preview (0.1.0-rc) — Verhalten kann zwischen Läufen variieren.

## Aufgaben

| ID | Label | Kategorie |
|---|---|---|
| regex-log | regex-log | Log-Auswertung |
| fix-git | fix-git | Git-Reparatur |
| sanitize-git-repo | sanitize-git-repo | Git-Reparatur |
| count-dataset-tokens | count-dataset-tokens | Datenverarbeitung |
| log-summary-date-ranges | log-summary-date-ranges | Log-Auswertung |
| sqlite-db-truncate | sqlite-db-truncate | Datenbank |
| filter-js-from-html | filter-js-from-html | Textverarbeitung |
| pytorch-model-cli | pytorch-model-cli | Python / ML |
| write-compressor | write-compressor | Systemprogrammierung |
| gcode-to-text | gcode-to-text | Parsing |

## Ergebnisse

Status: final

### Pass-Rate

| Agent | Pass-Rate | Ø Zeit (s) |
|---|---|---|
| pi | 40 % | 441 |
| opencode | 50 % | 281.3 |
| hermes | 60 % | 783.5 |
| dsh | 60 % | 724 |

### Detail-Zellen

| Agent | Aufgabe | Bestanden | Zeit (s) | Input-Tokens | Output-Tokens |
|---|---|---|---|---|---|
| dsh | count-dataset-tokens | ✓ | 307.2 | — | — |
| dsh | filter-js-from-html | ✗ | 290.9 | — | — |
| dsh | fix-git | ✓ | 124 | — | — |
| dsh | gcode-to-text | ✗ | 2106.1 | — | — |
| dsh | log-summary-date-ranges | ✓ | 139.3 | — | — |
| dsh | pytorch-model-cli | ✓ | 284.4 | — | — |
| dsh | regex-log | ✓ | 374.6 | — | — |
| dsh | sanitize-git-repo | ✗ | 740.6 | — | — |
| dsh | sqlite-db-truncate | ✓ | 232.8 | — | — |
| dsh | write-compressor | ✗ | 2640.1 | — | — |
| hermes | count-dataset-tokens | ✓ | 441 | 0 | 0 |
| hermes | filter-js-from-html | ✗ | 947.9 | 0 | 0 |
| hermes | fix-git | ✓ | 515.4 | 0 | 0 |
| hermes | gcode-to-text | ✓ | 804 | 0 | 0 |
| hermes | log-summary-date-ranges | ✓ | 288 | 0 | 0 |
| hermes | pytorch-model-cli | ✓ | 375.4 | 0 | 0 |
| hermes | regex-log | ✓ | 475.2 | 0 | 0 |
| hermes | sanitize-git-repo | ✗ | 770.7 | 0 | 0 |
| hermes | sqlite-db-truncate | ✗ | 504 | 0 | 0 |
| hermes | write-compressor | ✗ | 2713.6 | — | — |
| opencode | count-dataset-tokens | ✓ | 348.9 | 351693 | 4215 |
| opencode | filter-js-from-html | ✗ | 142.9 | 7269 | 0 |
| opencode | fix-git | ✓ | 126.5 | 74234 | 691 |
| opencode | gcode-to-text | ✗ | 890.4 | 1777533 | 17458 |
| opencode | log-summary-date-ranges | ✓ | 136.4 | 61166 | 1323 |
| opencode | pytorch-model-cli | ✓ | 383.3 | 531902 | 9911 |
| opencode | regex-log | ✗ | 174.7 | 7388 | 0 |
| opencode | sanitize-git-repo | ✓ | 282.7 | 449727 | 4802 |
| opencode | sqlite-db-truncate | ✗ | 158 | 32336 | 163 |
| opencode | write-compressor | ✗ | 168.8 | 15484 | 67 |
| pi | count-dataset-tokens | ✓ | 225.1 | 415721 | 13012 |
| pi | filter-js-from-html | ✗ | 137.9 | 1721 | 16384 |
| pi | fix-git | ✓ | 63.8 | 63512 | 3315 |
| pi | gcode-to-text | ✗ | 2622.9 | 6917829 | 199954 |
| pi | log-summary-date-ranges | ✓ | 98 | 43757 | 2578 |
| pi | pytorch-model-cli | ✓ | 462 | 466434 | 17423 |
| pi | regex-log | ✗ | 128.6 | 1839 | 16384 |
| pi | sanitize-git-repo | ✗ | 383.1 | 1012640 | 23797 |
| pi | sqlite-db-truncate | ✗ | 113 | 6369 | 16569 |
| pi | write-compressor | ✗ | 175.6 | 4237 | 16486 |

## Findings

### Gleiche Zelle, verschiedene Wege

Weil das Modell für alle vier festgelegt ist, ist jede Abweichung im Ergebnis dem Agenten zuzuschreiben: System-Prompts, Tool-Definitionen, wie der Loop abläuft, wie mit Berechtigungen umgegangen wird. Genau diese Schicht macht den Unterschied — nicht das Modell.

### Was die eine Zahl nicht sagt

Eine bestellte Aufgabe heißt nicht, dass der Agent sie „versteht". Er kann sie durch Probieren, durch Suchen im Arbeitsverzeichnis oder durch eine glückliche Formulierung lösen. Die versteckte Prüfung misst den Endzustand, nicht den Weg. Für eine belastbare Aussage über einen einzelnen Agenten bräuchte man mehrere Versuche pro Aufgabe — das ist hier aus Zeitgründen weggelassen.

### Warum eine lokale Engine

Ein Cloud-Modell würde die Frage verwässern: Man misst dann auch die Latenz, den Provider und dessen Feintuning. Mit einem festen, lokal laufenden Modell fällt das weg. Und mit der bewusst eingeschränkten Parallelität (eine Decode-Lane) bleibt die Messung reproduzierbar — was bei vier verschiedenen Agenten und langsamer lokaler Decode ohnehin der Fall sein muss.

## Grenzen

- Zehn Aufgaben, ein Versuch pro Zelle — ein Indikator, keine belastbare Statistik.
- Nur bestanden/nicht bestanden, keine Teilwertung oder Zeit-basierte Wertung.
- Der DeepSeek-Harness-Lauf ist eine Developer-Preview; sein Verhalten kann zwischen Läufen variieren.
- Die Sandbox ist die Harbor-Docker-Umgebung, nicht der persönliche Rechner.

## Quellen

- [Harbor (Framework)](https://github.com/laude-institute/harbor)
- [Terminal-Bench 2.0 (Aufgaben)](https://github.com/harbor-framework/terminal-bench-2)
- [DeepSeek Harness (dsh)](https://github.com/deepseek-ai/deepseek-harness)
- [harness-bench (Vergleichs-Referenz)](https://neuralnoise.com/2026/harness-bench-wip/)
