import os
import functools
import signal
from pathlib import Path
RESOURCE_ROOT = os.environ.get("RESOURCE_ROOT", "./client_resources")
def get_real_path(path):
if path is None:
return None
if RESOURCE_ROOT in path:
return path
return os.path.join(RESOURCE_ROOT, path)
def get_root_dir():
return RESOURCE_ROOT
def md2plain(md):
plain_text = md.replace(" ", " ")
plain_text = plain_text.replace("
", "\n")
plain_text = plain_text.replace("\<", "<")
plain_text = plain_text.replace("\>", ">")
return plain_text
def plain2md(plain_text: str):
md_text = plain_text.replace("<", "\<")
md_text = md_text.replace(">", "\>")
md_text = md_text.replace("\n", "
")
# md_text = md_text + "
"
md_text = md_text.replace(" ", " ")
return md_text
def transform_msgs(history_msgs: list = []):
if history_msgs is None:
return []
filtered_msg = []
for item in history_msgs:
if isinstance(item[0], str):
item[0] = md2plain(item[0])
if isinstance(item[1], str):
item[1] = md2plain(item[1])
if isinstance(item[1], str) and item[1].startswith(
"The whole process will take some time, please be patient."
):
item[1] = None
filtered_msg.append(item)
return filtered_msg
def timeout(sec):
"""
timeout decorator
:param sec: function raise TimeoutError after ? seconds
"""
def decorator(func):
@functools.wraps(func)
def wrapped_func(*args, **kwargs):
def _handle_timeout(signum, frame):
err_msg = f"Function {func.__name__} timed out after {sec} seconds"
raise TimeoutError(err_msg)
signal.signal(signal.SIGALRM, _handle_timeout)
signal.alarm(sec)
try:
result = func(*args, **kwargs)
finally:
signal.alarm(0)
return result
return wrapped_func
return decorator