lionagi 0.0.306__py3-none-any.whl → 0.0.308__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lionagi/__init__.py +2 -5
- lionagi/core/__init__.py +7 -5
- lionagi/core/agent/__init__.py +3 -0
- lionagi/core/agent/base_agent.py +10 -12
- lionagi/core/branch/__init__.py +4 -0
- lionagi/core/branch/base_branch.py +81 -81
- lionagi/core/branch/branch.py +16 -28
- lionagi/core/branch/branch_flow_mixin.py +3 -7
- lionagi/core/branch/executable_branch.py +86 -56
- lionagi/core/branch/util.py +77 -162
- lionagi/core/{flow/direct → direct}/__init__.py +1 -1
- lionagi/core/{flow/direct/predict.py → direct/parallel_predict.py} +39 -17
- lionagi/core/direct/parallel_react.py +0 -0
- lionagi/core/direct/parallel_score.py +0 -0
- lionagi/core/direct/parallel_select.py +0 -0
- lionagi/core/direct/parallel_sentiment.py +0 -0
- lionagi/core/direct/predict.py +174 -0
- lionagi/core/{flow/direct → direct}/react.py +2 -2
- lionagi/core/{flow/direct → direct}/score.py +28 -23
- lionagi/core/{flow/direct → direct}/select.py +48 -45
- lionagi/core/direct/utils.py +83 -0
- lionagi/core/flow/monoflow/ReAct.py +6 -5
- lionagi/core/flow/monoflow/__init__.py +9 -0
- lionagi/core/flow/monoflow/chat.py +10 -10
- lionagi/core/flow/monoflow/chat_mixin.py +11 -10
- lionagi/core/flow/monoflow/followup.py +6 -5
- lionagi/core/flow/polyflow/__init__.py +1 -0
- lionagi/core/flow/polyflow/chat.py +15 -3
- lionagi/core/mail/mail_manager.py +18 -19
- lionagi/core/mail/schema.py +5 -4
- lionagi/core/messages/schema.py +18 -20
- lionagi/core/prompt/__init__.py +0 -0
- lionagi/core/prompt/prompt_template.py +0 -0
- lionagi/core/schema/__init__.py +2 -2
- lionagi/core/schema/action_node.py +11 -3
- lionagi/core/schema/base_mixin.py +56 -59
- lionagi/core/schema/base_node.py +34 -37
- lionagi/core/schema/condition.py +24 -0
- lionagi/core/schema/data_logger.py +96 -99
- lionagi/core/schema/data_node.py +19 -19
- lionagi/core/schema/prompt_template.py +0 -0
- lionagi/core/schema/structure.py +171 -169
- lionagi/core/session/__init__.py +1 -3
- lionagi/core/session/session.py +196 -214
- lionagi/core/tool/tool_manager.py +95 -103
- lionagi/integrations/__init__.py +1 -3
- lionagi/integrations/bridge/langchain_/documents.py +17 -18
- lionagi/integrations/bridge/langchain_/langchain_bridge.py +14 -14
- lionagi/integrations/bridge/llamaindex_/llama_index_bridge.py +22 -22
- lionagi/integrations/bridge/llamaindex_/node_parser.py +12 -12
- lionagi/integrations/bridge/llamaindex_/reader.py +11 -11
- lionagi/integrations/bridge/llamaindex_/textnode.py +7 -7
- lionagi/integrations/config/openrouter_configs.py +0 -1
- lionagi/integrations/provider/oai.py +26 -26
- lionagi/integrations/provider/services.py +38 -38
- lionagi/libs/__init__.py +34 -1
- lionagi/libs/ln_api.py +211 -221
- lionagi/libs/ln_async.py +53 -60
- lionagi/libs/ln_convert.py +118 -120
- lionagi/libs/ln_dataframe.py +32 -33
- lionagi/libs/ln_func_call.py +334 -342
- lionagi/libs/ln_nested.py +99 -107
- lionagi/libs/ln_parse.py +161 -165
- lionagi/libs/sys_util.py +52 -52
- lionagi/tests/test_core/test_session.py +254 -266
- lionagi/tests/test_core/test_session_base_util.py +299 -300
- lionagi/tests/test_core/test_tool_manager.py +70 -74
- lionagi/tests/test_libs/test_nested.py +2 -7
- lionagi/tests/test_libs/test_parse.py +2 -2
- lionagi/version.py +1 -1
- {lionagi-0.0.306.dist-info → lionagi-0.0.308.dist-info}/METADATA +4 -2
- lionagi-0.0.308.dist-info/RECORD +115 -0
- lionagi/core/flow/direct/utils.py +0 -43
- lionagi-0.0.306.dist-info/RECORD +0 -106
- /lionagi/core/{flow/direct → direct}/sentiment.py +0 -0
- {lionagi-0.0.306.dist-info → lionagi-0.0.308.dist-info}/LICENSE +0 -0
- {lionagi-0.0.306.dist-info → lionagi-0.0.308.dist-info}/WHEEL +0 -0
- {lionagi-0.0.306.dist-info → lionagi-0.0.308.dist-info}/top_level.txt +0 -0
    
        lionagi/libs/sys_util.py
    CHANGED
    
    | @@ -12,7 +12,6 @@ from hashlib import sha256 | |
| 12 12 | 
             
            from pathlib import Path
         | 
| 13 13 | 
             
            from typing import Any
         | 
| 14 14 |  | 
| 15 | 
            -
             | 
| 16 15 | 
             
            _timestamp_syms = ["-", ":", "."]
         | 
| 17 16 |  | 
| 18 17 | 
             
            PATH_TYPE = str | Path
         | 
| @@ -26,36 +25,39 @@ class SysUtil: | |
| 26 25 | 
             
                    Pauses execution for a specified duration.
         | 
| 27 26 |  | 
| 28 27 | 
             
                    Args:
         | 
| 29 | 
            -
             | 
| 28 | 
            +
                            delay (float): The amount of time, in seconds, to pause execution.
         | 
| 30 29 | 
             
                    """
         | 
| 31 30 | 
             
                    time.sleep(delay)
         | 
| 32 31 |  | 
| 33 32 | 
             
                @staticmethod
         | 
| 34 | 
            -
                def get_now(datetime_: bool = False) -> float | datetime:
         | 
| 33 | 
            +
                def get_now(datetime_: bool = False, tz=None) -> float | datetime:
         | 
| 35 34 | 
             
                    """Returns the current time either as a Unix timestamp or a datetime object.
         | 
| 36 35 |  | 
| 37 36 | 
             
                    Args:
         | 
| 38 | 
            -
             | 
| 37 | 
            +
                            datetime_ (bool): If True, returns a datetime object; otherwise, returns a Unix timestamp.
         | 
| 39 38 |  | 
| 40 39 | 
             
                    Returns:
         | 
| 41 | 
            -
             | 
| 40 | 
            +
                            Union[float, datetime.datetime]: The current time as a Unix timestamp or a datetime object.
         | 
| 42 41 | 
             
                    """
         | 
| 42 | 
            +
             | 
| 43 43 | 
             
                    if not datetime_:
         | 
| 44 44 | 
             
                        return time.time()
         | 
| 45 | 
            -
                     | 
| 46 | 
            -
             | 
| 45 | 
            +
                    config_ = {}
         | 
| 46 | 
            +
                    if tz:
         | 
| 47 | 
            +
                        config_["tz"] = tz if isinstance(tz, timezone) else timezone.utc
         | 
| 48 | 
            +
                    return datetime.now(**config_)
         | 
| 47 49 |  | 
| 48 50 | 
             
                @staticmethod
         | 
| 49 51 | 
             
                def change_dict_key(dict_: dict[Any, Any], old_key: str, new_key: str) -> None:
         | 
| 50 52 | 
             
                    """Safely changes a key in a dictionary if the old key exists.
         | 
| 51 53 |  | 
| 52 54 | 
             
                    Args:
         | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 55 | 
            +
                            dict_ (Dict[Any, Any]): The dictionary in which to change the key.
         | 
| 56 | 
            +
                            old_key (str): The old key to be changed.
         | 
| 57 | 
            +
                            new_key (str): The new key to replace the old key.
         | 
| 56 58 |  | 
| 57 59 | 
             
                    Returns:
         | 
| 58 | 
            -
             | 
| 60 | 
            +
                            None
         | 
| 59 61 | 
             
                    """
         | 
| 60 62 | 
             
                    if old_key in dict_:
         | 
| 61 63 | 
             
                        dict_[new_key] = dict_.pop(old_key)
         | 
| @@ -65,11 +67,11 @@ class SysUtil: | |
| 65 67 | 
             
                    """Returns a timestamp string with optional custom separators and timezone.
         | 
| 66 68 |  | 
| 67 69 | 
             
                    Args:
         | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            +
                            tz (timezone): The timezone for the timestamp.
         | 
| 71 | 
            +
                            sep (str): The separator to use in the timestamp string, replacing '-', ':', and '.'.
         | 
| 70 72 |  | 
| 71 73 | 
             
                    Returns:
         | 
| 72 | 
            -
             | 
| 74 | 
            +
                            str: A string representation of the current timestamp.
         | 
| 73 75 | 
             
                    """
         | 
| 74 76 | 
             
                    str_ = datetime.now(tz=tz).isoformat()
         | 
| 75 77 | 
             
                    if sep is not None:
         | 
| @@ -90,11 +92,11 @@ class SysUtil: | |
| 90 92 | 
             
                    """Creates deep copies of the input, either as a single copy or a list of copies.
         | 
| 91 93 |  | 
| 92 94 | 
             
                    Args:
         | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            +
                            input_ (Any): The input to be copied.
         | 
| 96 | 
            +
                            num (int): The number of copies to create.
         | 
| 95 97 |  | 
| 96 98 | 
             
                    Returns:
         | 
| 97 | 
            -
             | 
| 99 | 
            +
                            Union[Any, List[Any]]: A single copy of the input or a list of deep copies.
         | 
| 98 100 | 
             
                    """
         | 
| 99 101 | 
             
                    if num < 1:
         | 
| 100 102 | 
             
                        raise ValueError(f"'num' must be a positive integer: {num}")
         | 
| @@ -110,10 +112,10 @@ class SysUtil: | |
| 110 112 | 
             
                    Generates a unique identifier based on the current time and random bytes.
         | 
| 111 113 |  | 
| 112 114 | 
             
                    Args:
         | 
| 113 | 
            -
             | 
| 115 | 
            +
                            n (int): The length of the generated identifier.
         | 
| 114 116 |  | 
| 115 117 | 
             
                    Returns:
         | 
| 116 | 
            -
             | 
| 118 | 
            +
                            str: A unique identifier string.
         | 
| 117 119 | 
             
                    """
         | 
| 118 120 | 
             
                    current_time = datetime.now().isoformat().encode("utf-8")
         | 
| 119 121 | 
             
                    random_bytes = os.urandom(42)
         | 
| @@ -124,11 +126,11 @@ class SysUtil: | |
| 124 126 | 
             
                    """Organizes indices of strings into bins based on a cumulative upper limit.
         | 
| 125 127 |  | 
| 126 128 | 
             
                    Args:
         | 
| 127 | 
            -
             | 
| 128 | 
            -
             | 
| 129 | 
            +
                            input_ (List[str]): The list of strings to be binned.
         | 
| 130 | 
            +
                            upper (int): The cumulative length upper limit for each bin.
         | 
| 129 131 |  | 
| 130 132 | 
             
                    Returns:
         | 
| 131 | 
            -
             | 
| 133 | 
            +
                            List[List[int]]: A list of bins, each bin is a list of indices from the input list.
         | 
| 132 134 | 
             
                    """
         | 
| 133 135 | 
             
                    current = 0
         | 
| 134 136 | 
             
                    bins = []
         | 
| @@ -152,12 +154,10 @@ class SysUtil: | |
| 152 154 | 
             
                    This method categorizes some architectures as 'apple_silicon'.
         | 
| 153 155 |  | 
| 154 156 | 
             
                    Returns:
         | 
| 155 | 
            -
             | 
| 157 | 
            +
                            str: A string identifying the CPU architecture ('apple_silicon' or 'other_cpu').
         | 
| 156 158 | 
             
                    """
         | 
| 157 159 | 
             
                    arch: str = platform.machine().lower()
         | 
| 158 | 
            -
                    if "arm" in arch or "aarch64" in arch | 
| 159 | 
            -
                        return "apple_silicon"
         | 
| 160 | 
            -
                    return "other_cpu"
         | 
| 160 | 
            +
                    return "apple_silicon" if "arm" in arch or "aarch64" in arch else "other_cpu"
         | 
| 161 161 |  | 
| 162 162 | 
             
                @staticmethod
         | 
| 163 163 | 
             
                def install_import(
         | 
| @@ -172,10 +172,10 @@ class SysUtil: | |
| 172 172 | 
             
                    to install the package using pip and then retries the import.
         | 
| 173 173 |  | 
| 174 174 | 
             
                    Args:
         | 
| 175 | 
            -
             | 
| 176 | 
            -
             | 
| 177 | 
            -
             | 
| 178 | 
            -
             | 
| 175 | 
            +
                            package_name: The base name of the package to import.
         | 
| 176 | 
            +
                            module_name: The submodule name to import from the package, if applicable. Defaults to None.
         | 
| 177 | 
            +
                            import_name: The specific name to import from the module or package. Defaults to None.
         | 
| 178 | 
            +
                            pip_name: The pip package name if different from `package_name`. Defaults to None.
         | 
| 179 179 |  | 
| 180 180 | 
             
                    Prints a message indicating success or attempts installation if the import fails.
         | 
| 181 181 | 
             
                    """
         | 
| @@ -213,10 +213,10 @@ class SysUtil: | |
| 213 213 | 
             
                    """Checks if a package is currently installed.
         | 
| 214 214 |  | 
| 215 215 | 
             
                    Args:
         | 
| 216 | 
            -
             | 
| 216 | 
            +
                            package_name: The name of the package to check.
         | 
| 217 217 |  | 
| 218 218 | 
             
                    Returns:
         | 
| 219 | 
            -
             | 
| 219 | 
            +
                            A boolean indicating whether the package is installed.
         | 
| 220 220 | 
             
                    """
         | 
| 221 221 | 
             
                    package_spec = importlib.util.find_spec(package_name)
         | 
| 222 222 | 
             
                    return package_spec is not None
         | 
| @@ -236,12 +236,12 @@ class SysUtil: | |
| 236 236 | 
             
                    it attempts to install the package using `install_import` and then retries the import.
         | 
| 237 237 |  | 
| 238 238 | 
             
                    Args:
         | 
| 239 | 
            -
             | 
| 240 | 
            -
             | 
| 241 | 
            -
             | 
| 242 | 
            -
             | 
| 243 | 
            -
             | 
| 244 | 
            -
             | 
| 239 | 
            +
                            package_name: The name of the package to check and potentially install.
         | 
| 240 | 
            +
                            module_name: The submodule name to import from the package, if applicable. Defaults to None.
         | 
| 241 | 
            +
                            import_name: The specific name to import from the module or package. Defaults to None.
         | 
| 242 | 
            +
                            pip_name: The pip package name if different from `package_name`. Defaults to None.
         | 
| 243 | 
            +
                            attempt_install: If attempt to install the package if uninstalled. Defaults to True.
         | 
| 244 | 
            +
                            error_message: Error message when the package is not installed and not attempt to install.
         | 
| 245 245 | 
             
                    """
         | 
| 246 246 | 
             
                    try:
         | 
| 247 247 | 
             
                        if not SysUtil.is_package_installed(package_name):
         | 
| @@ -298,12 +298,12 @@ class SysUtil: | |
| 298 298 | 
             
                    excluding files that match any pattern in the exclude list.
         | 
| 299 299 |  | 
| 300 300 | 
             
                    Args:
         | 
| 301 | 
            -
             | 
| 302 | 
            -
             | 
| 303 | 
            -
             | 
| 301 | 
            +
                            dir_path (Union[Path, str]): The path to the directory to clear.
         | 
| 302 | 
            +
                            recursive (bool): If True, clears directories recursively. Defaults to False.
         | 
| 303 | 
            +
                            exclude (List[str]): A list of string patterns to exclude from deletion. Defaults to None.
         | 
| 304 304 |  | 
| 305 305 | 
             
                    Raises:
         | 
| 306 | 
            -
             | 
| 306 | 
            +
                            FileNotFoundError: If the specified directory does not exist.
         | 
| 307 307 | 
             
                    """
         | 
| 308 308 | 
             
                    dir_path = Path(dir_path)
         | 
| 309 309 | 
             
                    if not dir_path.exists():
         | 
| @@ -335,10 +335,10 @@ class SysUtil: | |
| 335 335 | 
             
                    Splits a path into its directory and filename components.
         | 
| 336 336 |  | 
| 337 337 | 
             
                    Args:
         | 
| 338 | 
            -
             | 
| 338 | 
            +
                            path (Union[Path, str]): The path to split.
         | 
| 339 339 |  | 
| 340 340 | 
             
                    Returns:
         | 
| 341 | 
            -
             | 
| 341 | 
            +
                            Tuple[Path, str]: A tuple containing the directory and filename.
         | 
| 342 342 | 
             
                    """
         | 
| 343 343 | 
             
                    path = Path(path)
         | 
| 344 344 | 
             
                    return path.parent, path.name
         | 
| @@ -356,18 +356,18 @@ class SysUtil: | |
| 356 356 | 
             
                    Creates a path with an optional timestamp in the specified directory.
         | 
| 357 357 |  | 
| 358 358 | 
             
                    Args:
         | 
| 359 | 
            -
             | 
| 360 | 
            -
             | 
| 361 | 
            -
             | 
| 362 | 
            -
             | 
| 363 | 
            -
             | 
| 364 | 
            -
             | 
| 359 | 
            +
                            directory (Union[Path, str]): The directory where the file will be located.
         | 
| 360 | 
            +
                            filename (str): The filename. Must include a valid extension.
         | 
| 361 | 
            +
                            timestamp (bool): If True, adds a timestamp to the filename. Defaults to True.
         | 
| 362 | 
            +
                            dir_exist_ok (bool): If True, does not raise an error if the directory exists. Defaults to True.
         | 
| 363 | 
            +
                            time_prefix (bool): If True, adds the timestamp as a prefix; otherwise, as a suffix. Defaults to False.
         | 
| 364 | 
            +
                            custom_timestamp_format (str): A custom format for the timestamp. Defaults to "%Y%m%d%H%M%S".
         | 
| 365 365 |  | 
| 366 366 | 
             
                    Returns:
         | 
| 367 | 
            -
             | 
| 367 | 
            +
                            Path: The full path to the file.
         | 
| 368 368 |  | 
| 369 369 | 
             
                    Raises:
         | 
| 370 | 
            -
             | 
| 370 | 
            +
                            ValueError: If the filename is invalid.
         | 
| 371 371 | 
             
                    """
         | 
| 372 372 | 
             
                    directory = Path(directory)
         | 
| 373 373 | 
             
                    if not re.match(r"^[\w,\s-]+\.[A-Za-z]{1,5}$", filename):
         |