From c7cfd143c755dc6c5a41be684b285898a2b5064b Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Thu, 6 Aug 2026 15:38:37 +0200 Subject: [PATCH] fix(twenty-front): keep auto-select model preselection instead of discarding it (#23854) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Context Opening the Ask AI panel with a FAST model preselection (`useOpenAskAiPageWithPreprompt`) sets the chat's model to the workspace's `fastModel`. For every workspace on default settings that value is the auto-select sentinel `default-fast-model`. ## Bug `useAgentChatModelId` validates the selected model against the enabled-models list — and `useWorkspaceAiModelAvailability` deliberately filters sentinel ids out of that list. The preselection is therefore silently discarded (`selectedModelId = null`), the request is sent with no model, and the server falls back to its default — the **smart** model. Net effect: FAST preselection no-ops on default-configured workspaces (observed on twenty-internal: a `model: 'FAST'` entry point ran on gpt-5.6-sol instead of gpt-5.6-luna). ## Fix Treat auto-select sentinel ids as always available in the check — the server-side registry already resolves them (`getEffectiveModelConfig` → `getDefaultSpeedModel`). One line + a regression test. ## Test `useAgentChatModelId.test.tsx`: new case asserting a sentinel selection survives to `modelIdForRequest`; all 4 pass. Review in cubic --- .../ai/hooks/__tests__/useAgentChatModelId.test.tsx | 9 +++++++++ .../src/modules/ai/hooks/useAgentChatModelId.ts | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/twenty-front/src/modules/ai/hooks/__tests__/useAgentChatModelId.test.tsx b/packages/twenty-front/src/modules/ai/hooks/__tests__/useAgentChatModelId.test.tsx index bc776a9c22..335ff7da99 100644 --- a/packages/twenty-front/src/modules/ai/hooks/__tests__/useAgentChatModelId.test.tsx +++ b/packages/twenty-front/src/modules/ai/hooks/__tests__/useAgentChatModelId.test.tsx @@ -87,4 +87,13 @@ describe('useAgentChatModelId', () => { expect(result.current.modelIdForRequest).toBe('openai/gpt-4.1'); }); + + it('should keep an auto-select sentinel selection instead of discarding it', () => { + const result = renderHooks({ + pathname: '/objects/companies', + userSelectedModel: 'default-fast-model', + }); + + expect(result.current.modelIdForRequest).toBe('default-fast-model'); + }); }); diff --git a/packages/twenty-front/src/modules/ai/hooks/useAgentChatModelId.ts b/packages/twenty-front/src/modules/ai/hooks/useAgentChatModelId.ts index 62ccb6e22b..7d9ef550c8 100644 --- a/packages/twenty-front/src/modules/ai/hooks/useAgentChatModelId.ts +++ b/packages/twenty-front/src/modules/ai/hooks/useAgentChatModelId.ts @@ -1,4 +1,4 @@ -import { isDefined } from 'twenty-shared/utils'; +import { isAutoSelectModelId, isDefined } from 'twenty-shared/utils'; import { useIsWorkspaceSetupChat } from '@/ai/hooks/useIsWorkspaceSetupChat'; import { useWorkspaceAiModelAvailability } from '@/ai/hooks/useWorkspaceAiModelAvailability'; @@ -16,6 +16,7 @@ export const useAgentChatModelId = () => { const isUserModelAvailable = !isDefined(agentChatUserSelectedModel) || + isAutoSelectModelId(agentChatUserSelectedModel) || enabledModels.some((model) => model.modelId === agentChatUserSelectedModel); const selectedModelId = isUserModelAvailable