Skip to content

Commit 4a21df1

Browse files
committed
fix: use server-side session map for claude-agent-sdk conversation memory
Instead of round-tripping claude_session_id through the frontend, maintain an in-memory runtimeSessionId -> claude_session_id mapping on the backend. Both are lost on container restart, so in-memory storage is sufficient. No frontend changes required.
1 parent e997003 commit 4a21df1

2 files changed

Lines changed: 14 additions & 2 deletions

File tree

  • patterns

patterns/claude-agent-sdk-multi-agent/agent.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@
2727

2828
app = BedrockAgentCoreApp()
2929

30+
# Maps runtimeSessionId -> claude_session_id for conversation resumption.
31+
# Both are lost if the container restarts, so in-memory storage is sufficient.
32+
_session_map: dict[str, str] = {}
33+
3034

3135
@app.entrypoint
3236
async def main(payload, context: RequestContext):
@@ -46,7 +50,7 @@ async def main(payload, context: RequestContext):
4650
return
4751

4852
code_int_session_id = payload.get("code_int_session_id", "")
49-
claude_session_id = payload.get("claude_session_id")
53+
claude_session_id = _session_map.get(runtime_session_id)
5054

5155
# Extract user ID securely from validated JWT token
5256
user_id = extract_user_id_from_context(context)
@@ -171,6 +175,8 @@ async def _process_messages(options: ClaudeAgentOptions):
171175
pass
172176
elif isinstance(msg, ResultMessage):
173177
logger.info("ResultMessage received, session_id=%s", msg.session_id)
178+
if msg.session_id:
179+
_session_map[runtime_session_id] = msg.session_id
174180
yield {"claude_session_id": msg.session_id}
175181

176182
try:

patterns/claude-agent-sdk-single-agent/agent.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626

2727
app = BedrockAgentCoreApp()
2828

29+
# Maps runtimeSessionId -> claude_session_id for conversation resumption.
30+
# Both are lost if the container restarts, so in-memory storage is sufficient.
31+
_session_map: dict[str, str] = {}
32+
2933

3034
@app.entrypoint
3135
async def main(payload, context: RequestContext):
@@ -45,7 +49,7 @@ async def main(payload, context: RequestContext):
4549
return
4650

4751
code_int_session_id = payload.get("code_int_session_id", "")
48-
claude_session_id = payload.get("claude_session_id")
52+
claude_session_id = _session_map.get(runtime_session_id)
4953

5054
# Extract user ID securely from validated JWT token
5155
user_id = extract_user_id_from_context(context)
@@ -158,6 +162,8 @@ async def _process_messages(options: ClaudeAgentOptions):
158162
pass
159163
elif isinstance(msg, ResultMessage):
160164
logger.info("ResultMessage received, session_id=%s", msg.session_id)
165+
if msg.session_id:
166+
_session_map[runtime_session_id] = msg.session_id
161167
yield {"claude_session_id": msg.session_id}
162168

163169
try:

0 commit comments

Comments
 (0)