Spaces:
Runtime error
Runtime error
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 | |