Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions backend/chainlit/chat_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ def clear(self) -> None:
if context.session and context.session.id in chat_contexts:
chat_contexts[context.session.id] = []

def delete_session(self, session_id: str) -> None:
"""Remove a session's chat context to free memory."""
chat_contexts.pop(session_id, None)

def to_openai(self):
messages = []
for message in self.get():
Expand Down
2 changes: 2 additions & 0 deletions backend/chainlit/socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,8 @@ async def clear(_sid):
# Clean up the user session
if session.id in user_sessions:
user_sessions.pop(session.id)
# Clean up the chat context
chat_context.delete_session(session.id)
# Clean up the session
await session.delete()

Expand Down
28 changes: 28 additions & 0 deletions backend/tests/test_chat_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,34 @@ def test_clear_existing_context(self):
assert "session_123" in chat_contexts
assert chat_contexts["session_123"] == []

def test_delete_session_removes_entry(self):
"""Test delete_session removes the session context."""
mock_session = Mock()
mock_session.id = "session_123"
mock_message = Mock()

with mock_chainlit_context(session=mock_session):
chat_context.add(mock_message)

chat_context.delete_session("session_123")

assert "session_123" not in chat_contexts

def test_delete_session_nonexistent(self):
"""Test delete_session does nothing for an unknown session."""
chat_context.delete_session("unknown_session")

assert chat_contexts == {}

def test_delete_session_without_session(self):
"""Test delete_session works with an explicit ID and no context."""
chat_contexts["session_123"] = [Mock()]

with mock_chainlit_context(session=None):
chat_context.delete_session("session_123")

assert "session_123" not in chat_contexts

def test_to_openai_with_assistant_message(self):
"""Test to_openai converts assistant messages correctly."""
mock_session = Mock()
Expand Down