Add AI model pricing, Bedrock provider, and InferenceProvider/ModelFamily split (#18155)

## Summary

- **Model pricing overhaul**: All model constants updated with accurate
pricing in dollars per 1M tokens, including cached input rates, cache
creation rates, and tiered >200k context pricing
- **New providers**: Added Google (Gemini 3.x), Mistral, and AWS Bedrock
as inference providers. Bedrock serves Claude Opus 4.6 and Sonnet 4.6
via AWS, with proper credential handling following the existing S3/SES
pattern
- **InferenceProvider/ModelFamily split**: Refactored `ModelProvider`
into two orthogonal enums — `InferenceProvider` (who serves the model:
auth, SDK, metadata format) and `ModelFamily` (who created it: token
counting semantics). This eliminates growing `||` chains for token
normalization checks like `excludesCachedTokens`
- **Billing improvements**: Reasoning tokens charged at output rate,
cache token discounts applied accurately, real errors thrown to Sentry
on billing failures

## Test plan

- [x] All existing unit tests updated and passing (23 tests across 3
test files)
- [x] Lint passes for both twenty-server and twenty-front
- [ ] CI checks pass


Made with [Cursor](https://cursor.com)

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Félix Malfait
2026-02-22 14:39:04 +01:00
committed by GitHub
parent a900b4a4b4
commit 41f09c5a4c
37 changed files with 1462 additions and 383 deletions
@@ -1196,7 +1196,7 @@ export class ConfigVariables {
})
@IsOptional()
DEFAULT_AI_SPEED_MODEL_ID =
'gpt-4.1-mini,claude-haiku-4-5-20251001,grok-3-mini';
'gpt-5-mini,claude-haiku-4-5-20251001,gemini-3-flash-preview,grok-4-1-fast-reasoning,mistral-large-latest';
@ConfigVariablesMetadata({
group: ConfigVariablesGroup.LLM,
@@ -1205,7 +1205,8 @@ export class ConfigVariables {
type: ConfigVariableType.STRING,
})
@IsOptional()
DEFAULT_AI_PERFORMANCE_MODEL_ID = 'gpt-4.1,claude-sonnet-4-5-20250929,grok-4';
DEFAULT_AI_PERFORMANCE_MODEL_ID =
'gpt-5.2,claude-sonnet-4-6,gemini-3.1-pro-preview,grok-4,mistral-large-latest';
@ConfigVariablesMetadata({
group: ConfigVariablesGroup.LLM,
@@ -1271,6 +1272,60 @@ export class ConfigVariables {
@IsOptional()
GROQ_API_KEY: string;
@ConfigVariablesMetadata({
group: ConfigVariablesGroup.LLM,
isSensitive: true,
description: 'API key for Google AI (Gemini) integration',
type: ConfigVariableType.STRING,
})
@IsOptional()
GOOGLE_API_KEY: string;
@ConfigVariablesMetadata({
group: ConfigVariablesGroup.LLM,
isSensitive: true,
description: 'API key for Mistral AI integration',
type: ConfigVariableType.STRING,
})
@IsOptional()
MISTRAL_API_KEY: string;
@ConfigVariablesMetadata({
group: ConfigVariablesGroup.LLM,
description: 'AWS region for Bedrock integration (e.g., us-east-1)',
type: ConfigVariableType.STRING,
})
@IsAWSRegion()
@IsOptional()
AWS_BEDROCK_REGION: AwsRegion;
@ConfigVariablesMetadata({
group: ConfigVariablesGroup.LLM,
isSensitive: true,
description: 'AWS access key ID for Bedrock authentication',
type: ConfigVariableType.STRING,
})
@IsOptional()
AWS_BEDROCK_ACCESS_KEY_ID: string;
@ConfigVariablesMetadata({
group: ConfigVariablesGroup.LLM,
isSensitive: true,
description: 'AWS secret access key for Bedrock authentication',
type: ConfigVariableType.STRING,
})
@IsOptional()
AWS_BEDROCK_SECRET_ACCESS_KEY: string;
@ConfigVariablesMetadata({
group: ConfigVariablesGroup.LLM,
isSensitive: true,
description: 'AWS session token for Bedrock (for IAM role-based auth)',
type: ConfigVariableType.STRING,
})
@IsOptional()
AWS_BEDROCK_SESSION_TOKEN: string;
@ConfigVariablesMetadata({
group: ConfigVariablesGroup.SERVER_CONFIG,
description: 'Enable or disable multi-workspace support',