@@ -51,6 +51,7 @@ const CLAUDE_PRESENTATION = {
5151 displayName : "Claude" ,
5252 showInteractionModeToggle : true ,
5353} as const ;
54+ const MINIMUM_CLAUDE_OPUS_5_VERSION = "2.1.219" ;
5455const MINIMUM_CLAUDE_FABLE_5_VERSION = "2.1.169" ;
5556const MINIMUM_CLAUDE_SONNET_5_VERSION = "2.1.197" ;
5657const MINIMUM_CLAUDE_OPUS_4_8_VERSION = "2.1.154" ;
@@ -151,6 +152,42 @@ const BUILT_IN_MODELS: ReadonlyArray<ServerProviderModel> = [
151152 ] ,
152153 } ) ,
153154 } ,
155+ {
156+ slug : "claude-opus-5" ,
157+ name : "Claude Opus 5" ,
158+ isCustom : false ,
159+ capabilities : createModelCapabilities ( {
160+ optionDescriptors : [
161+ buildSelectOptionDescriptor ( {
162+ id : "effort" ,
163+ label : "Reasoning" ,
164+ options : [
165+ { value : "low" , label : "Low" } ,
166+ { value : "medium" , label : "Medium" } ,
167+ { value : "high" , label : "High" , isDefault : true } ,
168+ { value : "xhigh" , label : "Extra High" } ,
169+ { value : "max" , label : "Max" } ,
170+ { value : "ultracode" , label : "Ultracode" } ,
171+ { value : "ultrathink" , label : "Ultrathink" } ,
172+ ] ,
173+ promptInjectedValues : [ "ultrathink" ] ,
174+ } ) ,
175+ buildBooleanOptionDescriptor ( {
176+ id : "fastMode" ,
177+ label : "Fast Mode" ,
178+ } ) ,
179+ buildSelectOptionDescriptor ( {
180+ id : "contextWindow" ,
181+ label : "Context Window" ,
182+ // Claude Code selects the 1M variant explicitly (`claude-opus-5[1m]`).
183+ options : [
184+ { value : "200k" , label : "200k" } ,
185+ { value : "1m" , label : "1M" , isDefault : true } ,
186+ ] ,
187+ } ) ,
188+ ] ,
189+ } ) ,
190+ } ,
154191 {
155192 slug : "claude-opus-4-8" ,
156193 name : "Claude Opus 4.8" ,
@@ -334,6 +371,10 @@ function withClaudeSonnet5ContextWindowSelector(
334371 } ) ;
335372}
336373
374+ function supportsClaudeOpus5 ( version : string | null | undefined ) : boolean {
375+ return version ? compareSemverVersions ( version , MINIMUM_CLAUDE_OPUS_5_VERSION ) >= 0 : false ;
376+ }
377+
337378function supportsClaudeFable5 ( version : string | null | undefined ) : boolean {
338379 return version ? compareSemverVersions ( version , MINIMUM_CLAUDE_FABLE_5_VERSION ) >= 0 : false ;
339380}
@@ -354,6 +395,9 @@ export function getBuiltInClaudeModelsForVersion(
354395 version : string | null | undefined ,
355396) : ReadonlyArray < ServerProviderModel > {
356397 return BUILT_IN_MODELS . filter ( ( model ) => {
398+ if ( model . slug === "claude-opus-5" ) {
399+ return supportsClaudeOpus5 ( version ) ;
400+ }
357401 if ( model . slug === "claude-fable-5" ) {
358402 return supportsClaudeFable5 ( version ) ;
359403 }
@@ -370,6 +414,11 @@ export function getBuiltInClaudeModelsForVersion(
370414 } ) ;
371415}
372416
417+ function formatClaudeOpus5UpgradeMessage ( version : string | null ) : string {
418+ const versionLabel = version ? `v${ version } ` : "the installed version" ;
419+ return `Claude Code ${ versionLabel } is too old for Claude Opus 5. Upgrade to v${ MINIMUM_CLAUDE_OPUS_5_VERSION } or newer to access it.` ;
420+ }
421+
373422function formatClaudeFable5UpgradeMessage ( version : string | null ) : string {
374423 const versionLabel = version ? `v${ version } ` : "the installed version" ;
375424 return `Claude Code ${ versionLabel } is too old for Claude Fable 5. Upgrade to v${ MINIMUM_CLAUDE_FABLE_5_VERSION } or newer to access it.` ;
@@ -434,6 +483,7 @@ export function normalizeClaudeCliEffort(
434483 if (
435484 effort === "xhigh" &&
436485 model !== "claude-fable-5" &&
486+ model !== "claude-opus-5" &&
437487 model !== "claude-opus-4-8" &&
438488 model !== "claude-sonnet-5"
439489 ) {
@@ -920,15 +970,17 @@ export const checkClaudeProviderStatus = Effect.fn("checkClaudeProviderStatus")(
920970 claudeSettings . customModels ,
921971 DEFAULT_CLAUDE_MODEL_CAPABILITIES ,
922972 ) ;
923- const versionUpgradeMessage = supportsClaudeSonnet5 ( parsedVersion )
973+ const versionUpgradeMessage = supportsClaudeOpus5 ( parsedVersion )
924974 ? undefined
925- : supportsClaudeFable5 ( parsedVersion )
926- ? formatClaudeSonnet5UpgradeMessage ( parsedVersion )
927- : supportsClaudeOpus48 ( parsedVersion )
928- ? formatClaudeFable5UpgradeMessage ( parsedVersion )
929- : supportsClaudeOpus47 ( parsedVersion )
930- ? formatClaudeOpus48UpgradeMessage ( parsedVersion )
931- : formatClaudeOpus47UpgradeMessage ( parsedVersion ) ;
975+ : supportsClaudeSonnet5 ( parsedVersion )
976+ ? formatClaudeOpus5UpgradeMessage ( parsedVersion )
977+ : supportsClaudeFable5 ( parsedVersion )
978+ ? formatClaudeSonnet5UpgradeMessage ( parsedVersion )
979+ : supportsClaudeOpus48 ( parsedVersion )
980+ ? formatClaudeFable5UpgradeMessage ( parsedVersion )
981+ : supportsClaudeOpus47 ( parsedVersion )
982+ ? formatClaudeOpus48UpgradeMessage ( parsedVersion )
983+ : formatClaudeOpus47UpgradeMessage ( parsedVersion ) ;
932984
933985 const capabilities = resolveCapabilities
934986 ? yield * resolveCapabilities ( claudeSettings ) . pipe ( Effect . orElseSucceed ( ( ) => undefined ) )
0 commit comments