anthropic CUA - limit image message count (#2265)
This commit is contained in:
@@ -33,3 +33,4 @@ class ScrapeType(StrEnum):
|
|||||||
|
|
||||||
SCRAPE_TYPE_ORDER = [ScrapeType.NORMAL, ScrapeType.NORMAL, ScrapeType.RELOAD]
|
SCRAPE_TYPE_ORDER = [ScrapeType.NORMAL, ScrapeType.NORMAL, ScrapeType.RELOAD]
|
||||||
DEFAULT_MAX_TOKENS = 100000
|
DEFAULT_MAX_TOKENS = 100000
|
||||||
|
MAX_IMAGE_MESSAGES = 10
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import json_repair
|
|||||||
import litellm
|
import litellm
|
||||||
import structlog
|
import structlog
|
||||||
|
|
||||||
|
from skyvern.constants import MAX_IMAGE_MESSAGES
|
||||||
from skyvern.forge.sdk.api.llm.exceptions import EmptyLLMResponseError, InvalidLLMResponseFormat
|
from skyvern.forge.sdk.api.llm.exceptions import EmptyLLMResponseError, InvalidLLMResponseFormat
|
||||||
|
|
||||||
LOG = structlog.get_logger()
|
LOG = structlog.get_logger()
|
||||||
@@ -78,6 +79,7 @@ async def llm_messages_builder_with_history(
|
|||||||
if screenshots:
|
if screenshots:
|
||||||
for screenshot in screenshots:
|
for screenshot in screenshots:
|
||||||
encoded_image = base64.b64encode(screenshot).decode("utf-8")
|
encoded_image = base64.b64encode(screenshot).decode("utf-8")
|
||||||
|
message: dict[str, Any]
|
||||||
if message_pattern == "anthropic":
|
if message_pattern == "anthropic":
|
||||||
message = {
|
message = {
|
||||||
"type": "image",
|
"type": "image",
|
||||||
@@ -96,6 +98,39 @@ async def llm_messages_builder_with_history(
|
|||||||
}
|
}
|
||||||
current_user_messages.append(message)
|
current_user_messages.append(message)
|
||||||
messages.append({"role": "user", "content": current_user_messages})
|
messages.append({"role": "user", "content": current_user_messages})
|
||||||
|
# anthropic has hard limit of image & document messages (20 as of Apr 2025)
|
||||||
|
# limit the number of image type messages to 10 for anthropic
|
||||||
|
# delete the oldest image type message if the number of image type messages is greater than 10
|
||||||
|
if message_pattern == "anthropic":
|
||||||
|
image_message_count = 0
|
||||||
|
for message in messages:
|
||||||
|
if message.get("role") == "user":
|
||||||
|
blocks: list[dict[str, Any]] = message.get("content", [])
|
||||||
|
has_image = any(block.get("type") == "image" for block in blocks)
|
||||||
|
if has_image:
|
||||||
|
image_message_count += 1
|
||||||
|
|
||||||
|
images_to_delete = image_message_count - MAX_IMAGE_MESSAGES
|
||||||
|
if images_to_delete > 0:
|
||||||
|
new_messages = []
|
||||||
|
for message in messages:
|
||||||
|
if message.get("role") != "user":
|
||||||
|
new_messages.append(message)
|
||||||
|
continue
|
||||||
|
blocks = message.get("content", [])
|
||||||
|
has_image = any(block.get("type") == "image" for block in blocks)
|
||||||
|
new_content = []
|
||||||
|
if has_image and images_to_delete > 0:
|
||||||
|
images_to_delete -= 1
|
||||||
|
for block in blocks:
|
||||||
|
if block.get("type") != "image":
|
||||||
|
new_content.append(block)
|
||||||
|
if new_content:
|
||||||
|
new_messages.append({"role": "user", "content": new_content})
|
||||||
|
else:
|
||||||
|
new_messages.append(message)
|
||||||
|
messages = new_messages
|
||||||
|
|
||||||
return messages
|
return messages
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user