fix(factory.py): ensure tool call converts image url

Fixes https://github.com/BerriAI/litellm/issues/6953
This commit is contained in:
Krrish Dholakia 2024-11-29 12:45:51 -08:00
parent bd59f18809
commit 828bf909fe
2 changed files with 99 additions and 5 deletions

View file

@ -1159,15 +1159,44 @@ def convert_to_anthropic_tool_result(
] ]
} }
""" """
content_str: str = "" anthropic_content: Union[
str,
List[Union[AnthropicMessagesToolResultContent, AnthropicMessagesImageParam]],
] = ""
if isinstance(message["content"], str): if isinstance(message["content"], str):
content_str = message["content"] anthropic_content = message["content"]
elif isinstance(message["content"], List): elif isinstance(message["content"], List):
content_list = message["content"] content_list = message["content"]
anthropic_content_list: List[
Union[AnthropicMessagesToolResultContent, AnthropicMessagesImageParam]
] = []
for content in content_list: for content in content_list:
if content["type"] == "text": if content["type"] == "text":
content_str += content["text"] anthropic_content_list.append(
AnthropicMessagesToolResultContent(
type="text",
text=content["text"],
)
)
elif content["type"] == "image_url":
if isinstance(content["image_url"], str):
image_chunk = convert_to_anthropic_image_obj(content["image_url"])
else:
image_chunk = convert_to_anthropic_image_obj(
content["image_url"]["url"]
)
anthropic_content_list.append(
AnthropicMessagesImageParam(
type="image",
source=AnthropicContentParamSource(
type="base64",
media_type=image_chunk["media_type"],
data=image_chunk["data"],
),
)
)
anthropic_content = anthropic_content_list
anthropic_tool_result: Optional[AnthropicMessagesToolResultParam] = None anthropic_tool_result: Optional[AnthropicMessagesToolResultParam] = None
## PROMPT CACHING CHECK ## ## PROMPT CACHING CHECK ##
cache_control = message.get("cache_control", None) cache_control = message.get("cache_control", None)
@ -1178,14 +1207,14 @@ def convert_to_anthropic_tool_result(
# We can't determine from openai message format whether it's a successful or # We can't determine from openai message format whether it's a successful or
# error call result so default to the successful result template # error call result so default to the successful result template
anthropic_tool_result = AnthropicMessagesToolResultParam( anthropic_tool_result = AnthropicMessagesToolResultParam(
type="tool_result", tool_use_id=tool_call_id, content=content_str type="tool_result", tool_use_id=tool_call_id, content=anthropic_content
) )
if message["role"] == "function": if message["role"] == "function":
function_message: ChatCompletionFunctionMessage = message function_message: ChatCompletionFunctionMessage = message
tool_call_id = function_message.get("tool_call_id") or str(uuid.uuid4()) tool_call_id = function_message.get("tool_call_id") or str(uuid.uuid4())
anthropic_tool_result = AnthropicMessagesToolResultParam( anthropic_tool_result = AnthropicMessagesToolResultParam(
type="tool_result", tool_use_id=tool_call_id, content=content_str type="tool_result", tool_use_id=tool_call_id, content=anthropic_content
) )
if anthropic_tool_result is None: if anthropic_tool_result is None:

File diff suppressed because one or more lines are too long