AmmarFahmy
adding all files
105b369
import json
from typing import Optional, Dict, Any
from phi.tools.function import Function, FunctionCall
from phi.utils.log import logger
def get_function_call(
name: str,
arguments: Optional[str] = None,
call_id: Optional[str] = None,
functions: Optional[Dict[str, Function]] = None,
) -> Optional[FunctionCall]:
logger.debug(f"Getting function {name}")
if functions is None:
return None
function_to_call: Optional[Function] = None
if name in functions:
function_to_call = functions[name]
if function_to_call is None:
logger.error(f"Function {name} not found")
return None
function_call = FunctionCall(function=function_to_call)
if call_id is not None:
function_call.call_id = call_id
if arguments is not None and arguments != "":
try:
if function_to_call.sanitize_arguments:
if "None" in arguments:
arguments = arguments.replace("None", "null")
if "True" in arguments:
arguments = arguments.replace("True", "true")
if "False" in arguments:
arguments = arguments.replace("False", "false")
_arguments = json.loads(arguments)
except Exception as e:
logger.error(f"Unable to decode function arguments:\n{arguments}\nError: {e}")
function_call.error = f"Error while decoding function arguments: {e}\n\n Please make sure we can json.loads() the arguments and retry."
return function_call
if not isinstance(_arguments, dict):
logger.error(f"Function arguments are not a valid JSON object: {arguments}")
function_call.error = "Function arguments are not a valid JSON object.\n\n Please fix and retry."
return function_call
try:
clean_arguments: Dict[str, Any] = {}
for k, v in _arguments.items():
if isinstance(v, str):
_v = v.strip().lower()
if _v in ("none", "null"):
clean_arguments[k] = None
elif _v == "true":
clean_arguments[k] = True
elif _v == "false":
clean_arguments[k] = False
else:
clean_arguments[k] = v.strip()
else:
clean_arguments[k] = v
function_call.arguments = clean_arguments
except Exception as e:
logger.error(f"Unable to parsing function arguments:\n{arguments}\nError: {e}")
function_call.error = f"Error while parsing function arguments: {e}\n\n Please fix and retry."
return function_call
return function_call
# def run_function(func, *args, **kwargs):
# if asyncio.iscoroutinefunction(func):
# logger.debug("Running asynchronous function")
# try:
# loop = asyncio.get_running_loop()
# except RuntimeError as e: # No running event loop
# logger.debug(f"Could not get running event loop: {e}")
# logger.debug("Running with a new event loop")
# loop = asyncio.new_event_loop()
# asyncio.set_event_loop(loop)
# result = loop.run_until_complete(func(*args, **kwargs))
# loop.close()
# logger.debug("Done running with a new event loop")
# return result
# else: # There is a running event loop
# logger.debug("Running in existing event loop")
# result = loop.run_until_complete(func(*args, **kwargs))
# logger.debug("Done running in existing event loop")
# return result
# else: # The function is a synchronous function
# logger.debug("Running synchronous function")
# return func(*args, **kwargs)