Skip to content

feat: add session lifecycle management (create/reset/delete/title)

Hải Đặng Hoàng requested to merge feat/session-management into main

Bổ sung các thao tác quản lý session mà client cần để điều khiển một hội thoại như một "thread" độc lập:

  • POST /sessions tạo session rỗng, idempotent theo (username, session_id)
  • DELETE /sessions/{id} xóa mềm qua cột status, giữ dữ liệu cho LTM/audit
  • POST /sessions/{id}/reset xóa lịch sử nhưng giữ session_id để chat tiếp
  • PATCH /sessions/{id} đặt tiêu đề

Tiêu đề được đặt tự động bằng LLM ở background (TitleService), kích hoạt sau lượt trao đổi đầu tiên nên không nằm trên đường trả lời người dùng. Prompt viết bằng tiếng Anh để tiết kiệm token, output ràng buộc tiếng Việt. Fallback cắt theo ranh giới từ khi thiếu API key hoặc OpenAI lỗi.

Reset xóa cả summaries và facts của session, không chỉ messages: facts được rút ra từ chính các message vừa wipe, giữ lại thì trợ lý vẫn "nhớ" nội dung người dùng tưởng đã xóa. Long-term memory cấp user không bị ảnh hưởng.

Reset và delete đều invalidate Redis context cache và pending action — thiếu bước này thì orchestrator vẫn đọc được context đã xóa từ cache, và pending action (TTL 30 phút) sống dai hơn hội thoại sinh ra nó.

set_session_title refresh lại session sau commit: cột update_at có onupdate=func.now() nên sau UPDATE giá trị là SQL expression chưa đọc lại, chạm vào lúc serialize sẽ kích hoạt lazy-load và ném MissingGreenlet.

Tests: 50 test mới (14 unit mock OpenAI, 23 flow trên DB/Redis thật, 13 API qua ASGI). Toàn bộ suite 63/63 pass, không regression.

Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com

Merge request reports