diff --git a/doc/mvp/compute_task.drawio b/doc/mvp/compute_task.drawio
new file mode 100644
index 0000000..981d7a7
--- /dev/null
+++ b/doc/mvp/compute_task.drawio
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/mvp/workflow.drawio b/doc/mvp/workflow.drawio
new file mode 100644
index 0000000..cc154e7
--- /dev/null
+++ b/doc/mvp/workflow.drawio
@@ -0,0 +1,368 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/kernel/README b/src/aios_kernel/README
similarity index 100%
rename from src/kernel/README
rename to src/aios_kernel/README
diff --git a/src/aios_kernel/__init__.py b/src/aios_kernel/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/aios_kernel/agent.py b/src/aios_kernel/agent.py
new file mode 100644
index 0000000..a8c15b9
--- /dev/null
+++ b/src/aios_kernel/agent.py
@@ -0,0 +1,58 @@
+from typing import Optional
+import logging
+import llm_kernel,llm_work_task
+
+logger = logging.getLogger(__name__)
+
+
+
+class agent_msg:
+ def __init__(self) -> None:
+ pass
+
+class agent_prompt:
+ def __init__(self) -> None:
+ pass
+
+ def as_str()->str:
+ pass
+
+class agent_chat_session:
+ def __init__(self) -> None:
+ self.llm_model_name = None
+ self.llm_instance = None
+ self.max_token_size = 0
+ self.chat_msg_list = None
+ self.enable_function = True
+
+ pass
+
+ def chat(self,message:str) -> None:
+ pass
+ # Key functions, let the AI Agent try to run.
+ def completion(self)->llm_work_task:
+ if self.llm_instance is None:
+ self.llm_instance = llm_kernel.craete(self.llm_model_name)
+ if self.llm_instance is None:
+ logger.fatal(f"cann't get llm_kerenel : {self.llm_model_name}")
+ return
+
+ llm_work_task = self.llm_instance.completion(self._get_prompt(),self.max_token_size)
+ return llm_work_task
+
+ def _get_prompt(str) -> str:
+ pass
+
+class ai_agent:
+ def __init__(self) -> None:
+ pass
+
+ def get_chat_session(self,chat_user_name:str,session_id:Optional[str]) -> agent_chat_session:
+ pass
+
+
+
+ #chat_session = agent.get_default_chat_session("master");
+ #chat_session.chat("给我讲一个英文笑话!");
+ #chat_session.completion();
+ #print(chat_session.last_msg());
\ No newline at end of file
diff --git a/src/aios_kernel/agent_group.py b/src/aios_kernel/agent_group.py
new file mode 100644
index 0000000..edb031d
--- /dev/null
+++ b/src/aios_kernel/agent_group.py
@@ -0,0 +1,20 @@
+from abc import ABC, abstractmethod
+from typing import Any
+from .agent import agent,agent_msg
+
+class ai_role:
+ def __init__(self) -> None:
+ pass
+
+class agent_group:
+ def __init__(self) -> None:
+ self.roles = None
+ pass
+
+ def add_role(self,role_name:str,agent_id:str) -> None:
+ pass
+
+ def send_msg(self,role_name:str,msg:agent_msg) -> None:
+ pass
+
+
\ No newline at end of file
diff --git a/src/aios_kernel/aios_shell.py b/src/aios_kernel/aios_shell.py
new file mode 100644
index 0000000..c6e1890
--- /dev/null
+++ b/src/aios_kernel/aios_shell.py
@@ -0,0 +1,6 @@
+from .workflow import ai_workflow
+from agent import agent_msg
+class aios_shell:
+ def send_msg(self,msg:agent_msg,target:ai_workflow) -> None:
+ pass
+
\ No newline at end of file
diff --git a/src/aios_kernel/compute_kernel.py b/src/aios_kernel/compute_kernel.py
new file mode 100644
index 0000000..be21341
--- /dev/null
+++ b/src/aios_kernel/compute_kernel.py
@@ -0,0 +1,29 @@
+from compute_node import compute_node
+from abc import ABC, abstractmethod
+
+# How to dispatch different computing tasks (some tasks may contain a large amount of state for correct execution)
+# to suitable computing nodes, achieving a balance of speed, cost, and power consumption,
+# is the CORE GOAL of the entire computing task schedule system (aios_kernel).
+class compute_task(ABC):
+ @abstractmethod
+ def display(self) -> str:
+ pass
+
+
+class compute_kernel:
+ def __init__(self) -> None:
+ pass
+
+ def run(self,task:compute_task) -> None:
+ # check there is compute node can support this task
+ # add task to working_queue
+ pass
+
+ def start(self):
+ pass
+
+ def add_compute_node(self,node:compute_node):
+ pass
+
+ def disable_compute_node(self,):
+ pass
\ No newline at end of file
diff --git a/src/aios_kernel/compute_node.py b/src/aios_kernel/compute_node.py
new file mode 100644
index 0000000..ef3c16c
--- /dev/null
+++ b/src/aios_kernel/compute_node.py
@@ -0,0 +1,13 @@
+from abc import ABC, abstractmethod
+
+
+class compute_node(ABC):
+ @abstractmethod
+ def display(self) -> str:
+ pass
+
+class local_compute_node(compute_node):
+ def display(self) -> str:
+ return super().display()
+
+
diff --git a/src/aios_kernel/environment.py b/src/aios_kernel/environment.py
new file mode 100644
index 0000000..2524c36
--- /dev/null
+++ b/src/aios_kernel/environment.py
@@ -0,0 +1,12 @@
+class environment_event(ABC):
+ @abstractmethod
+ def display(self) -> str:
+ pass
+
+
+class environment:
+ def __init__(self) -> None:
+ pass
+
+ def event_to_msg(self,) -> environment_event:
+ pass
\ No newline at end of file
diff --git a/src/aios_kernel/llm_kernel.py b/src/aios_kernel/llm_kernel.py
new file mode 100644
index 0000000..992db7f
--- /dev/null
+++ b/src/aios_kernel/llm_kernel.py
@@ -0,0 +1,14 @@
+
+class llm_work_task:
+ def __init__(self) -> None:
+ pass
+
+
+class llm_kernel:
+ def __init__(self) -> None:
+ pass
+ def completion(self,prompt:str,max_token:int) -> llm_work_task:
+ # craete a llm_work_task ,push on queue's end
+ # then task_schedule would run this task.(might schedule some work_task to another host)
+ pass
+
\ No newline at end of file
diff --git a/src/aios_kernel/open_ai_node.py b/src/aios_kernel/open_ai_node.py
new file mode 100644
index 0000000..17f3a83
--- /dev/null
+++ b/src/aios_kernel/open_ai_node.py
@@ -0,0 +1,6 @@
+from compute_node import compute_node
+
+class open_ai_compute_node(compute_node):
+ def display(self) -> str:
+ return super().display()
+
\ No newline at end of file
diff --git a/src/aios_kernel/workflow.py b/src/aios_kernel/workflow.py
new file mode 100644
index 0000000..3a514ac
--- /dev/null
+++ b/src/aios_kernel/workflow.py
@@ -0,0 +1,38 @@
+import environment
+import agent_prompt,agent_msg
+
+class ai_workflow:
+ def __init__(self) -> None:
+ self.rule_prompt : agent_prompt = None
+ self.workflow_config = None
+ self.context = None
+
+ def load_from_disk(self,config_path:str,context_dir_path) -> int:
+ pass
+
+ def send_msg(self,msg:agent_msg,target_group:str = None) -> None:
+ if target_group is None:
+ target_group = self.get_default_group()
+ pass
+
+ def run(self):
+
+ pass
+
+ def _pop_msg(self) -> Tuple[agent_msg,str]:
+ pass
+
+ def get_default_group(self) -> agent_group:
+ pass
+
+ def get_group(self,group_name:str) -> agent_group:
+ pass
+
+ def get_workflow_rule_prompt(self) -> agent_prompt:
+ return self.rule_prompt
+
+ def get_inner_environment(self) -> environment:
+ pass
+
+ def connect_to_environment(self,env:environment) -> None:
+ pass
\ No newline at end of file
diff --git a/src/component/agent_manager/agent.py b/src/component/agent_manager/agent.py
deleted file mode 100644
index 26f8b71..0000000
--- a/src/component/agent_manager/agent.py
+++ /dev/null
@@ -1,3 +0,0 @@
-class ai_agent:
- def __init__(self) -> None:
- pass
\ No newline at end of file
diff --git a/src/component/agent_manager/agent_manager.py b/src/component/agent_manager/agent_manager.py
index d837175..b6173b6 100644
--- a/src/component/agent_manager/agent_manager.py
+++ b/src/component/agent_manager/agent_manager.py
@@ -1,11 +1,19 @@
+import logging
+import toml
+
from .agent import ai_agent
from .templete import ai_agent_templete
+from package_manager import pkg_env,pkg_env_mgr,pkg_media_info,media_reader,pkg_install_task
+
+logger = logging.getLogger(__name__)
+
class agent_manager:
_instance = None
def __init__(self) -> None:
+ self.loaded_agent_instance = {}
pass
def __new__(cls):
@@ -15,22 +23,51 @@ class agent_manager:
def initial(self,root_dir:str) -> None:
- pass
+ self.agent_templete_env : pkg_env = pkg_env_mgr().get_env(f"{root_dir}templetes/agent_templetes.cfg")
+ self.agent_env : pkg_env = pkg_env_mgr().get_env(f"{root_dir}agents/agents.cfg")
+ if self.agent_templete_env is None:
+ raise Exception("agent_manager initial failed")
+
-
- def get(self,agent_id) -> ai_agent:
- pass
+ def get(self,agent_id:str) -> ai_agent:
+ the_agent = self.loaded_agent_instance.get(agent_id)
+ if the_agent:
+ return the_agent
+
+ # try load from disk
+ agent_media_info = self.agent_env.load(agent_id)
+ if agent_media_info is None:
+ return None
+
+ the_agent = self._load_agent_from_media(agent_media_info)
+ if the_agent is None:
+ logger.warn(f"load agent {agent_id} from media failed!")
+
+ return the_agent
+ def remove(self,agent_id:str)->int:
+ pass
+
def get_templete(self,templete_id) -> ai_agent_templete:
+ template_media_info = self.agent_templete_env.get(templete_id)
+ if template_media_info is None:
+ return None
+ return self._load_templete_from_media(template_media_info)
+
+ def install(self,templete_id) -> pkg_install_task:
+ installer = self.agent_templete_env.get_installer()
+ return installer.install(templete_id)
+
+ def uninstall(self,templete_id) -> int:
+ pass
+
+ def _load_templete_from_media(self,templete_media:pkg_media_info) -> ai_agent_templete:
pass
- def install(self,templete_id) -> int:
-
- installer = None
- #installer.install(templete_id)
+ def _load_agent_from_media(self,agent_media:pkg_media_info) -> ai_agent:
pass
-
+
def create(self,template,agent_name,agent_last_name,agent_introduce) -> ai_agent:
pass
diff --git a/src/component/package_manager/__init__.py b/src/component/package_manager/__init__.py
index e69de29..b603579 100644
--- a/src/component/package_manager/__init__.py
+++ b/src/component/package_manager/__init__.py
@@ -0,0 +1,3 @@
+from .env import pkg_env_mgr,pkg_env
+from .pkg import pkg_info,pkg_media_info
+from .installer import pkg_install_task
\ No newline at end of file
diff --git a/src/component/package_manager/installer.py b/src/component/package_manager/installer.py
index 894de8f..e388de3 100644
--- a/src/component/package_manager/installer.py
+++ b/src/component/package_manager/installer.py
@@ -19,7 +19,7 @@ INSTALL_TASK_STATE_DOWNLOADING = 3
INSTALL_TASK_STATE_INSTALLING = 4
INSTALL_TAKS_STATE_ERROR = 5
-class install_task:
+class pkg_install_task:
def __init__(self,owner:pkg_env) -> None:
self.owner = owner
self.state = INSTALL_TASK_STATE_CHECK_DEPENDENCY
@@ -35,7 +35,7 @@ class pkg_installer:
self.owner_env = owner_env
def install(self,pkg_name:str,
- install_from_dependency = False, can_upgrade = True,skip_depends = False,options = None)->Tuple[install_task,str]:
+ install_from_dependency = False, can_upgrade = True,skip_depends = False,options = None)->Tuple[pkg_install_task,str]:
the_pkg_info : pkg_info = None
is_upgrade : bool = False
@@ -74,7 +74,7 @@ class pkg_installer:
return result_task,"already installing"
logger.info(f"start download&install {pkg_name},install_from_dependency={install_from_dependency},upgrade={is_upgrade},backup={need_backup},target_pkg_info={the_pkg_info}")
- result_task = install_task()
+ result_task = pkg_install_task()
self.all_tasks[the_pkg_info.cid] = result_task
async def download_and_install_pkg()->int:
# check dependency
@@ -149,7 +149,7 @@ class pkg_installer:
if depend_task is not None:
logger.debug(f"{pkg.name}'s depend pkg {depend_pkg_name} already in task list")
continue
- depend_task = install_task()
+ depend_task = pkg_install_task()
task_list[depend_pkg_name] = depend_task
depend_pkg_info = self.owner_env.lookup(depend_pkg_name)
diff --git a/src/component/package_manager/media_reader.py b/src/component/package_manager/media_reader.py
index e69de29..dd17e68 100644
--- a/src/component/package_manager/media_reader.py
+++ b/src/component/package_manager/media_reader.py
@@ -0,0 +1,9 @@
+class media_reader:
+ def __init__(self):
+ pass
+
+ def load_from_media(self,media_info:str) -> int:
+ pass
+
+ def read(self, inner_path:str):
+ raise NotImplementedError
\ No newline at end of file
diff --git a/src/component/package_manager/pkg.py b/src/component/package_manager/pkg.py
index ebc9194..d501eec 100644
--- a/src/component/package_manager/pkg.py
+++ b/src/component/package_manager/pkg.py
@@ -9,12 +9,13 @@ class pkg_info:
self.target_media_type = "dir"
self.source_media_type = "7z"
-
-
- def parse_pkg_name(pkg_name:str) -> Tuple[str, str, str]:
- #return pkg_id,version_str,cid
+ @classmethod
+ def parse_pkg_name(cls,pkg_name:str) -> Tuple[str, str, str]:
+ """parse pkg name like test-pkg#nightly#>0.2.31#sha1:323423423 to test-pkg,nightly#>0.2.31,sha1:323423423"""
pass
+
+
@property
def cid(self) -> str:
return self.cid
diff --git a/test/compute_task_test.py b/test/compute_task_test.py
new file mode 100644
index 0000000..a980b21
--- /dev/null
+++ b/test/compute_task_test.py
@@ -0,0 +1,12 @@
+import asyncio
+
+async def test_llm_completion_task():
+ # compute task have engouh meta info to make sure compute_kernel can run it in most suitable compute container
+ test_task = llm_completion_task()
+ # add tset_task to compute_kernel's execute queue
+ compute_kernel.run(test_task)
+ # wait for test_task
+
+
+if __name__ == "__main__":
+ asyncio.run(test_llm_completion_task())
\ No newline at end of file
diff --git a/test/workflow_test.py b/test/workflow_test.py
new file mode 100644
index 0000000..daa4fd1
--- /dev/null
+++ b/test/workflow_test.py
@@ -0,0 +1,6 @@
+
+
+def test_workflow():
+
+
+ pass
\ No newline at end of file