@@ -66,31 +66,81 @@ async def compact_messages_for_request(
6666 if not compacted_messages or not recent_messages :
6767 return messages , previous_summary , False
6868
69- summary = await _generate_summary (
70- request ,
71- user ,
72- model_id ,
73- models ,
74- compacted_messages ,
75- recent_messages ,
76- previous_summary ,
77- config ['prompt_template' ],
78- )
69+ event_emitter = None
70+ if metadata .get ('chat_id' ) and metadata .get ('message_id' ):
71+ from open_webui .socket .main import get_event_emitter
72+
73+ event_emitter = await get_event_emitter (metadata )
74+
75+ if event_emitter :
76+ await event_emitter (
77+ {
78+ 'type' : 'context_compaction' ,
79+ 'data' : {
80+ 'action' : 'context_compaction' ,
81+ 'description' : 'Compacting context' ,
82+ 'done' : False ,
83+ },
84+ }
85+ )
86+
87+ try :
88+ summary = await _generate_summary (
89+ request ,
90+ user ,
91+ model_id ,
92+ models ,
93+ compacted_messages ,
94+ recent_messages ,
95+ previous_summary ,
96+ config ['prompt_template' ],
97+ )
98+ except Exception :
99+ if event_emitter :
100+ await event_emitter (
101+ {
102+ 'type' : 'context_compaction' ,
103+ 'data' : {
104+ 'action' : 'context_compaction' ,
105+ 'description' : 'Context compaction failed' ,
106+ 'done' : True ,
107+ 'error' : True ,
108+ },
109+ }
110+ )
111+ raise
79112
80113 chat_id = metadata .get ('chat_id' )
81- message_id = metadata .get ('message_id' )
82- if chat_id and message_id and not chat_id .startswith (('local:' , 'channel:' )):
83- await Chats .upsert_message_to_chat_by_id_and_message_id (chat_id , message_id , {'contextSummary' : summary })
114+ checkpoint_message_id = metadata .get ('user_message_id' ) or metadata .get ('message_id' )
115+ if chat_id and checkpoint_message_id and not chat_id .startswith (('local:' , 'channel:' )):
116+ await Chats .upsert_message_to_chat_by_id_and_message_id (
117+ chat_id ,
118+ checkpoint_message_id ,
119+ {'contextSummary' : summary },
120+ )
84121
85122 log .info (
86- 'Compacted chat context for chat=%s message =%s dropped=%d kept=%d summary_chars=%d' ,
123+ 'Compacted chat context for chat=%s checkpoint=%s response =%s dropped=%d kept=%d summary_chars=%d' ,
87124 chat_id ,
88- message_id ,
125+ checkpoint_message_id ,
126+ metadata .get ('message_id' ),
89127 len (compacted_messages ),
90128 len (recent_messages ),
91129 len (summary ),
92130 )
93131
132+ if event_emitter :
133+ await event_emitter (
134+ {
135+ 'type' : 'context_compaction' ,
136+ 'data' : {
137+ 'action' : 'context_compaction' ,
138+ 'description' : 'Context compacted' ,
139+ 'done' : True ,
140+ },
141+ }
142+ )
143+
94144 return recent_messages , summary , True
95145
96146
0 commit comments