From aeddb5759425de2f9fd589843a2392280d6c89ef Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 1 Mar 2026 01:59:22 -0800 Subject: [PATCH] Scope reasoning effort defaults and options by provider - Replace global reasoning constants with provider-scoped effort options/defaults - Update ChatView to use Codex-specific reasoning effort types and default lookup - Expand model contract tests for provider-specific reasoning effort behavior --- apps/web/src/components/ChatView.tsx | 24 ++++++++++---------- packages/contracts/src/model.test.ts | 32 ++++++++++++++++++++++----- packages/contracts/src/model.ts | 33 +++++++++++++++++++--------- 3 files changed, 63 insertions(+), 26 deletions(-) diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index e6ce135e0dd07e051cef7feed0fecd589587ecea..3d5975578b98ef0fc50541e8f65db9ae484ffc80 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -2,17 +2,18 @@ import { type ApprovalRequestId, CURSOR_REASONING_OPTIONS, DEFAULT_MODEL, - DEFAULT_REASONING, EDITORS, type EditorId, type KeybindingCommand, + type CodexReasoningEffort, type CursorReasoningOption, type MessageId, getDefaultModel, + getDefaultReasoningEffort, getCursorModelCapabilities, getCursorModelFamilyOptions, getModelOptions, - getReasoningOptions, + getReasoningEffortOptions, type ProjectId, type ProjectEntry, type ProjectScript, @@ -20,7 +21,6 @@ import { parseCursorModelSelection, PROVIDER_SEND_TURN_MAX_ATTACHMENTS, PROVIDER_SEND_TURN_MAX_IMAGE_BYTES, - type ReasoningEffort, type ResolvedKeybindingsConfig, type ProviderApprovalDecision, type ServerProviderStatus, @@ -683,8 +683,8 @@ export default function ChatView({ threadId }: ChatViewProps) { DEFAULT_MODEL, ); const selectedModel = resolveModelSlugForProvider(selectedProvider, composerDraft.model ?? baseThreadModel); - const selectedEffort = composerDraft.effort ?? DEFAULT_REASONING; - const reasoningOptions = getReasoningOptions(selectedProvider); + const selectedEffort = composerDraft.effort ?? getDefaultReasoningEffort(selectedProvider); + const reasoningOptions = getReasoningEffortOptions(selectedProvider); const supportsReasoningEffort = reasoningOptions.length > 0; const selectedCursorModel = useMemo( () => (selectedProvider === "cursor" ? parseCursorModelSelection(selectedModel) : null), @@ -2386,8 +2386,8 @@ export default function ChatView({ threadId }: ChatViewProps) { [onProviderModelSelect, selectedModel, selectedProvider], ); const onEffortSelect = useCallback( - (effort: ReasoningEffort) => { - setComposerDraftEffort(threadId, effort); + (effort: CodexReasoningEffort) => { + setSelectedEffort(effort); scheduleComposerFocus(); }, [scheduleComposerFocus, setComposerDraftEffort, threadId], @@ -4132,10 +4132,12 @@ const ProviderModelPicker = memo(function ProviderModelPicker(props: { }); const ReasoningEffortPicker = memo(function ReasoningEffortPicker(props: { - effort: ReasoningEffort; - options: ReadonlyArray; - onEffortChange: (effort: ReasoningEffort) => void; + effort: CodexReasoningEffort; + options: ReadonlyArray; + onEffortChange: (effort: CodexReasoningEffort) => void; }) { + const defaultReasoningEffort = getDefaultReasoningEffort("codex"); + return (