(model: string)
| 195 | * Returns the model's default and upper limit for max output tokens. |
| 196 | */ |
| 197 | export function getModelMaxOutputTokens(model: string): { |
| 198 | default: number |
| 199 | upperLimit: number |
| 200 | } { |
| 201 | let defaultTokens: number |
| 202 | let upperLimit: number |
| 203 | |
| 204 | if (process.env.USER_TYPE === 'ant') { |
| 205 | const antModel = resolveAntModel(model.toLowerCase()) |
| 206 | if (antModel) { |
| 207 | defaultTokens = antModel.defaultMaxTokens ?? MAX_OUTPUT_TOKENS_DEFAULT |
| 208 | upperLimit = antModel.upperMaxTokensLimit ?? MAX_OUTPUT_TOKENS_UPPER_LIMIT |
| 209 | return { default: defaultTokens, upperLimit } |
| 210 | } |
| 211 | } |
| 212 | |
| 213 | const m = getCanonicalName(model) |
| 214 | |
| 215 | if (m.includes('opus-4-6')) { |
| 216 | defaultTokens = 64_000 |
| 217 | upperLimit = 128_000 |
| 218 | } else if (m.includes('sonnet-4-6')) { |
| 219 | defaultTokens = 32_000 |
| 220 | upperLimit = 128_000 |
| 221 | } else if ( |
| 222 | m.includes('opus-4-5') || |
| 223 | m.includes('sonnet-4') || |
| 224 | m.includes('haiku-4') |
| 225 | ) { |
| 226 | defaultTokens = 32_000 |
| 227 | upperLimit = 64_000 |
| 228 | } else if (m.includes('opus-4-1') || m.includes('opus-4')) { |
| 229 | defaultTokens = 32_000 |
| 230 | upperLimit = 32_000 |
| 231 | } else if (m.includes('claude-3-opus')) { |
| 232 | defaultTokens = 4_096 |
| 233 | upperLimit = 4_096 |
| 234 | } else if (m.includes('claude-3-sonnet')) { |
| 235 | defaultTokens = 8_192 |
| 236 | upperLimit = 8_192 |
| 237 | } else if (m.includes('claude-3-haiku')) { |
| 238 | defaultTokens = 4_096 |
| 239 | upperLimit = 4_096 |
| 240 | } else if (m.includes('3-5-sonnet') || m.includes('3-5-haiku')) { |
| 241 | defaultTokens = 8_192 |
| 242 | upperLimit = 8_192 |
| 243 | } else if (m.includes('3-7-sonnet')) { |
| 244 | defaultTokens = 32_000 |
| 245 | upperLimit = 64_000 |
| 246 | } else { |
| 247 | defaultTokens = MAX_OUTPUT_TOKENS_DEFAULT |
| 248 | upperLimit = MAX_OUTPUT_TOKENS_UPPER_LIMIT |
| 249 | } |
| 250 | |
| 251 | const cap = getModelCapability(model) |
| 252 | if (cap?.max_tokens && cap.max_tokens >= 4_096) { |
| 253 | upperLimit = cap.max_tokens |
| 254 | defaultTokens = Math.min(defaultTokens, upperLimit) |
no test coverage detected