Spaces:
Sleeping
Sleeping
| 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 = "<tool_call>", end_tag: str = "</tool_call>"): | |
| 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 = "<tool_call>", end_tag: str = "</tool_call>"): | |
| """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("<tool_name>") + len("<tool_name>") | |
| tool_name_end = xml_str.find("</tool_name>") | |
| tool_name = xml_str[tool_name_start:tool_name_end].strip() | |
| # Find and process parameters block | |
| params_start = xml_str.find("<parameters>") + len("<parameters>") | |
| params_end = xml_str.find("</parameters>") | |
| 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 = "<function_calls>", end_tag: str = "</function_calls>" | |
| ): | |
| """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 | |