fix(twenty-front): keep auto-select model preselection instead of discarding it (#23854)

## 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.

<!-- This is an auto-generated description by cubic. -->
<a
href="https://cubic.dev/pr/twentyhq/twenty/pull/23854?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
This commit is contained in:
Charles Bochet
2026-08-06 15:38:37 +02:00
committed by GitHub
parent b2684ce107
commit c7cfd143c7
2 changed files with 11 additions and 1 deletions
@@ -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');
});
});
@@ -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