49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
import { existsSync, mkdirSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
import { homedir } from "node:os";
|
|
import type { Config } from "./types";
|
|
|
|
const DEFAULT_CONFIG: Config = {
|
|
apiKey: "",
|
|
apiBase: "https://api.deepseek.com/v1",
|
|
model: "deepseek-v4-flash",
|
|
maxTokens: 500,
|
|
temperature: 0.7,
|
|
};
|
|
|
|
const CONFIG_DIR = join(homedir(), ".config", "gai");
|
|
const CONFIG_PATH = join(CONFIG_DIR, "config.json");
|
|
|
|
export async function loadConfig(): Promise<Config> {
|
|
let config = { ...DEFAULT_CONFIG };
|
|
|
|
if (existsSync(CONFIG_PATH)) {
|
|
try {
|
|
const file = Bun.file(CONFIG_PATH);
|
|
const json = (await file.json()) as Partial<Config>;
|
|
config = { ...config, ...json };
|
|
} catch {}
|
|
}
|
|
|
|
if (process.env.GAI_API_KEY) config.apiKey = process.env.GAI_API_KEY;
|
|
if (process.env.GAI_API_BASE) config.apiBase = process.env.GAI_API_BASE;
|
|
if (process.env.GAI_MODEL) config.model = process.env.GAI_MODEL;
|
|
if (process.env.GAI_MAX_TOKENS)
|
|
config.maxTokens = parseInt(process.env.GAI_MAX_TOKENS);
|
|
if (process.env.GAI_TEMPERATURE)
|
|
config.temperature = parseFloat(process.env.GAI_TEMPERATURE);
|
|
|
|
return config;
|
|
}
|
|
|
|
export async function saveConfig(partial: Partial<Config>): Promise<void> {
|
|
if (!existsSync(CONFIG_DIR)) {
|
|
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
}
|
|
|
|
const current = await loadConfig();
|
|
const merged = { ...current, ...partial };
|
|
|
|
await Bun.write(CONFIG_PATH, JSON.stringify(merged, null, 2));
|
|
}
|