import React, { useState, useEffect } from "react"; const api = window.api; export function ModelSettings() { // null = not yet loaded from DB const [model, setModel] = useState(null); const [draft, setDraft] = useState(""); const [saveStatus, setSaveStatus] = useState<"idle" | "saved">("idle"); useEffect(() => { api.getSettings(["model"]).then((settings) => { const saved = settings["model"] ?? ""; setModel(saved); setDraft(saved); }); }, []); const handleSave = async () => { const trimmed = draft.trim(); if (trimmed) { await api.setSetting("model", trimmed); setModel(trimmed); } else { await api.deleteSetting("model"); setModel(""); } setSaveStatus("saved"); setTimeout(() => setSaveStatus("idle"), 1500); }; const handleReset = async () => { await api.deleteSetting("model"); setModel(""); setDraft(""); setSaveStatus("saved"); setTimeout(() => setSaveStatus("idle"), 1500); }; if (model === null) { return (
Loading...
); } const isDirty = draft.trim() !== model; return (
Model
Claude model to use for all phases. Leave blank to use the SDK's default model. Takes effect on the next message sent in any session.
{ setDraft(e.target.value); setSaveStatus("idle"); }} onKeyDown={(e) => { if (e.key === "Enter") handleSave(); }} spellCheck={false} />
{model && ( )} {model && ( custom )}
); }