Spaces:
Sleeping
Sleeping
from langchain_core.utils.function_calling import convert_to_openai_function | |
from functions import tools | |
import re | |
import ast | |
def parse_args(args: str): | |
args = args.strip() | |
args = args.replace("true", "True") | |
args = args.replace("false", "False") | |
args = args.replace("null", "None") | |
args = args.replace("\"", "\"\"\"") | |
i = 0 | |
while args[i] != "\"" and args[i] != "\'" and i < len(args) - 1: | |
i += 1 | |
args = args[i:] | |
if args[-4:] != "True" and args[-5:] != "False": | |
i = len(args) - 1 | |
while args[i] != "\"" and args[i] != "\'" and i > 0: | |
i -= 1 | |
args = args[:i + 1] | |
print(args) | |
return ast.literal_eval("{" + args + "}") | |
def parse_tool_call(call: str): | |
call = call.strip() | |
name: bool = "\"name\": " in call or "\'name\':" in call | |
args: bool = "\"arguments\": " in call or "\'arguments\':" in call | |
if not name: | |
print({"arguments": {}, "name": "missing_function_call"}) | |
return {"arguments": {}, "name": "missing_function_call"} | |
if not args: | |
pattern = re.compile(r"\"name\": \"(.*?)\"|\'name\': \'(.*?)\'", re.DOTALL) | |
match = pattern.findall(call) | |
for n in match: | |
if isinstance(n, tuple): | |
n = n[0] | |
print({"arguments": {}, "name": n}) | |
return {"arguments": {}, "name": n} | |
args_pattern = re.compile(r"\"arguments\": {(.*?)}|\'arguments\': {(.*?)}", re.DOTALL) | |
args_match = args_pattern.findall(call) | |
for a in args_match: | |
print(a, "\n") | |
print(a[0]) | |
args = parse_args(a[0]) | |
name_pattern = re.compile(r"\"name\": \"(.*?)\"", re.DOTALL) | |
name_match = name_pattern.findall(call) | |
for n in name_match: | |
if isinstance(n, tuple): | |
n = n[0] | |
print({"arguments": args, "name": n}) | |
return {"arguments": args, "name": n} | |
def check_tool_call(call: dict): | |
global tools | |
tools = [convert_to_openai_function(t) for t in tools] | |
if call["name"] not in [t["name"] for t in tools]: | |
return "handle_tools_error", {"error": {"error": {"name": call["name"]}}} | |
tool = next((t for t in tools if t["name"] == call["name"]), None) | |
if set(list(tool["parameters"]["properties"])) != set(list(call["arguments"])): | |
print({"tool_response": {"error": {"expected": list(tool["parameters"]["properties"]), "received": list(call["arguments"])}, "name": call["name"]}}) | |
return "handle_tools_error", {"error": {"error": {"expected": list(tool["parameters"]["properties"]), "received": list(call["arguments"])}, "name": call["name"]}} | |
return call["name"], call["arguments"] |