Skip to content

Commit 345c2e8

Browse files
toller892Hermes Semantic Memory
authored andcommitted
fix: prevent AttributeError in parse_vision_messages when llm is None
parse_vision_messages() defaults llm=None (vision disabled), but unconditionally calls get_image_description() → llm.generate_response() for list-typed and image_url-dict content. This crashes with AttributeError: 'NoneType' object has no attribute 'generate_response' when any message uses the standard multimodal content format. Fix: - Fast-path return when llm is None (no vision processing needed) - For list-typed content, check if items actually contain image_url before calling vision processing; pass through text-only lists Fixes #4799
1 parent 6d3486c commit 345c2e8

1 file changed

Lines changed: 18 additions & 4 deletions

File tree

mem0/memory/utils.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,15 @@ def get_image_description(image_obj, llm, vision_details):
169169

170170
def parse_vision_messages(messages, llm=None, vision_details="auto"):
171171
"""
172-
Parse the vision messages from the messages
172+
Parse the vision messages from the messages.
173+
174+
When llm is None (vision disabled), messages are returned unchanged.
175+
When llm is provided, image content is replaced with generated descriptions.
173176
"""
177+
# Fast path: no LLM means no vision processing needed
178+
if llm is None:
179+
return messages
180+
174181
returned_messages = []
175182
for msg in messages:
176183
if msg["role"] == "system":
@@ -179,9 +186,16 @@ def parse_vision_messages(messages, llm=None, vision_details="auto"):
179186

180187
# Handle message content
181188
if isinstance(msg["content"], list):
182-
# Multiple image URLs in content
183-
description = get_image_description(msg, llm, vision_details)
184-
returned_messages.append({"role": msg["role"], "content": description})
189+
# Check if content actually contains images before calling vision
190+
has_image = any(
191+
isinstance(item, dict) and item.get("type") == "image_url"
192+
for item in msg["content"]
193+
)
194+
if has_image:
195+
description = get_image_description(msg, llm, vision_details)
196+
returned_messages.append({"role": msg["role"], "content": description})
197+
else:
198+
returned_messages.append(msg)
185199
elif isinstance(msg["content"], dict) and msg["content"].get("type") == "image_url":
186200
# Single image content
187201
image_url = msg["content"]["image_url"]["url"]

0 commit comments

Comments
 (0)