|
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