@@ -121,6 +121,56 @@ describe('HookTranslator', () => {
121121 } ,
122122 ] ) ;
123123 } ) ;
124+
125+ it ( 'should apply model override when hook returns only model field' , ( ) => {
126+ const baseRequest : GenerateContentParameters = {
127+ model : 'gemini-2.5-flash-lite' ,
128+ contents : [
129+ {
130+ role : 'user' ,
131+ parts : [ { text : 'Hello' } ] ,
132+ } ,
133+ ] ,
134+ } as unknown as GenerateContentParameters ;
135+
136+ // Simulate a hook that only overrides the model — no messages field
137+ const hookRequest = {
138+ model : 'gemini-2.5-flash' ,
139+ } as unknown as LLMRequest ;
140+
141+ const sdkRequest = translator . fromHookLLMRequest (
142+ hookRequest ,
143+ baseRequest ,
144+ ) ;
145+
146+ // Model should be overridden
147+ expect ( sdkRequest . model ) . toBe ( 'gemini-2.5-flash' ) ;
148+ // Original conversation contents should be preserved
149+ expect ( sdkRequest . contents ) . toEqual ( baseRequest . contents ) ;
150+ } ) ;
151+
152+ it ( 'should preserve base request contents when hook messages is undefined' , ( ) => {
153+ const baseRequest : GenerateContentParameters = {
154+ model : 'gemini-1.5-flash' ,
155+ contents : [
156+ { role : 'user' , parts : [ { text : 'original message' } ] } ,
157+ { role : 'model' , parts : [ { text : 'original reply' } ] } ,
158+ ] ,
159+ } as unknown as GenerateContentParameters ;
160+
161+ const hookRequest = {
162+ model : 'gemini-1.5-pro' ,
163+ // messages intentionally omitted
164+ } as unknown as LLMRequest ;
165+
166+ const sdkRequest = translator . fromHookLLMRequest (
167+ hookRequest ,
168+ baseRequest ,
169+ ) ;
170+
171+ expect ( sdkRequest . model ) . toBe ( 'gemini-1.5-pro' ) ;
172+ expect ( sdkRequest . contents ) . toEqual ( baseRequest . contents ) ;
173+ } ) ;
124174 } ) ;
125175
126176 describe ( 'LLM Response Translation' , ( ) => {
0 commit comments