From 02659b3c771ce3b3ca4fb05ba4add964be22c836 Mon Sep 17 00:00:00 2001 From: ashakirin Date: Mon, 24 Nov 2025 11:53:08 +0100 Subject: [PATCH] Added memory test, improved security sample --- .../example/ai/agent/service/ChatService.java | 8 +++++ .../agent/service/ChatClientMemoryTest.java | 31 ++++++++++++++++ .../ai/agent/SecurityConfiguration.java | 5 +-- .../ai/agent/controller/ChatController.java | 35 ++----------------- .../agent/controller/WebViewController.java | 5 ++- .../src/main/resources/templates/chat.html | 1 + 6 files changed, 48 insertions(+), 37 deletions(-) create mode 100644 samples/quality-assurance/ai-agent/src/test/java/com/example/ai/agent/service/ChatClientMemoryTest.java diff --git a/samples/quality-assurance/ai-agent/src/main/java/com/example/ai/agent/service/ChatService.java b/samples/quality-assurance/ai-agent/src/main/java/com/example/ai/agent/service/ChatService.java index 625d2f7e..30418980 100644 --- a/samples/quality-assurance/ai-agent/src/main/java/com/example/ai/agent/service/ChatService.java +++ b/samples/quality-assurance/ai-agent/src/main/java/com/example/ai/agent/service/ChatService.java @@ -4,6 +4,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; +import org.springframework.ai.chat.memory.MessageWindowChatMemory; import org.springframework.stereotype.Service; @Service @@ -33,8 +35,14 @@ public class ChatService { public ChatService(DateTimeService dateTimeService, ChatClient.Builder chatClientBuilder) { + + var chatMemory = MessageWindowChatMemory.builder() + .maxMessages(20) + .build(); + this.chatClient = chatClientBuilder .defaultSystem(SYSTEM_PROMPT) + .defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build()) .defaultTools(dateTimeService) .build(); diff --git a/samples/quality-assurance/ai-agent/src/test/java/com/example/ai/agent/service/ChatClientMemoryTest.java b/samples/quality-assurance/ai-agent/src/test/java/com/example/ai/agent/service/ChatClientMemoryTest.java new file mode 100644 index 00000000..5dd7915e --- /dev/null +++ b/samples/quality-assurance/ai-agent/src/test/java/com/example/ai/agent/service/ChatClientMemoryTest.java @@ -0,0 +1,31 @@ +package com.example.ai.agent.service; + + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +public class ChatClientMemoryTest { + + @Autowired + private ChatService chatService; + + @Test + public void shouldMemorizeMemoryContext() { + // Test if the model knows basic facts + String memoryAdvice = "My name is Andrei"; + chatService.processChat(memoryAdvice); + + String question = "What is my name?"; + String response = chatService.processChat(question); + System.out.println("=== DIRECT MODEL TEST ==="); + System.out.println("Question: " + question); + System.out.println("Response: " + response); + + assertThat(response).isNotNull().isNotEmpty(); + assertThat(response.toLowerCase()).contains("andrei"); + } +} diff --git a/samples/security/oauth/ai-agent/src/main/java/com/example/ai/agent/SecurityConfiguration.java b/samples/security/oauth/ai-agent/src/main/java/com/example/ai/agent/SecurityConfiguration.java index bfc2edc0..1d02aa02 100644 --- a/samples/security/oauth/ai-agent/src/main/java/com/example/ai/agent/SecurityConfiguration.java +++ b/samples/security/oauth/ai-agent/src/main/java/com/example/ai/agent/SecurityConfiguration.java @@ -15,10 +15,7 @@ class SecurityConfiguration { @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http - .authorizeHttpRequests(auth -> auth - .anyRequest().authenticated() - ) - .oauth2Login(Customizer.withDefaults()) + .authorizeHttpRequests(auth -> auth.anyRequest().permitAll()) .oauth2Client(Customizer.withDefaults()) .csrf(CsrfConfigurer::disable) .build(); diff --git a/samples/security/oauth/ai-agent/src/main/java/com/example/ai/agent/controller/ChatController.java b/samples/security/oauth/ai-agent/src/main/java/com/example/ai/agent/controller/ChatController.java index c3f22b6e..8fa7b52c 100644 --- a/samples/security/oauth/ai-agent/src/main/java/com/example/ai/agent/controller/ChatController.java +++ b/samples/security/oauth/ai-agent/src/main/java/com/example/ai/agent/controller/ChatController.java @@ -1,6 +1,7 @@ package com.example.ai.agent.controller; import com.example.ai.agent.service.ChatService; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.*; @RestController @@ -14,40 +15,10 @@ public ChatController(ChatService chatService) { } @PostMapping("chat") - public String chat(@RequestBody ChatRequest request) { + public String chat(@RequestBody ChatRequest request, HttpServletRequest httpRequest) { + var headers = httpRequest.getHeaderNames(); return chatService.processChat(request.prompt()); } - @GetMapping("gui") - public String chat() { - String prompt = "Please give me all available hotels in Paris, Checkin 10.10.2025, checkout 15.10.2025"; - String chatResponse = chatService.processChat(prompt); - - String currentHotel = """ -

Available hotels %s

-

%s

-
- -
- """.formatted(prompt, chatResponse); - - return """ -

Demo controller

- %s - -
- -

Ask for the weather

-

In which city would you like to see the weather?

-
- - -
- -
- """.formatted(currentHotel); - } - - public record ChatRequest(String prompt) {} } diff --git a/samples/security/oauth/ai-agent/src/main/java/com/example/ai/agent/controller/WebViewController.java b/samples/security/oauth/ai-agent/src/main/java/com/example/ai/agent/controller/WebViewController.java index 09ae5e05..bbe4ea59 100644 --- a/samples/security/oauth/ai-agent/src/main/java/com/example/ai/agent/controller/WebViewController.java +++ b/samples/security/oauth/ai-agent/src/main/java/com/example/ai/agent/controller/WebViewController.java @@ -1,12 +1,15 @@ package com.example.ai.agent.controller; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; +import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class WebViewController { @GetMapping("/") - public String index() { + public String index(@RegisteredOAuth2AuthorizedClient("authserver") OAuth2AuthorizedClient authorizedClient) { + authorizedClient.getAccessToken(); return "chat"; } } diff --git a/samples/security/oauth/ai-agent/src/main/resources/templates/chat.html b/samples/security/oauth/ai-agent/src/main/resources/templates/chat.html index b0e2087e..dfde68eb 100644 --- a/samples/security/oauth/ai-agent/src/main/resources/templates/chat.html +++ b/samples/security/oauth/ai-agent/src/main/resources/templates/chat.html @@ -463,6 +463,7 @@

🤖 AI Agent

} catch (error) { console.error('Error:', error); addMessage('Sorry, I encountered an error. Please try again.', 'ai'); + throw error } });