feat(cursor): support model selection (#684)

This commit is contained in:
SSU-WEI HUANG
2026-05-26 16:13:38 +08:00
committed by GitHub
parent db934a9d5b
commit 1d03f186d6
26 changed files with 597 additions and 19 deletions
+29 -4
View File
@@ -31,6 +31,7 @@ import { TeamPanel } from '@/components/TeamPanel'
import { usePlatform } from '@/hooks/usePlatform'
import { useSessionActions } from '@/hooks/mutations/useSessionActions'
import { useCodexModels } from '@/hooks/queries/useCodexModels'
import { useCursorModels } from '@/hooks/queries/useCursorModels'
import { useOpencodeModels } from '@/hooks/queries/useOpencodeModels'
import { useVoiceOptional } from '@/lib/voice-context'
import { RealtimeVoiceSession, registerSessionStore, registerVoiceHooksStore, voiceHooks } from '@/realtime'
@@ -167,6 +168,26 @@ export function SessionChat(props: {
label: opencodeModel.name ?? opencodeModel.modelId
}))
}, [agentFlavor, opencodeModelsState.availableModels])
const cursorModelsState = useCursorModels({
api: props.api,
sessionId: props.session.id,
enabled: agentFlavor === 'cursor' && props.session.active
})
const cursorModelOptions = useMemo(() => {
if (agentFlavor !== 'cursor') {
return undefined
}
return [
{ value: null, label: 'Default' },
...cursorModelsState.availableModels
.filter((cursorModel) => cursorModel.modelId !== 'auto')
.map((cursorModel) => ({
value: cursorModel.modelId,
label: cursorModel.name ?? cursorModel.modelId
}))
]
}, [agentFlavor, cursorModelsState.availableModels])
const {
abortSession,
switchSession,
@@ -605,9 +626,11 @@ export function SessionChat(props: {
availableModelOptions={
agentFlavor === 'codex'
? codexModelOptions
: agentFlavor === 'opencode'
? opencodeModelOptions
: undefined
: agentFlavor === 'cursor'
? cursorModelOptions
: agentFlavor === 'opencode'
? opencodeModelOptions
: undefined
}
active={props.session.active}
allowSendWhenInactive
@@ -627,7 +650,9 @@ export function SessionChat(props: {
onModelChange={
agentFlavor === 'codex'
? (props.session.active && !controlledByUser && !codexModelsState.error ? handleModelChange : undefined)
: handleModelChange
: agentFlavor === 'cursor'
? (props.session.active && !cursorModelsState.error ? handleModelChange : undefined)
: handleModelChange
}
onModelReasoningEffortChange={
agentFlavor === 'codex' && props.session.active && !controlledByUser