| 
26 | 26 | import org.springframework.ai.chat.messages.SystemMessage;  | 
27 | 27 | import org.springframework.ai.chat.messages.UserMessage;  | 
28 | 28 | import org.springframework.ai.chat.model.ChatModel;  | 
 | 29 | +import org.springframework.ai.chat.prompt.DefaultChatOptions;  | 
29 | 30 | import org.springframework.ai.content.Media;  | 
30 | 31 | import org.springframework.ai.model.tool.ToolCallingChatOptions;  | 
31 | 32 | import org.springframework.ai.template.TemplateRenderer;  | 
 | 
43 | 44 |  * Unit tests for {@link DefaultChatClientUtils}.  | 
44 | 45 |  *  | 
45 | 46 |  * @author Thomas Vitale  | 
 | 47 | + * @author Sun Yuhan  | 
46 | 48 |  */  | 
47 | 49 | class DefaultChatClientUtilsTests {  | 
48 | 50 | 
 
  | 
@@ -322,6 +324,64 @@ void whenToolContextAndChatOptionsAreProvidedThenTheValuesAreMerged() {  | 
322 | 324 | 			.containsAllEntriesOf(toolContext2);  | 
323 | 325 | 	}  | 
324 | 326 | 
 
  | 
 | 327 | +	@Test  | 
 | 328 | +	void whenToolNamesAndChatOptionsAreDefaultChatOptions() {  | 
 | 329 | +		Set<String> toolNames1 = Set.of("toolA", "toolB");  | 
 | 330 | +		DefaultChatOptions chatOptions = new DefaultChatOptions();  | 
 | 331 | +		ChatModel chatModel = mock(ChatModel.class);  | 
 | 332 | +		DefaultChatClient.DefaultChatClientRequestSpec inputRequest = (DefaultChatClient.DefaultChatClientRequestSpec) ChatClient  | 
 | 333 | +			.create(chatModel)  | 
 | 334 | +			.prompt()  | 
 | 335 | +			.options(chatOptions)  | 
 | 336 | +			.toolNames(toolNames1.toArray(new String[0]));  | 
 | 337 | + | 
 | 338 | +		ChatClientRequest result = DefaultChatClientUtils.toChatClientRequest(inputRequest);  | 
 | 339 | + | 
 | 340 | +		assertThat(result).isNotNull();  | 
 | 341 | +		assertThat(result.prompt().getOptions()).isInstanceOf(ToolCallingChatOptions.class);  | 
 | 342 | +		ToolCallingChatOptions resultOptions = (ToolCallingChatOptions) result.prompt().getOptions();  | 
 | 343 | +		assertThat(resultOptions).isNotNull();  | 
 | 344 | +		assertThat(resultOptions.getToolNames()).containsExactlyInAnyOrderElementsOf(toolNames1);  | 
 | 345 | +	}  | 
 | 346 | + | 
 | 347 | +	@Test  | 
 | 348 | +	void whenToolCallbacksAndChatOptionsAreDefaultChatOptions() {  | 
 | 349 | +		ToolCallback toolCallback1 = new TestToolCallback("tool1");  | 
 | 350 | +		DefaultChatOptions chatOptions = new DefaultChatOptions();  | 
 | 351 | +		ChatModel chatModel = mock(ChatModel.class);  | 
 | 352 | +		DefaultChatClient.DefaultChatClientRequestSpec inputRequest = (DefaultChatClient.DefaultChatClientRequestSpec) ChatClient  | 
 | 353 | +			.create(chatModel)  | 
 | 354 | +			.prompt()  | 
 | 355 | +			.options(chatOptions)  | 
 | 356 | +			.toolCallbacks(toolCallback1);  | 
 | 357 | + | 
 | 358 | +		ChatClientRequest result = DefaultChatClientUtils.toChatClientRequest(inputRequest);  | 
 | 359 | + | 
 | 360 | +		assertThat(result).isNotNull();  | 
 | 361 | +		assertThat(result.prompt().getOptions()).isInstanceOf(ToolCallingChatOptions.class);  | 
 | 362 | +		ToolCallingChatOptions resultOptions = (ToolCallingChatOptions) result.prompt().getOptions();  | 
 | 363 | +		assertThat(resultOptions).isNotNull();  | 
 | 364 | +		assertThat(resultOptions.getToolCallbacks()).containsExactlyInAnyOrder(toolCallback1);  | 
 | 365 | +	}  | 
 | 366 | + | 
 | 367 | +	@Test  | 
 | 368 | +	void whenToolContextAndChatOptionsAreDefaultChatOptions() {  | 
 | 369 | +		Map<String, Object> toolContext1 = Map.of("key1", "value1");  | 
 | 370 | +		DefaultChatOptions chatOptions = new DefaultChatOptions();  | 
 | 371 | +		ChatModel chatModel = mock(ChatModel.class);  | 
 | 372 | +		DefaultChatClient.DefaultChatClientRequestSpec inputRequest = (DefaultChatClient.DefaultChatClientRequestSpec) ChatClient  | 
 | 373 | +			.create(chatModel)  | 
 | 374 | +			.prompt()  | 
 | 375 | +			.options(chatOptions)  | 
 | 376 | +			.toolContext(toolContext1);  | 
 | 377 | + | 
 | 378 | +		ChatClientRequest result = DefaultChatClientUtils.toChatClientRequest(inputRequest);  | 
 | 379 | +		assertThat(result.prompt().getOptions()).isInstanceOf(ToolCallingChatOptions.class);  | 
 | 380 | +		ToolCallingChatOptions resultOptions = (ToolCallingChatOptions) result.prompt().getOptions();  | 
 | 381 | +		assertThat(resultOptions).isNotNull();  | 
 | 382 | +		assertThat(resultOptions.getToolContext()).containsAllEntriesOf(toolContext1);  | 
 | 383 | +	}  | 
 | 384 | + | 
325 | 385 | 	@Test  | 
326 | 386 | 	void whenAdvisorParamsAreProvidedThenTheyAreAddedToContext() {  | 
327 | 387 | 		Map<String, Object> advisorParams = Map.of("key1", "value1", "key2", "value2");  | 
 | 
0 commit comments