-
Notifications
You must be signed in to change notification settings - Fork 37
Expand file tree
/
Copy pathConversationIdResolver.java
More file actions
45 lines (37 loc) · 1.64 KB
/
ConversationIdResolver.java
File metadata and controls
45 lines (37 loc) · 1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.example.agent;
import org.springaicommunity.agentcore.context.AgentCoreContext;
import org.springaicommunity.agentcore.context.AgentCoreHeaders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.json.JsonMapper;
import java.util.Base64;
import java.util.UUID;
/**
* Utility for extracting conversation ID from AgentCore context.
* Format: userId:sessionId (authenticated) or sessionId (anonymous)
*/
public final class ConversationIdResolver {
private static final Logger logger = LoggerFactory.getLogger(ConversationIdResolver.class);
private static final JsonMapper jsonMapper = JsonMapper.builder().build();
private ConversationIdResolver() {}
public static String resolve(AgentCoreContext context) {
String sessionId = context.getHeader(AgentCoreHeaders.SESSION_ID);
if (sessionId == null || sessionId.isBlank()) {
sessionId = UUID.randomUUID().toString();
}
String authHeader = context.getHeader(AgentCoreHeaders.AUTHORIZATION);
if (authHeader != null && authHeader.startsWith("Bearer ")) {
try {
String jwt = authHeader.substring(7);
String payload = new String(Base64.getUrlDecoder().decode(jwt.split("\\.")[1]));
JsonNode claims = jsonMapper.readTree(payload);
String userId = claims.get("sub").asString();
return userId + ":" + sessionId;
} catch (Exception e) {
logger.debug("JWT parsing failed, using sessionId only", e);
}
}
return sessionId;
}
}