Skip to content

Commit 25e52b8

Browse files
ThomasVitalemarkpollack
authored andcommitted
Fix mutable observation context
The DefaultChatClientObservationConvention is now not removing entries from the observation context, resulting in advisor context entries being removed in the ChatClientRequest. Fixes gh-2876 Signed-off-by: Thomas Vitale <[email protected]>
1 parent 867bc2e commit 25e52b8

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/DefaultChatClientObservationConvention.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.ai.chat.client.observation;
1818

1919
import java.util.Arrays;
20+
import java.util.HashMap;
2021
import java.util.List;
2122

2223
import io.micrometer.common.KeyValue;
@@ -115,7 +116,7 @@ protected KeyValues chatClientAdvisorParams(KeyValues keyValues, ChatClientObser
115116
if (CollectionUtils.isEmpty(context.getRequest().context())) {
116117
return keyValues;
117118
}
118-
var chatClientContext = context.getRequest().context();
119+
var chatClientContext = new HashMap<>(context.getRequest().context());
119120
Arrays.stream(ChatClientAttributes.values()).forEach(attribute -> chatClientContext.remove(attribute.getKey()));
120121
return keyValues.and(
121122
ChatClientObservationDocumentation.HighCardinalityKeyNames.CHAT_CLIENT_ADVISOR_PARAMS.asString(),

spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/observation/DefaultChatClientObservationConventionTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.List;
2020

2121
import io.micrometer.common.KeyValue;
22+
import io.micrometer.common.KeyValues;
2223
import io.micrometer.observation.Observation;
2324
import org.junit.jupiter.api.BeforeEach;
2425
import org.junit.jupiter.api.Test;
@@ -170,4 +171,24 @@ void shouldHaveOptionalKeyValues() {
170171
"[\"toolCallback1\", \"toolCallback2\"]"));
171172
}
172173

174+
@Test
175+
void entriesInAdvisorContextAreNotRemoved() {
176+
var request = ChatClientRequest.builder()
177+
.prompt(new Prompt(""))
178+
.context("advParam1", "advisorParam1Value")
179+
.context(ChatClientAttributes.ADVISORS.getKey(),
180+
List.of(dummyAdvisor("advisor1"), dummyAdvisor("advisor2")))
181+
.build();
182+
183+
ChatClientObservationContext observationContext = ChatClientObservationContext.builder()
184+
.request(request)
185+
.build();
186+
187+
assertThat(observationContext.getRequest().context()).hasSize(2);
188+
189+
this.observationConvention.chatClientAdvisorParams(KeyValues.empty(), observationContext);
190+
191+
assertThat(observationContext.getRequest().context()).hasSize(2);
192+
}
193+
173194
}

0 commit comments

Comments
 (0)