pi-system/extensions/default-model.ts

78 lines
2.3 KiB
TypeScript
Raw Normal View History

/**
* 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
}
});
}