diff --git a/.gitignore b/.gitignore index 99b413e..f616e40 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ rootfs/data venv aios_shell.log history.txt +aios_shell_history.txt math_school_env.db workflows.db diff --git a/src/aios_kernel/local_llama_compute_node.py b/src/aios_kernel/local_llama_compute_node.py index 5cba82e..7e50661 100644 --- a/src/aios_kernel/local_llama_compute_node.py +++ b/src/aios_kernel/local_llama_compute_node.py @@ -47,7 +47,7 @@ class LocalLlama_ComputeNode(Queue_ComputeNode): "state": ComputeTaskState.ERROR, "error": { "code": response.status_code, - "message": "http request failed: " + response.status_code + "message": "http request failed: " + str(response.status_code) } } else: diff --git a/src/aios_kernel/storage.py b/src/aios_kernel/storage.py index e982645..5119167 100644 --- a/src/aios_kernel/storage.py +++ b/src/aios_kernel/storage.py @@ -21,7 +21,15 @@ class UserConfigItem: self.desc = desc self.value = None self.user_set = False - + + def clone(self): + new_config_item = UserConfigItem() + new_config_item.default_value = self.default_value + new_config_item.is_optional = self.is_optional + new_config_item.desc = self.desc + new_config_item.item_type = self.item_type + new_config_item.value = self.value + return new_config_item class UserConfig: def __init__(self) -> None: diff --git a/src/requirements.txt b/src/requirements.txt index 574b9ea..8427ade 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -20,3 +20,4 @@ google-cloud-texttospeech openai Pillow aiosqlite +PySocks==1.7.1 diff --git a/src/service/aios_shell/aios_shell.py b/src/service/aios_shell/aios_shell.py index 13a5ee8..41f24a0 100644 --- a/src/service/aios_shell/aios_shell.py +++ b/src/service/aios_shell/aios_shell.py @@ -23,7 +23,7 @@ directory = os.path.dirname(__file__) sys.path.append(directory + '/../../') from aios_kernel import AIOS_Version,UserConfigItem,AIStorage,Workflow,AIAgent,AgentMsg,AgentMsgStatus,ComputeKernel,OpenAI_ComputeNode,AIBus,AIChatSession,AgentTunnel,TelegramTunnel,CalenderEnvironment,Environment,EmailTunnel,LocalLlama_ComputeNode - +import proxy sys.path.append(directory + '/../../component/') from agent_manager import AgentManager @@ -55,6 +55,7 @@ class AIOS_Shell: openai_node.declare_user_config() user_config.add_user_config("shell.current","last opened target and topic",True,"default@Jarvis") + proxy.declare_user_config() async def _handle_no_target_msg(self,bus:AIBus,msg:AgentMsg) -> bool: @@ -95,7 +96,7 @@ class AIOS_Shell: llama_ai_node = LocalLlama_ComputeNode() await llama_ai_node.start() - #ComputeKernel.get_instance().add_compute_node(llama_ai_node) + # ComputeKernel.get_instance().add_compute_node(llama_ai_node) await ComputeKernel.get_instance().start() @@ -194,6 +195,7 @@ class AIOS_Shell: key = args[0] config_item = AIStorage.get_instance().get_user_config().get_config_item(key) old_value = AIStorage.get_instance().get_user_config().get_value(key) + if config_item is not None: value = await session.prompt_async(f"{key} : {config_item.desc} \nCurrent : {old_value}\nPlease input new value:",style=shell_style) AIStorage.get_instance().get_user_config().set_value(key,value) @@ -390,6 +392,8 @@ async def main(): if is_daemon: return await main_daemon_loop(shell) + proxy.apply_storage() + #TODO: read last input config completer = WordCompleter(['/send $target $msg $topic', '/open $target $topic', diff --git a/src/service/aios_shell/proxy.py b/src/service/aios_shell/proxy.py new file mode 100644 index 0000000..caf006d --- /dev/null +++ b/src/service/aios_shell/proxy.py @@ -0,0 +1,40 @@ + +import sys +import os +import logging +import socket +import socks + +directory = os.path.dirname(__file__) +sys.path.append(directory + '/../../') + +from aios_kernel import AIStorage + +def apply_storage(): + proxy_cfg = AIStorage.get_instance().get_user_config().get_config_item("proxy") + if proxy_cfg is None: + return + + host_url = proxy_cfg.value + if host_url is not None and len(host_url) > 3: + url_fields = host_url.split("@") + proxy_type, host, username, password = url_fields[0], None, None, None + if len(url_fields) > 1: + host = url_fields[1] + if len(url_fields) > 2: + username = url_fields[2] + if len(url_fields) > 3: + password = url_fields[3] + + match proxy_type: + case "socks5": + (host, port) = host.split(":") + socks.set_default_proxy(socks.SOCKS5, host, int(port), username = username, password = password) + socket.socket = socks.socksocket + print(f"proxy {host_url} will be used.") + case _: + print(f"the proxy type ({proxy_type}) has not support.") + +def declare_user_config(): + user_config = AIStorage.get_instance().get_user_config() + user_config.add_user_config("proxy", "set your proxy service as 'proxy_type@host:port@username@password', 'proxy_type' = 'socks5'", True, None)