File size: 2,534 Bytes
064bfd6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | /**
* Model deprecation utilities
*
* Contains information about deprecated models and their retirement dates.
*/
import { type APIProvider, getAPIProvider } from './providers.js'
type DeprecatedModelInfo = {
isDeprecated: true
modelName: string
retirementDate: string
}
type NotDeprecatedInfo = {
isDeprecated: false
}
type DeprecationInfo = DeprecatedModelInfo | NotDeprecatedInfo
type DeprecationEntry = {
/** Human-readable model name */
modelName: string
/** Retirement dates by provider (null = not deprecated for that provider) */
retirementDates: Record<APIProvider, string | null>
}
/**
* Deprecated models and their retirement dates by provider.
* Keys are substrings to match in model IDs (case-insensitive).
* To add a new deprecated model, add an entry to this object.
*/
const DEPRECATED_MODELS: Record<string, DeprecationEntry> = {
'claude-3-opus': {
modelName: 'Claude 3 Opus',
retirementDates: {
firstParty: 'January 5, 2026',
bedrock: 'January 15, 2026',
vertex: 'January 5, 2026',
foundry: 'January 5, 2026',
},
},
'claude-3-7-sonnet': {
modelName: 'Claude 3.7 Sonnet',
retirementDates: {
firstParty: 'February 19, 2026',
bedrock: 'April 28, 2026',
vertex: 'May 11, 2026',
foundry: 'February 19, 2026',
},
},
'claude-3-5-haiku': {
modelName: 'Claude 3.5 Haiku',
retirementDates: {
firstParty: 'February 19, 2026',
bedrock: null,
vertex: null,
foundry: null,
},
},
}
/**
* Check if a model is deprecated and get its deprecation info
*/
function getDeprecatedModelInfo(modelId: string): DeprecationInfo {
const lowercaseModelId = modelId.toLowerCase()
const provider = getAPIProvider()
for (const [key, value] of Object.entries(DEPRECATED_MODELS)) {
const retirementDate = value.retirementDates[provider]
if (!lowercaseModelId.includes(key) || !retirementDate) {
continue
}
return {
isDeprecated: true,
modelName: value.modelName,
retirementDate,
}
}
return { isDeprecated: false }
}
/**
* Get a deprecation warning message for a model, or null if not deprecated
*/
export function getModelDeprecationWarning(
modelId: string | null,
): string | null {
if (!modelId) {
return null
}
const info = getDeprecatedModelInfo(modelId)
if (!info.isDeprecated) {
return null
}
return `⚠ ${info.modelName} will be retired on ${info.retirementDate}. Consider switching to a newer model.`
}
|