@@ -2,14 +2,19 @@ import type { Model } from "~/services/copilot/get-models"
22
33import { state } from "~/lib/state"
44
5+ export interface NormalizedSdkModelId {
6+ family : string
7+ version : string
8+ }
9+
510export const findEndpointModel = ( sdkModelId : string ) : Model | undefined => {
611 const models = state . models ?. data ?? [ ]
712 const exactMatch = models . find ( ( m ) => m . id === sdkModelId )
813 if ( exactMatch ) {
914 return exactMatch
1015 }
1116
12- const normalized = _normalizeSdkModelId ( sdkModelId )
17+ const normalized = normalizeSdkModelId ( sdkModelId )
1318 if ( ! normalized ) {
1419 return undefined
1520 }
@@ -33,30 +38,30 @@ export const findEndpointModel = (sdkModelId: string): Model | undefined => {
3338 * - "claude-haiku-3-5-20250514" -> { family: "haiku", version: "3.5" }
3439 * - "claude-haiku-4.5" -> { family: "haiku", version: "4.5" }
3540 */
36- const _normalizeSdkModelId = (
41+ export const normalizeSdkModelId = (
3742 sdkModelId : string ,
38- ) : { family : string ; version : string } | undefined => {
43+ ) : NormalizedSdkModelId | undefined => {
3944 const lower = sdkModelId . toLowerCase ( )
4045
4146 // Strip date suffix (8 digits at the end)
4247 const withoutDate = lower . replace ( / - \d { 8 } $ / , "" )
4348
44- // Pattern 1: claude-{family}-{major}- {minor} (e.g., claude-opus-4-5, claude- haiku-3- 5)
45- const pattern1 = withoutDate . match ( / ^ c l a u d e - ( \w + ) - ( \d + ) - ( \d + ) $ / )
49+ // Pattern 1: claude-{family}-{major}. {minor} (e.g., claude-haiku-4. 5)
50+ const pattern1 = withoutDate . match ( / ^ c l a u d e - ( \w + ) - ( \d + ) \. ( \d + ) $ / )
4651 if ( pattern1 ) {
4752 return { family : pattern1 [ 1 ] , version : `${ pattern1 [ 2 ] } .${ pattern1 [ 3 ] } ` }
4853 }
4954
50- // Pattern 2: claude-{major }-{minor }-{family } (e.g., claude-3-5-sonnet )
51- const pattern2 = withoutDate . match ( / ^ c l a u d e - ( \d + ) - ( \d + ) - ( \w + ) $ / )
55+ // Pattern 2: claude-{family }-{major }-{minor } (e.g., claude-opus-4-5, claude-haiku-3-5 )
56+ const pattern2 = withoutDate . match ( / ^ c l a u d e - ( \w + ) - ( \d + ) - ( \d + ) $ / )
5257 if ( pattern2 ) {
53- return { family : pattern2 [ 3 ] , version : `${ pattern2 [ 1 ] } .${ pattern2 [ 2 ] } ` }
58+ return { family : pattern2 [ 1 ] , version : `${ pattern2 [ 2 ] } .${ pattern2 [ 3 ] } ` }
5459 }
5560
56- // Pattern 3: claude-{family }-{major}.{minor } (e.g., claude-haiku-4.5 )
57- const pattern3 = withoutDate . match ( / ^ c l a u d e - ( \w + ) - ( \d + ) \. ( \d + ) $ / )
61+ // Pattern 3: claude-{major }-{minor}-{family } (e.g., claude-3-5-sonnet )
62+ const pattern3 = withoutDate . match ( / ^ c l a u d e - ( \d + ) - ( \d + ) - ( \w + ) $ / )
5863 if ( pattern3 ) {
59- return { family : pattern3 [ 1 ] , version : `${ pattern3 [ 2 ] } .${ pattern3 [ 3 ] } ` }
64+ return { family : pattern3 [ 3 ] , version : `${ pattern3 [ 1 ] } .${ pattern3 [ 2 ] } ` }
6065 }
6166
6267 // Pattern 4: claude-{family}-{major} (e.g., claude-sonnet-4)
0 commit comments