(model: string)
| 147 | * Returns the model's default and upper limit for max output tokens. |
| 148 | */ |
| 149 | export function getModelMaxOutputTokens(model: string): { |
| 150 | default: number |
| 151 | upperLimit: number |
| 152 | } { |
| 153 | let defaultTokens: number |
| 154 | let upperLimit: number |
| 155 | |
| 156 | if (process.env.USER_TYPE === 'ant') { |
| 157 | const antModel = resolveAntModel(model.toLowerCase()) |
| 158 | if (antModel) { |
| 159 | defaultTokens = antModel.defaultMaxTokens ?? MAX_OUTPUT_TOKENS_DEFAULT |
| 160 | upperLimit = antModel.upperMaxTokensLimit ?? MAX_OUTPUT_TOKENS_UPPER_LIMIT |
| 161 | return { default: defaultTokens, upperLimit } |
| 162 | } |
| 163 | } |
| 164 | |
| 165 | const m = getCanonicalName(model) |
| 166 | |
| 167 | if (m.includes('opus-4-6')) { |
| 168 | defaultTokens = 64_000 |
| 169 | upperLimit = 128_000 |
| 170 | } else if (m.includes('sonnet-4-6')) { |
| 171 | defaultTokens = 32_000 |
| 172 | upperLimit = 128_000 |
| 173 | } else if ( |
| 174 | m.includes('opus-4-5') || |
| 175 | m.includes('sonnet-4') || |
| 176 | m.includes('haiku-4') |
| 177 | ) { |
| 178 | defaultTokens = 32_000 |
| 179 | upperLimit = 64_000 |
| 180 | } else if (m.includes('opus-4-1') || m.includes('opus-4')) { |
| 181 | defaultTokens = 32_000 |
| 182 | upperLimit = 32_000 |
| 183 | } else if (m.includes('claude-3-opus')) { |
| 184 | defaultTokens = 4_096 |
| 185 | upperLimit = 4_096 |
| 186 | } else if (m.includes('claude-3-sonnet')) { |
| 187 | defaultTokens = 8_192 |
| 188 | upperLimit = 8_192 |
| 189 | } else if (m.includes('claude-3-haiku')) { |
| 190 | defaultTokens = 4_096 |
| 191 | upperLimit = 4_096 |
| 192 | } else if (m.includes('3-5-sonnet') || m.includes('3-5-haiku')) { |
| 193 | defaultTokens = 8_192 |
| 194 | upperLimit = 8_192 |
| 195 | } else if (m.includes('3-7-sonnet')) { |
| 196 | defaultTokens = 32_000 |
| 197 | upperLimit = 64_000 |
| 198 | } else { |
| 199 | defaultTokens = MAX_OUTPUT_TOKENS_DEFAULT |
| 200 | upperLimit = MAX_OUTPUT_TOKENS_UPPER_LIMIT |
| 201 | } |
| 202 | |
| 203 | const cap = getModelCapability(model) |
| 204 | if (cap?.max_tokens && cap.max_tokens >= 4_096) { |
| 205 | upperLimit = cap.max_tokens |
| 206 | defaultTokens = Math.min(defaultTokens, upperLimit) |
no test coverage detected