from typing import Dict, Any, Optional
from phi.tools.function import Function, FunctionCall
from phi.utils.functions import get_function_call
def get_function_call_for_tool_call(
tool_call: Dict[str, Any], functions: Optional[Dict[str, Function]] = None
) -> Optional[FunctionCall]:
if tool_call.get("type") == "function":
_tool_call_id = tool_call.get("id")
_tool_call_function = tool_call.get("function")
if _tool_call_function is not None:
_tool_call_function_name = _tool_call_function.get("name")
_tool_call_function_arguments_str = _tool_call_function.get("arguments")
if _tool_call_function_name is not None:
return get_function_call(
name=_tool_call_function_name,
arguments=_tool_call_function_arguments_str,
call_id=_tool_call_id,
functions=functions,
)
return None
def extract_tool_call_from_string(text: str, start_tag: str = "", end_tag: str = ""):
start_index = text.find(start_tag) + len(start_tag)
end_index = text.find(end_tag)
# Extracting the content between the tags
return text[start_index:end_index].strip()
def remove_tool_calls_from_string(text: str, start_tag: str = "", end_tag: str = ""):
"""Remove multiple tool calls from a string."""
while start_tag in text and end_tag in text:
start_index = text.find(start_tag)
end_index = text.find(end_tag) + len(end_tag)
text = text[:start_index] + text[end_index:]
return text
def extract_tool_from_xml(xml_str):
# Find tool_name
tool_name_start = xml_str.find("") + len("")
tool_name_end = xml_str.find("")
tool_name = xml_str[tool_name_start:tool_name_end].strip()
# Find and process parameters block
params_start = xml_str.find("") + len("")
params_end = xml_str.find("")
parameters_block = xml_str[params_start:params_end].strip()
# Extract individual parameters
arguments = {}
while parameters_block:
# Find the next tag and its closing
tag_start = parameters_block.find("<") + 1
tag_end = parameters_block.find(">")
tag_name = parameters_block[tag_start:tag_end]
# Find the tag's closing counterpart
value_start = tag_end + 1
value_end = parameters_block.find(f"{tag_name}>")
value = parameters_block[value_start:value_end].strip()
# Add to arguments
arguments[tag_name] = value
# Move past this tag
parameters_block = parameters_block[value_end + len(f"{tag_name}>") :].strip()
return {"tool_name": tool_name, "parameters": arguments}
def remove_function_calls_from_string(
text: str, start_tag: str = "", end_tag: str = ""
):
"""Remove multiple function calls from a string."""
while start_tag in text and end_tag in text:
start_index = text.find(start_tag)
end_index = text.find(end_tag) + len(end_tag)
text = text[:start_index] + text[end_index:]
return text