0c5cbd0068
- Add ~/.pi/agent/models.json config for custom providers (Ollama, vLLM, etc.) - Support all 4 API types (openai-completions, openai-responses, anthropic-messages, google-generative-ai) - Live reload models.json on /model selector open - Smart model defaults per provider (claude-sonnet-4-5, gpt-5.1-codex, etc.) - Graceful session fallback when saved model missing or no API key - Validation errors show precise file/field info in CLI and TUI - Agent knows its own README.md path for self-documentation - Added gpt-5.1-codex (400k context, 128k output, reasoning) Fixes #21
82 lines
1.9 KiB
TypeScript
82 lines
1.9 KiB
TypeScript
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
import { homedir } from "os";
|
|
import { dirname, join } from "path";
|
|
|
|
export interface Settings {
|
|
lastChangelogVersion?: string;
|
|
defaultProvider?: string;
|
|
defaultModel?: string;
|
|
}
|
|
|
|
export class SettingsManager {
|
|
private settingsPath: string;
|
|
private settings: Settings;
|
|
|
|
constructor(baseDir?: string) {
|
|
const dir = baseDir || join(homedir(), ".pi", "agent");
|
|
this.settingsPath = join(dir, "settings.json");
|
|
this.settings = this.load();
|
|
}
|
|
|
|
private load(): Settings {
|
|
if (!existsSync(this.settingsPath)) {
|
|
return {};
|
|
}
|
|
|
|
try {
|
|
const content = readFileSync(this.settingsPath, "utf-8");
|
|
return JSON.parse(content);
|
|
} catch (error) {
|
|
console.error(`Warning: Could not read settings file: ${error}`);
|
|
return {};
|
|
}
|
|
}
|
|
|
|
private save(): void {
|
|
try {
|
|
// Ensure directory exists
|
|
const dir = dirname(this.settingsPath);
|
|
if (!existsSync(dir)) {
|
|
mkdirSync(dir, { recursive: true });
|
|
}
|
|
|
|
writeFileSync(this.settingsPath, JSON.stringify(this.settings, null, 2), "utf-8");
|
|
} catch (error) {
|
|
console.error(`Warning: Could not save settings file: ${error}`);
|
|
}
|
|
}
|
|
|
|
getLastChangelogVersion(): string | undefined {
|
|
return this.settings.lastChangelogVersion;
|
|
}
|
|
|
|
setLastChangelogVersion(version: string): void {
|
|
this.settings.lastChangelogVersion = version;
|
|
this.save();
|
|
}
|
|
|
|
getDefaultProvider(): string | undefined {
|
|
return this.settings.defaultProvider;
|
|
}
|
|
|
|
getDefaultModel(): string | undefined {
|
|
return this.settings.defaultModel;
|
|
}
|
|
|
|
setDefaultProvider(provider: string): void {
|
|
this.settings.defaultProvider = provider;
|
|
this.save();
|
|
}
|
|
|
|
setDefaultModel(modelId: string): void {
|
|
this.settings.defaultModel = modelId;
|
|
this.save();
|
|
}
|
|
|
|
setDefaultModelAndProvider(provider: string, modelId: string): void {
|
|
this.settings.defaultProvider = provider;
|
|
this.settings.defaultModel = modelId;
|
|
this.save();
|
|
}
|
|
}
|