File size: 2,655 Bytes
9efba8b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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"]