Skip to content

Commit 57321af

Browse files
committed
fix: remove last used model group
1 parent 7f6b178 commit 57321af

6 files changed

Lines changed: 40 additions & 48 deletions

File tree

apps/desktop/src/renderer/components/automations/create-automation-dialog.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ import { toast } from "sonner"
4040
import type { Automation } from "../../../preload/api"
4141
import { discoveryProjectsAtom } from "../../atoms/discovery"
4242
import {
43-
useModelState,
43+
getModelVariants,
44+
type ModelRef,
4445
useDevoAgents,
4546
useProviders,
4647
} from "../../hooks/use-devo-data"
@@ -51,10 +52,8 @@ import {
5152
runAutomationNow,
5253
updateAutomation,
5354
} from "../../services/backend"
54-
import type { ModelRef } from "../../hooks/use-devo-data"
5555
import { AgentSelector, ModelSelector, VariantSelector } from "../chat/prompt-toolbar"
5656
import { SchedulePicker } from "./schedule-picker"
57-
import { getModelVariants } from "../../hooks/use-devo-data"
5857

5958
interface CreateAutomationDialogProps {
6059
open: boolean
@@ -124,7 +123,6 @@ export function CreateAutomationDialog({
124123

125124
const { data: providers } = useProviders(directory)
126125
const { agents } = useDevoAgents(directory)
127-
const { recentModels } = useModelState()
128126

129127
// Compute available variants for the selected model
130128
const variants = useMemo(() => {
@@ -459,7 +457,6 @@ export function CreateAutomationDialog({
459457
effectiveModel={selectedModel}
460458
hasOverride={selectedModel !== null}
461459
onSelectModel={setSelectedModel}
462-
recentModels={recentModels}
463460
/>
464461
{variants.length > 0 && (
465462
<>

apps/desktop/src/renderer/components/chat/chat-input.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ export function ChatInput({
178178
const [selectedAgent, setSelectedAgent] = useState<string | null>(null)
179179
const [selectedVariant, setSelectedVariant] = useState<string | undefined>(undefined)
180180

181-
const { recentModels, addRecent: addRecentModel } = useModelState()
181+
const { addRecent: addRecentModel } = useModelState()
182182

183183
// Resolve effective model
184184

@@ -396,7 +396,6 @@ export function ChatInput({
396396
if (m) addRecentModel(m)
397397
})
398398
}
399-
recentModels={recentModels}
400399
selectedVariant={selectedVariant}
401400
onSelectVariant={(v) => startTransition(() => setSelectedVariant(v))}
402401
disabled={!isConnected}

apps/desktop/src/renderer/components/chat/chat-view.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,7 +1114,7 @@ function ChatInputSection({
11141114
}
11151115
}, [sessionMessages, agent.sessionId, agent.directory, projectModels])
11161116

1117-
const { recentModels, addRecent: addRecentModel } = useModelState()
1117+
const { addRecent: addRecentModel } = useModelState()
11181118

11191119
const activeDevoAgent = useMemo(() => {
11201120
const agentName = selectedAgent ?? config?.defaultAgent
@@ -1625,7 +1625,6 @@ function ChatInputSection({
16251625
effectiveModel={effectiveModel}
16261626
hasModelOverride={!!selectedModel}
16271627
onSelectModel={handleModelSelect}
1628-
recentModels={recentModels}
16291628
selectedVariant={selectedVariant}
16301629
onSelectVariant={setSelectedVariant}
16311630
disabled={!isConnected}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { readFileSync } from "node:fs"
2+
import { describe, expect, test } from "bun:test"
3+
4+
const source = readFileSync(new URL("./prompt-toolbar.tsx", import.meta.url), "utf8")
5+
const modelSelectorProps = source.match(/interface ModelSelectorProps \{[\s\S]*?\n\}/)?.[0] ?? ""
6+
const promptToolbarProps = source.match(/export interface PromptToolbarProps \{[\s\S]*?\n\}/)?.[0] ?? ""
7+
8+
describe("Model selector menu", () => {
9+
test("does not expose a Last used presentation group", () => {
10+
expect({
11+
omitsLastUsedHeading: !source.includes("Last used"),
12+
omitsLastUsedPresentationState: !source.includes("lastUsedModels"),
13+
modelSelectorPropRemoved: !modelSelectorProps.includes("recentModels"),
14+
promptToolbarPropRemoved: !promptToolbarProps.includes("recentModels"),
15+
}).toEqual({
16+
omitsLastUsedHeading: true,
17+
omitsLastUsedPresentationState: true,
18+
modelSelectorPropRemoved: true,
19+
promptToolbarPropRemoved: true,
20+
})
21+
})
22+
23+
test("keeps provider grouping and active model selection", () => {
24+
expect({
25+
groupsFilteredModelsByProvider: source.includes("groupByProvider(filteredModels)"),
26+
rendersProviderGroups: source.includes("<SearchableListPopoverGroup"),
27+
keepsSessionModelsUngrouped: source.includes('providerId === "session"'),
28+
keepsActiveModelCheck: source.includes("selected={model.value === activeValue}"),
29+
}).toEqual({
30+
groupsFilteredModelsByProvider: true,
31+
rendersProviderGroups: true,
32+
keepsSessionModelsUngrouped: true,
33+
keepsActiveModelCheck: true,
34+
})
35+
})
36+
})

apps/desktop/src/renderer/components/chat/prompt-toolbar.tsx

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,6 @@ interface ModelSelectorProps {
193193
/** Whether the user has explicitly overridden the model */
194194
hasOverride: boolean
195195
onSelectModel: (model: ModelRef | null) => void
196-
/** Recent models from model.json (most recently used first) */
197-
recentModels?: ModelRef[]
198196
variants?: string[]
199197
selectedVariant?: string | undefined
200198
currentVariant?: string | undefined
@@ -207,7 +205,6 @@ export function ModelSelector({
207205
providers,
208206
effectiveModel,
209207
onSelectModel,
210-
recentModels,
211208
variants = [],
212209
selectedVariant,
213210
currentVariant,
@@ -217,17 +214,6 @@ export function ModelSelector({
217214
}: ModelSelectorProps) {
218215
const models = useMemo(() => (providers ? flattenModels(providers.providers) : []), [providers])
219216

220-
// Build "Last used" group from recentModels (up to 3, only models that exist in providers)
221-
const lastUsedModels = useMemo(() => {
222-
if (!recentModels || recentModels.length === 0) return []
223-
return recentModels
224-
.slice(0, 3)
225-
.map((ref) =>
226-
models.find((m) => m.providerID === ref.providerID && m.modelID === ref.modelID),
227-
)
228-
.filter((m): m is ModelOption => m != null)
229-
}, [recentModels, models])
230-
231217
const activeValue = effectiveModel
232218
? `${effectiveModel.providerID}/${effectiveModel.modelID}`
233219
: null
@@ -310,7 +296,6 @@ export function ModelSelector({
310296
<SearchableListPopoverSearch placeholder="Search models..." />
311297
<ModelSelectorList
312298
models={models}
313-
lastUsedModels={lastUsedModels}
314299
activeValue={activeValue}
315300
onSelect={handleSelect}
316301
/>
@@ -335,12 +320,10 @@ export function ModelSelector({
335320
/** Inner list component — reads search from context */
336321
function ModelSelectorList({
337322
models,
338-
lastUsedModels,
339323
activeValue,
340324
onSelect,
341325
}: {
342326
models: ModelOption[]
343-
lastUsedModels: ModelOption[]
344327
activeValue: string | null
345328
onSelect: (value: string) => void
346329
}) {
@@ -365,22 +348,6 @@ function ModelSelectorList({
365348
<SearchableListPopoverEmpty>No models found</SearchableListPopoverEmpty>
366349
) : (
367350
<>
368-
{/* Last used group — only shown when not searching */}
369-
{!search && lastUsedModels.length > 0 && (
370-
<SearchableListPopoverGroup label="Last used">
371-
{lastUsedModels.map((model) => (
372-
<ModelSelectorOptionRow
373-
key={`recent-${model.value}`}
374-
displayName={model.displayName}
375-
providerName={model.providerName}
376-
reasoning={model.reasoning}
377-
selected={model.value === activeValue}
378-
onSelect={() => onSelect(model.value)}
379-
/>
380-
))}
381-
</SearchableListPopoverGroup>
382-
)}
383-
384351
{/* Provider-grouped models */}
385352
{Array.from(grouped.entries()).map(([providerName, providerModels]) => {
386353
// Get the provider ID from the first model in the group to look up the icon
@@ -517,9 +484,6 @@ export interface PromptToolbarProps {
517484
hasModelOverride: boolean
518485
onSelectModel: (model: ModelRef | null) => void
519486

520-
/** Recent models from model.json */
521-
recentModels?: ModelRef[]
522-
523487
/** Currently selected variant */
524488
selectedVariant: string | undefined
525489
onSelectVariant: (variant: string | undefined) => void
@@ -540,7 +504,6 @@ export function PromptToolbar({
540504
effectiveModel,
541505
hasModelOverride,
542506
onSelectModel,
543-
recentModels,
544507
selectedVariant,
545508
onSelectVariant,
546509
disabled,
@@ -588,7 +551,6 @@ export function PromptToolbar({
588551
effectiveModel={effectiveModel}
589552
hasOverride={hasModelOverride}
590553
onSelectModel={onSelectModel}
591-
recentModels={recentModels}
592554
variants={variants}
593555
selectedVariant={selectedVariant}
594556
currentVariant={currentVariant}

apps/desktop/src/renderer/components/new-chat.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,6 @@ export function NewChat() {
656656
effectiveModel={effectiveModel}
657657
hasModelOverride={!!selectedModel}
658658
onSelectModel={handleModelSelect}
659-
recentModels={recentModels}
660659
selectedVariant={selectedVariant}
661660
onSelectVariant={setSelectedVariant}
662661
disabled={launching || !selectedDirectory}

0 commit comments

Comments
 (0)