Spaces:
Sleeping
Sleeping
# coding: utf-8 | |
# Copyright (c) 2025 inclusionAI. | |
import importlib | |
import inspect | |
import os | |
from typing import Callable, Any | |
from aworld.runners.hook.template import HOOK_TEMPLATE | |
from aworld.utils.common import snake_to_camel | |
def hook(hook_point: str, name: str = None): | |
"""Hook decorator. | |
NOTE: Hooks can be annotated, but they need to comply with the protocol agreement. | |
The input parameter of the hook function is `Message` type, and the @hook needs to specify `hook_point`. | |
Examples: | |
>>> @hook(hook_point=HookPoint.ERROR) | |
>>> def error_process(message: Message) -> Message | None: | |
>>> print("process error") | |
The function `error_process` will be executed when an error message appears in the task, | |
you can choose return nothing or return a message. | |
Args: | |
hook_point: Hook point that wants to process the message. | |
name: Hook name. | |
""" | |
def decorator(func: Callable[..., Any]) -> Callable[..., Any]: | |
# converts python function into a hoop with associated hoop point | |
func_import = func.__module__ | |
if func_import == '__main__': | |
path = inspect.getsourcefile(func) | |
package = path.replace(os.getcwd(), '').replace('.py', '') | |
if package[0] == '/': | |
package = package[1:] | |
func_import = f"from {package} " | |
else: | |
func_import = f"from {func_import} " | |
real_name = name if name else func.__name__ | |
con = HOOK_TEMPLATE.format(func_import=func_import, | |
func=func.__name__, | |
point=snake_to_camel(hook_point), | |
name=real_name, | |
topic=hook_point, | |
desc='') | |
with open(f"{real_name}.py", 'w+') as write: | |
write.writelines(con) | |
importlib.import_module(real_name) | |
return func | |
return decorator | |