feat: persist last-used model in LocalStorage instead of preference
Drop the summaryModel preference (and the awkward textfield holding a raw model ID nobody could discover without poking the SDK types). Each AI view now controls its model dropdown, loads the shared velum.ai.last-model on mount, and writes it back on submit — so picking Claude 4.7 Opus in the summarize command becomes the prefilled default in briefing, action-items, structured-data, and reply next time around. Also drops 'model' from ReplyDefaults; the shared key supersedes it. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -12,7 +12,13 @@ import {
|
||||
} from "@raycast/api";
|
||||
import { getSelectedTextSafely } from "./selection";
|
||||
import { useEffect, useMemo, useRef, useState } from "react";
|
||||
import { CREATIVITY_OPTIONS, MODEL_OPTIONS } from "./ai";
|
||||
import {
|
||||
CREATIVITY_OPTIONS,
|
||||
DEFAULT_MODEL,
|
||||
getLastUsedModel,
|
||||
MODEL_OPTIONS,
|
||||
setLastUsedModel,
|
||||
} from "./ai";
|
||||
import { getPreferences } from "./preferences";
|
||||
import {
|
||||
buildDisclosureContent,
|
||||
@@ -65,7 +71,7 @@ export default function Command() {
|
||||
const [greeting, setGreeting] = useState("Lieber");
|
||||
const [signOff, setSignOff] = useState("Alles Liebe,");
|
||||
const [userFullName, setUserFullName] = useState(preferences.userFullName);
|
||||
const [model, setModel] = useState(preferences.summaryModel);
|
||||
const [model, setModel] = useState<string>(DEFAULT_MODEL);
|
||||
const [creativity, setCreativity] = useState<Creativity>("medium");
|
||||
const [disclosure, setDisclosure] = useState(false);
|
||||
const [isLoading, setIsLoading] = useState(true);
|
||||
@@ -73,17 +79,20 @@ export default function Command() {
|
||||
|
||||
useEffect(() => {
|
||||
async function load() {
|
||||
const [loadedSessions, activeId, defaults] = await Promise.all([
|
||||
listSessions(),
|
||||
getActiveSessionId(),
|
||||
loadReplyDefaults(),
|
||||
]);
|
||||
const [loadedSessions, activeId, defaults, lastModel] = await Promise.all(
|
||||
[
|
||||
listSessions(),
|
||||
getActiveSessionId(),
|
||||
loadReplyDefaults(),
|
||||
getLastUsedModel(),
|
||||
],
|
||||
);
|
||||
setSessions(loadedSessions);
|
||||
setActiveSessionId(activeId);
|
||||
setModel(lastModel);
|
||||
|
||||
if (defaults.greeting) setGreeting(defaults.greeting);
|
||||
if (defaults.signOff) setSignOff(defaults.signOff);
|
||||
if (defaults.model) setModel(defaults.model);
|
||||
if (defaults.creativity) setCreativity(defaults.creativity as Creativity);
|
||||
if (typeof defaults.disclosure === "boolean")
|
||||
setDisclosure(defaults.disclosure);
|
||||
@@ -104,13 +113,12 @@ export default function Command() {
|
||||
}
|
||||
}
|
||||
load();
|
||||
}, [preferences.summaryModel, preferences.userFullName]);
|
||||
}, [preferences.userFullName]);
|
||||
|
||||
function persist(
|
||||
overrides: Partial<{
|
||||
greeting: string;
|
||||
signOff: string;
|
||||
model: string;
|
||||
creativity: Creativity;
|
||||
disclosure: boolean;
|
||||
}>,
|
||||
@@ -118,7 +126,6 @@ export default function Command() {
|
||||
saveReplyDefaults({
|
||||
greeting: overrides.greeting ?? greeting,
|
||||
signOff: overrides.signOff ?? signOff,
|
||||
model: overrides.model ?? model,
|
||||
creativity: overrides.creativity ?? creativity,
|
||||
disclosure: overrides.disclosure ?? disclosure,
|
||||
}).catch(() => {
|
||||
@@ -173,10 +180,10 @@ export default function Command() {
|
||||
return;
|
||||
}
|
||||
|
||||
void setLastUsedModel(model);
|
||||
await saveReplyDefaults({
|
||||
greeting,
|
||||
signOff,
|
||||
model,
|
||||
creativity,
|
||||
disclosure,
|
||||
});
|
||||
@@ -358,10 +365,7 @@ export default function Command() {
|
||||
id="model"
|
||||
title="KI-Modell"
|
||||
value={model}
|
||||
onChange={(v) => {
|
||||
setModel(v);
|
||||
persist({ model: v });
|
||||
}}
|
||||
onChange={setModel}
|
||||
>
|
||||
{MODEL_OPTIONS.map((option) => (
|
||||
<Form.Dropdown.Item
|
||||
@@ -432,7 +436,6 @@ function ConfirmReply(props: StageProps) {
|
||||
await saveReplyDefaults({
|
||||
greeting,
|
||||
signOff,
|
||||
model: props.model,
|
||||
creativity: props.creativity,
|
||||
disclosure,
|
||||
});
|
||||
@@ -487,7 +490,6 @@ function ConfirmReply(props: StageProps) {
|
||||
saveReplyDefaults({
|
||||
greeting: v,
|
||||
signOff,
|
||||
model: props.model,
|
||||
creativity: props.creativity,
|
||||
disclosure,
|
||||
}).catch(() => {});
|
||||
@@ -510,7 +512,6 @@ function ConfirmReply(props: StageProps) {
|
||||
saveReplyDefaults({
|
||||
greeting,
|
||||
signOff: v,
|
||||
model: props.model,
|
||||
creativity: props.creativity,
|
||||
disclosure,
|
||||
}).catch(() => {});
|
||||
@@ -546,7 +547,6 @@ function ConfirmReply(props: StageProps) {
|
||||
saveReplyDefaults({
|
||||
greeting,
|
||||
signOff,
|
||||
model: props.model,
|
||||
creativity: props.creativity,
|
||||
disclosure: v,
|
||||
}).catch(() => {});
|
||||
|
||||
Reference in New Issue
Block a user