@@ -153,6 +153,84 @@ def tool_response
153
153
}
154
154
end
155
155
156
+ it "correctly configures thinking when enabled" do
157
+ model . update! ( provider_params : { enable_thinking : "true" , thinking_tokens : "10000" } )
158
+
159
+ response = gemini_mock . response ( "Using thinking mode" ) . to_json
160
+
161
+ req_body = nil
162
+
163
+ llm = DiscourseAi ::Completions ::Llm . proxy ( "custom:#{ model . id } " )
164
+ url = "#{ model . url } :generateContent?key=123"
165
+
166
+ stub_request ( :post , url ) . with (
167
+ body :
168
+ proc do |_req_body |
169
+ req_body = _req_body
170
+ true
171
+ end ,
172
+ ) . to_return ( status : 200 , body : response )
173
+
174
+ response = llm . generate ( "Hello" , user : user )
175
+
176
+ parsed = JSON . parse ( req_body , symbolize_names : true )
177
+
178
+ # Verify thinking config is properly set with the token limit
179
+ expect ( parsed . dig ( :generationConfig , :thinkingConfig ) ) . to eq ( { thinkingBudget : 10_000 } )
180
+ end
181
+
182
+ it "clamps thinking tokens within allowed limits" do
183
+ model . update! ( provider_params : { enable_thinking : "true" , thinking_tokens : "30000" } )
184
+
185
+ response = gemini_mock . response ( "Thinking tokens clamped" ) . to_json
186
+
187
+ req_body = nil
188
+
189
+ llm = DiscourseAi ::Completions ::Llm . proxy ( "custom:#{ model . id } " )
190
+ url = "#{ model . url } :generateContent?key=123"
191
+
192
+ stub_request ( :post , url ) . with (
193
+ body :
194
+ proc do |_req_body |
195
+ req_body = _req_body
196
+ true
197
+ end ,
198
+ ) . to_return ( status : 200 , body : response )
199
+
200
+ response = llm . generate ( "Hello" , user : user )
201
+
202
+ parsed = JSON . parse ( req_body , symbolize_names : true )
203
+
204
+ # Verify thinking tokens are clamped to 24_576
205
+ expect ( parsed . dig ( :generationConfig , :thinkingConfig ) ) . to eq ( { thinkingBudget : 24_576 } )
206
+ end
207
+
208
+ it "does not add thinking config when disabled" do
209
+ model . update! ( provider_params : { enable_thinking : false , thinking_tokens : "10000" } )
210
+
211
+ response = gemini_mock . response ( "No thinking mode" ) . to_json
212
+
213
+ req_body = nil
214
+
215
+ llm = DiscourseAi ::Completions ::Llm . proxy ( "custom:#{ model . id } " )
216
+ url = "#{ model . url } :generateContent?key=123"
217
+
218
+ stub_request ( :post , url ) . with (
219
+ body :
220
+ proc do |_req_body |
221
+ req_body = _req_body
222
+ true
223
+ end ,
224
+ ) . to_return ( status : 200 , body : response )
225
+
226
+ response = llm . generate ( "Hello" , user : user )
227
+
228
+ parsed = JSON . parse ( req_body , symbolize_names : true )
229
+
230
+ # Verify thinking config is not present
231
+ expect ( parsed . dig ( :generationConfig , :thinkingConfig ) ) . to be_nil
232
+ end
233
+
156
234
# by default gemini is meant to use AUTO mode, however new experimental models
157
235
# appear to require this to be explicitly set
158
236
it "Explicitly specifies tool config" do
0 commit comments