aidial_interceptors_sdk/utils/_reflection.py (29 lines of code) (raw):

import inspect from typing import Any, Awaitable, Callable, TypeVar from aidial_sdk.exceptions import InvalidRequestError T = TypeVar("T") async def call_with_extra_body( func: Callable[..., Awaitable[T]], arg: dict ) -> T: if _has_kwargs_argument(func): return await func(**arg) expected_args = set(inspect.signature(func).parameters.keys()) actual_args = set(arg.keys()) extra_args = actual_args - expected_args if extra_args and "extra_body" not in expected_args: raise InvalidRequestError( f"Unrecognized request argument supplied: {extra_args}." ) arg["extra_body"] = arg.get("extra_body") or {} arg["model"] = arg.get("model") # model arg is required in AsyncAzureOpenAI for extra_arg in extra_args: arg["extra_body"][extra_arg] = arg[extra_arg] del arg[extra_arg] return await func(**arg) def _has_kwargs_argument(func: Callable[..., Awaitable[Any]]) -> bool: """ Determines if the given function accepts a variable keyword argument (**kwargs). """ signature = inspect.signature(func) for param in signature.parameters.values(): if param.kind == inspect.Parameter.VAR_KEYWORD: print(param) return True return False