[AI] Match ai chat composer to figma (#18874)

https://www.figma.com/design/xt8O9mFeLl46C5InWwoMrN/Twenty?node-id=93653-368288&t=obTG32NRidXid4lN-0

closes
https://discord.com/channels/1130383047699738754/1480990726442582086

---------

Co-authored-by: Félix Malfait <felix.malfait@gmail.com>
Co-authored-by: Félix Malfait <felix@twenty.com>
This commit is contained in:
nitin
2026-03-26 11:13:54 +05:30
committed by GitHub
parent dfe9cb4346
commit 578d990b9c
50 changed files with 641 additions and 406 deletions
@@ -1,6 +1,6 @@
import { type AgentManifest } from 'twenty-shared/application';
import { DEFAULT_SMART_MODEL } from 'src/engine/metadata-modules/ai/ai-models/types/default-smart-model.const';
import { AUTO_SELECT_SMART_MODEL_ID } from 'twenty-shared/constants';
import { type ModelId } from 'src/engine/metadata-modules/ai/ai-models/types/model-id.type';
import { type UniversalFlatAgent } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-agent.type';
@@ -21,7 +21,7 @@ export const fromAgentManifestToUniversalFlatAgent = ({
icon: agentManifest.icon ?? null,
description: agentManifest.description ?? null,
prompt: agentManifest.prompt,
modelId: (agentManifest.modelId as ModelId) ?? DEFAULT_SMART_MODEL,
modelId: (agentManifest.modelId as ModelId) ?? AUTO_SELECT_SMART_MODEL_ID,
responseFormat: { type: 'text' },
modelConfiguration: null,
evaluationInputs: [],
@@ -20,8 +20,10 @@ import { DomainServerConfigService } from 'src/engine/core-modules/domain/domain
import { PUBLIC_FEATURE_FLAGS } from 'src/engine/core-modules/feature-flag/constants/public-feature-flag.const';
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
import { convertDollarsToBillingCredits } from 'src/engine/metadata-modules/ai/ai-billing/utils/convert-dollars-to-billing-credits.util';
import { DEFAULT_FAST_MODEL } from 'src/engine/metadata-modules/ai/ai-models/types/default-fast-model.const';
import { DEFAULT_SMART_MODEL } from 'src/engine/metadata-modules/ai/ai-models/types/default-smart-model.const';
import {
AUTO_SELECT_FAST_MODEL_ID,
AUTO_SELECT_SMART_MODEL_ID,
} from 'twenty-shared/constants';
import { MODEL_FAMILY_LABELS } from 'src/engine/metadata-modules/ai/ai-models/constants/model-family-labels.const';
import { AiModelRegistryService } from 'src/engine/metadata-modules/ai/ai-models/services/ai-model-registry.service';
@@ -107,10 +109,6 @@ export class ClientConfigService {
this.aiModelRegistryService.getDefaultSpeedModel();
const defaultSpeedModelConfig =
this.aiModelRegistryService.getModelConfig(defaultSpeedModel?.modelId);
const defaultSpeedModelLabel =
defaultSpeedModelConfig?.label ||
defaultSpeedModel?.modelId ||
'Default';
const defaultPerformanceModel =
this.aiModelRegistryService.getDefaultPerformanceModel();
@@ -118,23 +116,29 @@ export class ClientConfigService {
this.aiModelRegistryService.getModelConfig(
defaultPerformanceModel?.modelId,
);
const defaultPerformanceModelLabel =
defaultPerformanceModelConfig?.label ||
defaultPerformanceModel?.modelId ||
'Default';
aiModels.unshift(
{
modelId: DEFAULT_SMART_MODEL,
label: `Best (${defaultPerformanceModelLabel})`,
sdkPackage: null,
modelId: AUTO_SELECT_SMART_MODEL_ID,
label:
defaultPerformanceModelConfig?.label ||
defaultPerformanceModel?.modelId ||
'Default',
modelFamily: defaultPerformanceModelConfig?.modelFamily,
providerName: defaultPerformanceModel?.providerName,
sdkPackage: defaultPerformanceModel?.sdkPackage ?? null,
inputCostPerMillionTokensInCredits: 0,
outputCostPerMillionTokensInCredits: 0,
},
{
modelId: DEFAULT_FAST_MODEL,
label: `Best (${defaultSpeedModelLabel})`,
sdkPackage: null,
modelId: AUTO_SELECT_FAST_MODEL_ID,
label:
defaultSpeedModelConfig?.label ||
defaultSpeedModel?.modelId ||
'Default',
modelFamily: defaultSpeedModelConfig?.modelFamily,
providerName: defaultSpeedModel?.providerName,
sdkPackage: defaultSpeedModel?.sdkPackage ?? null,
inputCostPerMillionTokensInCredits: 0,
outputCostPerMillionTokensInCredits: 0,
},
@@ -34,8 +34,10 @@ import { PublicDomainEntity } from 'src/engine/core-modules/public-domain/public
import { WorkspaceSSOIdentityProviderEntity } from 'src/engine/core-modules/sso/workspace-sso-identity-provider.entity';
import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { AgentEntity } from 'src/engine/metadata-modules/ai/ai-agent/entities/agent.entity';
import { DEFAULT_FAST_MODEL } from 'src/engine/metadata-modules/ai/ai-models/types/default-fast-model.const';
import { DEFAULT_SMART_MODEL } from 'src/engine/metadata-modules/ai/ai-models/types/default-smart-model.const';
import {
AUTO_SELECT_FAST_MODEL_ID,
AUTO_SELECT_SMART_MODEL_ID,
} from 'twenty-shared/constants';
import { type ModelId } from 'src/engine/metadata-modules/ai/ai-models/types/model-id.type';
import { RoleDTO } from 'src/engine/metadata-modules/role/dtos/role.dto';
import { ViewFieldDTO } from 'src/engine/metadata-modules/view-field/dtos/view-field.dto';
@@ -301,11 +303,19 @@ export class WorkspaceEntity {
version: string | null;
@Field(() => String, { nullable: false })
@Column({ type: 'varchar', nullable: false, default: DEFAULT_FAST_MODEL })
@Column({
type: 'varchar',
nullable: false,
default: AUTO_SELECT_FAST_MODEL_ID,
})
fastModel: ModelId;
@Field(() => String, { nullable: false })
@Column({ type: 'varchar', nullable: false, default: DEFAULT_SMART_MODEL })
@Column({
type: 'varchar',
nullable: false,
default: AUTO_SELECT_SMART_MODEL_ID,
})
smartModel: ModelId;
@Field(() => String, { nullable: true })