pi-system/extensions/default-model.ts
Raimund Bauer fb3daab33f feat/init: PiSystem Infrastruktur-Repo mit SubConfirm
Enthält alle Pi-Orchestrator-Infrastrukturkomponenten:
- bin/Sub* Skripte (SubAgenten, SubStatus, SubWatcher, SubConfirm)
- extensions/ (arbeitsweise-guard, confirm-deletion, etc.)
- memory/ (arbeitsweise, subagent-autocheck)
- agent/AGENTS.md mit SubConfirm-Reaktionslogik
- install.sh: deterministisches, idempotentes Setup für neue Maschinen

SubConfirm (neu): Stasis-Detektor der alle 30s tmux-Sessions prüft.
Bei unverändertem Output sendet er den vollständigen Pane-Inhalt
an die Alert-Datei — der Orchestrator beurteilt selbst ob Handlung nötig.
Kein Keyword-Matching.
2026-06-02 11:53:37 +02:00

78 lines
No EOL
2.3 KiB
TypeScript

/**
* Default Model Extension
*
* Setzt bei jedem Session-Start das Modell zurück auf den in settings.json
* definierten defaultProvider/defaultModel.
*
* Dadurch bleibt das Standard-Modell stabil: Man kann in einer Session
* temporär ein anderes Modell wählen (via /model oder Ctrl+G). Nach
* Session-Ende, Reload oder neuer Session gilt wieder der Default.
*
* Konfiguration in ~/.pi/agent/settings.json:
* "defaultProvider": "anthropic",
* "defaultModel": "claude-sonnet-4-20250514",
*/
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import * as fs from "node:fs";
import * as path from "node:path";
function getSettingsPath(): string {
return path.join(
process.env.HOME || "/home/xray",
".pi",
"agent",
"settings.json",
);
}
function readDefaultModel(): {
provider: string | null;
model: string | null;
} {
try {
const raw = fs.readFileSync(getSettingsPath(), "utf-8");
const settings = JSON.parse(raw);
return {
provider: settings.defaultProvider ?? null,
model: settings.defaultModel ?? null,
};
} catch {
return { provider: null, model: null };
}
}
export default function (pi: ExtensionAPI) {
pi.on("session_start", async (event, ctx) => {
if (!ctx.hasUI) return;
// Bei Startup (Programmstart) ist das Modell bereits korrekt gesetzt:
// entweder von CLI-Args (--provider/--model) oder aus settings.json.
// Nur bei Resume/Fork/Reload kann ein veraltetes Modell stammen.
if (event.reason === "startup") return;
const { provider, model } = readDefaultModel();
if (!provider || !model) return;
// Prüfen ob das aktuelle Modell bereits dem Default entspricht
const currentProvider = ctx.model?.provider;
const currentModel = ctx.model?.id;
if (currentProvider === provider && currentModel === model) return;
// Modell-Objekt aus dem Registry suchen
const modelObj = ctx.modelRegistry?.find?.(provider, model);
if (!modelObj) return;
try {
const success = await pi.setModel(modelObj);
if (!success) {
ctx.ui.notify(
`⚠️ Default-Modell ${provider}/${model} nicht verfügbar (API-Key?)`,
"warning",
);
}
} catch {
// Silent — Modell-Wechsel fehlgeschlagen, weitermachen
}
});
}