diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/SafeGuardAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/SafeGuardAdvisor.java index a319f9dd4f3..dcdcea91c98 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/SafeGuardAdvisor.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/SafeGuardAdvisor.java @@ -23,6 +23,7 @@ import org.springframework.ai.chat.client.ChatClientRequest; import org.springframework.ai.chat.client.ChatClientResponse; +import org.springframework.ai.chat.client.advisor.api.Advisor; import org.springframework.ai.chat.client.advisor.api.CallAdvisor; import org.springframework.ai.chat.client.advisor.api.CallAdvisorChain; import org.springframework.ai.chat.client.advisor.api.StreamAdvisor; @@ -46,7 +47,12 @@ public class SafeGuardAdvisor implements CallAdvisor, StreamAdvisor { private static final String DEFAULT_FAILURE_RESPONSE = "I'm unable to respond to that due to sensitive content. Could we rephrase or discuss something else?"; - private static final int DEFAULT_ORDER = 0; + /** + * The default priority of {@code SafeGuardAdvisor} should always be higher than that + * of {@code MessageChatMemoryAdvisor} to prevent sensitive words in chat memory from + * repeatedly triggering {@code SafeGuardAdvisor}'s interception mechanism. + */ + private static final int DEFAULT_ORDER = Advisor.DEFAULT_CHAT_MEMORY_PRECEDENCE_ORDER - 1; private final String failureResponse; diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/advisors.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/advisors.adoc index 0004a1e7dd1..90b1db2db86 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/advisors.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/advisors.adoc @@ -385,7 +385,11 @@ Based on the article: [Re-Reading Improves Reasoning in LLMs](https://arxiv.org/ * `SafeGuardAdvisor` + A simple advisor designed to prevent the model from generating harmful or inappropriate content. - ++ +[NOTE] +==== +If you have both `SafeGuardAdvisor` and `MessageChatMemoryAdvisor` enabled and have manually set their `order`, make sure that `SafeGuardAdvisor` has a higher priority than `MessageChatMemoryAdvisor` to prevent sensitive words in chat memory from repeatedly triggering `SafeGuardAdvisor`'s interception mechanism. +==== === Streaming vs Non-Streaming