WilliamGazeley
Integrate working langchain ollama model
9efba8b
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"]