/ utils / model / modelSupportOverrides.ts
modelSupportOverrides.ts
 1  import memoize from 'lodash-es/memoize.js'
 2  import { getAPIProvider } from './providers.js'
 3  
 4  export type ModelCapabilityOverride =
 5    | 'effort'
 6    | 'max_effort'
 7    | 'thinking'
 8    | 'adaptive_thinking'
 9    | 'interleaved_thinking'
10  
11  const TIERS = [
12    {
13      modelEnvVar: 'ANTHROPIC_DEFAULT_OPUS_MODEL',
14      capabilitiesEnvVar: 'ANTHROPIC_DEFAULT_OPUS_MODEL_SUPPORTED_CAPABILITIES',
15    },
16    {
17      modelEnvVar: 'ANTHROPIC_DEFAULT_SONNET_MODEL',
18      capabilitiesEnvVar: 'ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES',
19    },
20    {
21      modelEnvVar: 'ANTHROPIC_DEFAULT_HAIKU_MODEL',
22      capabilitiesEnvVar: 'ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES',
23    },
24  ] as const
25  
26  /**
27   * Check whether a 3p model capability override is set for a model that matches one of
28   * the pinned ANTHROPIC_DEFAULT_*_MODEL env vars.
29   */
30  export const get3PModelCapabilityOverride = memoize(
31    (model: string, capability: ModelCapabilityOverride): boolean | undefined => {
32      if (getAPIProvider() === 'firstParty') {
33        return undefined
34      }
35      const m = model.toLowerCase()
36      for (const tier of TIERS) {
37        const pinned = process.env[tier.modelEnvVar]
38        const capabilities = process.env[tier.capabilitiesEnvVar]
39        if (!pinned || capabilities === undefined) continue
40        if (m !== pinned.toLowerCase()) continue
41        return capabilities
42          .toLowerCase()
43          .split(',')
44          .map(s => s.trim())
45          .includes(capability)
46      }
47      return undefined
48    },
49    (model, capability) => `${model.toLowerCase()}:${capability}`,
50  )