@@ -171,6 +171,57 @@ def _build_window_from_items(
171171
172172 return aggregated_item
173173
174+ def _process_string_fine (
175+ self ,
176+ fast_memory_items : list [TextualMemoryItem ],
177+ info : dict [str , Any ],
178+ custom_tags : list [str ] | None = None ,
179+ ) -> list [TextualMemoryItem ]:
180+ """
181+ Process fast mode memory items through LLM to generate fine mode memories.
182+ """
183+ if not fast_memory_items :
184+ return []
185+
186+ fine_memory_items = []
187+
188+ for fast_item in fast_memory_items :
189+ # Extract memory text (string content)
190+ mem_str = fast_item .memory or ""
191+ if not mem_str .strip ():
192+ continue
193+ sources = fast_item .metadata .sources or []
194+ if not isinstance (sources , list ):
195+ sources = [sources ]
196+ try :
197+ resp = self ._get_llm_response (mem_str , custom_tags )
198+ except Exception as e :
199+ logger .error (f"[MultiModalFine] Error calling LLM: { e } " )
200+ continue
201+ for m in resp .get ("memory list" , []):
202+ try :
203+ # Normalize memory_type (same as simple_struct)
204+ memory_type = (
205+ m .get ("memory_type" , "LongTermMemory" )
206+ .replace ("长期记忆" , "LongTermMemory" )
207+ .replace ("用户记忆" , "UserMemory" )
208+ )
209+ # Create fine mode memory item (same as simple_struct)
210+ node = self ._make_memory_item (
211+ value = m .get ("value" , "" ),
212+ info = info ,
213+ memory_type = memory_type ,
214+ tags = m .get ("tags" , []),
215+ key = m .get ("key" , "" ),
216+ sources = sources , # Preserve sources from fast item
217+ background = resp .get ("summary" , "" ),
218+ )
219+ fine_memory_items .append (node )
220+ except Exception as e :
221+ logger .error (f"[MultiModalFine] parse error: { e } " )
222+
223+ return fine_memory_items
224+
174225 @timed
175226 def _process_multi_modal_data (
176227 self , scene_data_info : MessagesType , info , mode : str = "fine" , ** kwargs
@@ -208,21 +259,21 @@ def _process_multi_modal_data(
208259 if mode == "fast" :
209260 return fast_memory_items
210261 else :
211- # TODO: parallel call llm and get fine multimodal items
212262 # Part A: call llm
213263 fine_memory_items = []
214- fine_memory_items_string_parser = fast_memory_items
264+ fine_memory_items_string_parser = self ._process_string_fine (
265+ fast_memory_items , info , custom_tags
266+ )
215267 fine_memory_items .extend (fine_memory_items_string_parser )
216- # Part B: get fine multimodal items
217268
269+ # Part B: get fine multimodal items
218270 for fast_item in fast_memory_items :
219271 sources = fast_item .metadata .sources
220272 for source in sources :
221273 items = self .multi_modal_parser .process_transfer (
222274 source , context_items = [fast_item ], custom_tags = custom_tags
223275 )
224276 fine_memory_items .extend (items )
225- logger .warning ("Not Implemented Now!" )
226277 return fine_memory_items
227278
228279 @timed
@@ -251,7 +302,7 @@ def _process_transfer_multi_modal_data(
251302
252303 fine_memory_items = []
253304 # Part A: call llm
254- fine_memory_items_string_parser = []
305+ fine_memory_items_string_parser = self . _process_string_fine ([ raw_node ], info , custom_tags )
255306 fine_memory_items .extend (fine_memory_items_string_parser )
256307 # Part B: get fine multimodal items
257308 for source in sources :
0 commit comments