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"") 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"") :].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