Skip to content

Commit 117031d

Browse files
committed
simplify log if messages contain base64 data
1 parent e545032 commit 117031d

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

metagpt/provider/base_llm.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,38 @@ def get_costs(self) -> Costs:
142142
return Costs(0, 0, 0, 0)
143143
return self.cost_manager.get_costs()
144144

145+
def mask_base64_data(self, msg: dict) -> dict:
146+
"""Process the base64 image data in the message, replacing it with placeholders for easier logging
147+
148+
Args:
149+
msg (dict): A dictionary of messages in OpenAI format
150+
151+
Returns:
152+
dict: This is the processed message dictionary with the image data replaced with placeholders
153+
"""
154+
if not isinstance(msg, dict):
155+
return msg
156+
157+
new_msg = msg.copy()
158+
content = new_msg.get("content")
159+
img_base64_prefix = "data:image/"
160+
161+
if isinstance(content, list):
162+
# Handling multimodal content (like gpt-4v format)
163+
new_content = []
164+
for item in content:
165+
if isinstance(item, dict) and item.get("type") == "image_url":
166+
image_url = item.get("image_url", {}).get("url", "")
167+
if image_url.startswith(img_base64_prefix):
168+
item = item.copy()
169+
item["image_url"] = {"url": "<Image base64 data has been omitted>"}
170+
new_content.append(item)
171+
new_msg["content"] = new_content
172+
elif isinstance(content, str) and img_base64_prefix in content:
173+
# Process plain text messages containing base64 image data
174+
new_msg["content"] = "<Messages containing image base64 data have been omitted>"
175+
return new_msg
176+
145177
async def aask(
146178
self,
147179
msg: Union[str, list[dict[str, str]]],
@@ -165,7 +197,11 @@ async def aask(
165197
message.extend(msg)
166198
if stream is None:
167199
stream = self.config.stream
168-
logger.debug(message)
200+
201+
# the image data is replaced with placeholders to avoid long output
202+
masked_message = [self.mask_base64_data(m) for m in message]
203+
logger.debug(masked_message)
204+
169205
compressed_message = self.compress_messages(message, compress_type=self.config.compress_type)
170206
rsp = await self.acompletion_text(compressed_message, stream=stream, timeout=self.get_timeout(timeout))
171207
# rsp = await self.acompletion_text(message, stream=stream, timeout=self.get_timeout(timeout))

metagpt/provider/constant.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,12 @@
3434
MULTI_MODAL_MODELS = [
3535
"gpt-4o",
3636
"gpt-4o-mini",
37+
"openai/gpt-4o",
38+
"gemini-2.0-flash-exp",
39+
"gemini-2.0-pro-exp-02-05",
40+
"claude-3-5-sonnet-v2",
41+
"google/gemini-2.0-flash-exp:free",
42+
"google/gemini-2.0-pro-exp-02-05:free",
43+
"anthropic/claude-3.5-sonnet",
44+
"anthropic/claude-3.7-sonnet",
3745
]

0 commit comments

Comments
 (0)