Zum Hauptinhalt springen

Pi mit mittwald AI Hosting

Pi‍ ist ein CLI-Coding-Agent mit Read-, Bash-, Edit- und Write-Tools, einem Erweiterungssystem und einer Terminal-UI. Provider werden in einer JSON-Datei deklariert, was einen OpenAI-kompatiblen Endpoint wie mittwald AI Hosting unkompliziert einzubinden macht.

Installation​

Das Installationsskript legt alle Abhängigkeiten auf feste Versionen fest. Aktualisieren kannst du Pi danach mit pi update:

curl -fsSL https://pi.dev/install.sh | sh

Oder mit npm, dafür brauchst du Node.js 22.19 oder neuer:

npm install -g --ignore-scripts @earendil-works/pi-coding-agent

Oder mit Homebrew:

brew install pi-coding-agent

Installation prüfen:

pi --version

Pi oder opencode​

Beide sind CLI-Coding-Agenten, die mit mittwald AI Hosting funktionieren; der Unterschied liegt darin, wie viel vor der eigentlichen Arbeit geladen wird. Direkt gegen das mittwald-Gateway gemessen sendet Pis erste Anfrage einen 2.640 Zeichen langen System-Prompt (als Nachricht mit der Rolle developer) plus JSON-Schemas für seine 4 eingebauten Tools – read, bash, edit, write – zusammen 3.024 Zeichen, macht insgesamt rund 6 KB für den ersten Request-Body. Dank des kleinen, festen Toolsets und des kompakten Prompts geht weniger vom Kontextfenster des Modells drauf, bevor die eigentliche Arbeit beginnt.

opencode bringt von Haus aus mehr mit: ein Plugin-Array, Agent Packs, in denen jeder Agent sein eigenes Modell bekommen kann, und ein Schrittlimit pro Agent. Auf der Platte belegt Pi rund 142 MB, opencode rund 160 MB, ein moderater Unterschied so oder so.

Wer einen kleinen, skriptbaren Agenten will und MCP-Server sowie Erweiterungen lieber erst bei Bedarf hinzufügt, startet mit Pi. Wer von Anfang an ein volleres, batteries-included Setup will, siehe opencode‍.

Pi auf mittwald AI Hosting zeigen lassen​

Pi liest Provider aus ~/.pi/agent/models.json. Füge einen Provider-Block hinzu:

{
"providers": {
"mittwald": {
"name": "mittwald AI Hosting",
"baseUrl": "https://llm.aihosting.mittwald.de/v1",
"api": "openai-completions",
"apiKey": "sk-...",
"models": [
{
"id": "Qwen3.8-27B-NVFP4",
"name": "Qwen3.8-27B-NVFP4",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 256000,
"maxTokens": 32768,
"samplingParams": {
"temperature": 1.0,
"top_p": 0.95,
"top_k": 20,
"presence_penalty": 0
}
},
{
"id": "Qwen3.6-35B-A3B-FP8",
"name": "Qwen3.6-35B-A3B-FP8",
"reasoning": true,
"input": ["text", "image"],
"contextWindow": 256000,
"maxTokens": 32768
}
]
}
}
}

Ersetze sk-... durch deinen AI-Hosting-API-Key. Den legst du im Bereich AI-Hosting deines mStudio-Projekts an — siehe API-Key einrichten‍. Ein mStudio-API-Token aus den Profileinstellungen ist ein anderes Zugangsmittel und funktioniert hier nicht. Der Wert von api muss openai-completions sein – das wählt das OpenAI-kompatible Request-Format.

Mach ihn in ~/.pi/agent/settings.json zum Standard:

{
"defaultProvider": "mittwald",
"defaultModel": "Qwen3.8-27B-NVFP4"
}

samplingParams pro Modell sind optional. Pi übernimmt sie unverändert in jede Anfrage, Felder wie presence_penalty kommen also beim Modell an. Die empfohlenen Werte für jedes Modell stehen auf dessen Seite in der Dokumentation zu KI-Modellen‍.

Für Qwen3.8-27B-NVFP4 stehen oben die Werte für den Thinking-Modus. Das Modell denkt standardmäßig, und Pi schaltet das nicht ab: Pi schickt seine Thinking-Stufe als reasoning_effort mit. Solange du defaultThinkingLevel nicht änderst, ist das medium. Bei der Stufe off lässt Pi das Feld ganz weg, und das Modell denkt trotzdem.

Verbindung prüfen​

Die deklarierten Modelle sollten jetzt aufgelistet sein:

pi --list-models

Erzwinge dann einen Tool Call, denn eine reine Chat-Antwort würde auch bei kaputtem Tool Calling gelingen:

pi --provider mittwald --model Qwen3.8-27B-NVFP4 --no-session \
-p "Create a file called hello.txt containing the word hello, then read it back."

Erwartet: Pi schreibt die Datei, liest sie zurück und gibt den Inhalt aus. Führe das in einem Scratch-Verzeichnis aus – der Agent schreibt Dateien dort, wo du ihn startest. --no-session hält den Lauf flüchtig, es bleibt also kein gespeicherter Chatverlauf zurück.

Empfohlene Erweiterungen und MCP-Server​

Erweiterungen​

Erweiterungen werden aus npm installiert und in settings.json unter packages festgehalten:

pi install npm:pi-safe-compact
pi list
ErweiterungWas sie macht
pi-safe-compactSichere Context-Compaction in langen Sessions
@narumitw/pi-plan-modeEin Plan-dann-Ausführen-Modus
pi-background-tasksLanglaufende Befehle, ohne die Session zu blockieren
@juicesharp/rpiv-todoAufgaben-Tracking innerhalb einer Session

Aktiviertes lässt sich mit pi config umschalten.

MCP-Server​

Seit Version 0.99.0 kann Pi MCP selbst, eine Erweiterung brauchst du dafür nicht mehr. Trag die Server in ~/.pi/agent/mcp.json ein:

{
"mcpServers": {
"context7": {
"command": "npx",
"args": ["-y", "@upstash/context7-mcp"]
},
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
},
"playwright": {
"command": "npx",
"args": ["-y", "@playwright/mcp"]
}
}
}

Du kannst Server auch von der Shell aus hinzufügen und danach prüfen, ob sich jeder davon verbindet:

pi mcp add context7 -- npx -y @upstash/context7-mcp
pi mcp list

Beim Start einer Session verbindet Pi alle aktivierten Server im Hintergrund. Ihre Tools meldet Pi dem Modell standardmäßig nicht einzeln an. Das Modell ruft sie über Pis Tool codemode auf, dadurch landen die Tool-Schemas nicht in jeder Anfrage. Wie du das mit exposure änderst und Remote-Server einbindest, steht unter MCP Servers‍ in der Pi-Dokumentation.

Die Erweiterung pi-mcp-adapter gibt es weiterhin. Sie ersetzt aber die eingebaute MCP-Unterstützung, und Pi liest dann keine mcp.json mehr.

Für den Zugriff auf mittwald-Infrastruktur siehe MCP-Integration‍.

Skills​

Pi entdeckt Skills automatisch, oder du lädst einen explizit:

pi --skill ./path/to/skill

Discovery für einen Lauf deaktivieren mit --no-skills.

Troubleshooting​

Ein deklariertes Modell fehlt in pi --list-models​

Der Provider-Block hat einen JSON-Syntaxfehler, oder api ist nicht openai-completions. Datei validieren: python3 -m json.tool ~/.pi/agent/models.json.

MCP-Server werden ignoriert​

Ruf pi mcp list auf. Der Befehl verbindet sich mit jedem aktivierten Server und zeigt Status, Tools und Fehler an. Sieht die Liste gut aus, fehlen in der Session aber trotzdem die MCP-Tools, dann schau mit pi list nach pi-mcp-adapter. Diese Erweiterung ersetzt die eingebaute MCP-Unterstützung, und Pi ignoriert dann die mcp.json. Die .pi/mcp.json eines Projekts liest Pi erst, wenn du dem Projekt vertraust.

Der Agent wiederholt denselben Tool-Call​

Der Agent liest immer wieder dieselben Dateien und kommt nie zu einer Änderung. Jede Runde geht von deinem Token-Kontingent ab. Ein Schritt- oder Rundenlimit hat Pi 1.4.0 nicht, weder in den Einstellungen‍ noch bei den Kommandozeilenoptionen‍. In der Terminal-UI brichst du die laufende Aufgabe mit Escape ab. Läuft Pi unbeaufsichtigt mit -p, begrenz die Laufzeit über die Shell, etwa mit timeout 15m pi -p "..." aus den GNU coreutils.

Verhindern lässt sich eine Schleife damit nicht. Sie entsteht vor allem bei ausgeschaltetem Thinking. Lass bei Qwen3.8-27B-NVFP4 das Thinking für Planung und Tool-Arbeit an, so wie in der Konfiguration oben. Hast du es abgeschaltet, etwa mit chat_template_kwargs in samplingParams, nimm das wieder heraus. Siehe Agent-Schleifen im Non-Thinking-Modus‍.

Ein .pi/-Verzeichnis erscheint trotz --no-session​

Das ist erwartbar, wenn die Erweiterung pi-background-tasks installiert ist – sie schreibt Task-Status pro Lauf unter .pi/tasks/, unabhängig vom Session-Flag, denn --no-session deaktiviert nur den Konversationsverlauf, nicht erweiterungslokalen Zustand. Gefahrlos löschbar; führe Agenten in einem Scratch-Verzeichnis aus, wenn nichts zurückbleiben soll.

Nächste Schritte​

Disclaimer​

Drittanbieter-Tools, MCP-Server und externe Links werden zur Vereinfachung bereitgestellt, ohne Gewährleistung oder Empfehlung. Nutze sie auf eigenes Risiko, prüfe Lizenzen und Datenschutzrichtlinien und vergib nur die nötigen Berechtigungen (Least Privilege). Sende keine sensiblen Daten an externe Services, sofern nicht nötig und erlaubt.

Auf dieser Seite