Spaces:
Sleeping
Sleeping
| 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" | |
| f"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) | |