From 68fef8745eb5142c4a0b694d126d6529c8d546a3 Mon Sep 17 00:00:00 2001 From: krishdef7 <157892833+krishdef7@users.noreply.github.com> Date: Tue, 7 Apr 2026 23:19:26 +0530 Subject: [PATCH] fix(core): propagate BeforeModel hook model override end-to-end (#24784) Signed-off-by: krishdef7 Co-authored-by: Sandy Tao --- packages/core/src/core/geminiChat.ts | 15 +++++++++++++++ packages/core/src/hooks/hookSystem.ts | 3 +++ 2 files changed, 18 insertions(+) diff --git a/packages/core/src/core/geminiChat.ts b/packages/core/src/core/geminiChat.ts index b96baa1c6a..b0efc9e1e4 100644 --- a/packages/core/src/core/geminiChat.ts +++ b/packages/core/src/core/geminiChat.ts @@ -597,6 +597,21 @@ export class GeminiChat { ); } + if (beforeModelResult.modifiedModel) { + modelToUse = resolveModel( + beforeModelResult.modifiedModel, + useGemini3_1, + useGemini3_1FlashLite, + false, + hasAccessToPreview, + this.context.config, + ); + lastModelToUse = modelToUse; + // Re-evaluate contentsToUse based on the new model's feature support + contentsToUse = supportsModernFeatures(modelToUse) + ? [...contentsForPreviewModel] + : [...requestContents]; + } if (beforeModelResult.modifiedConfig) { Object.assign(config, beforeModelResult.modifiedConfig); } diff --git a/packages/core/src/hooks/hookSystem.ts b/packages/core/src/hooks/hookSystem.ts index f748665985..0b943256f3 100644 --- a/packages/core/src/hooks/hookSystem.ts +++ b/packages/core/src/hooks/hookSystem.ts @@ -48,6 +48,8 @@ export interface BeforeModelHookResult { reason?: string; /** Synthetic response to return instead of calling the model (if blocked) */ syntheticResponse?: GenerateContentResponse; + /** Modified model override (if not blocked) */ + modifiedModel?: string; /** Modified config (if not blocked) */ modifiedConfig?: GenerateContentConfig; /** Modified contents (if not blocked) */ @@ -292,6 +294,7 @@ export class HookSystem { beforeModelOutput.applyLLMRequestModifications(llmRequest); return { blocked: false, + modifiedModel: modifiedRequest?.model, modifiedConfig: modifiedRequest?.config, modifiedContents: modifiedRequest?.contents, };