Refactor the code directory structure to better suit the current complexity

This commit is contained in:
Liu Zhicong
2023-11-30 21:04:19 -08:00
parent 4955225ecd
commit adeca91e0a
99 changed files with 391 additions and 342 deletions
@@ -1,6 +1,6 @@
import sys import sys
import os import os
from knowledge import KnowledgePipelineEnvironment from aios import KnowledgePipelineEnvironment
directory = os.path.dirname(__file__) directory = os.path.dirname(__file__)
sys.path.append(directory + '/../../../../src/component/') sys.path.append(directory + '/../../../../src/component/')
@@ -1,6 +1,6 @@
import sys import sys
import os import os
from knowledge import * from aios import *
directory = os.path.dirname(__file__) directory = os.path.dirname(__file__)
sys.path.append(directory + '/../../../../src/component/') sys.path.append(directory + '/../../../../src/component/')
+32
View File
@@ -0,0 +1,32 @@
from .proto.agent_msg import *
from .proto.compute_task import *
from .agent.agent_base import AgentPrompt,CustomAIAgent
from .agent.chatsession import AIChatSession
from .agent.agent import AIAgent,AIAgentTemplete, BaseAIAgent
from .agent.role import AIRole,AIRoleGroup
from .agent.workflow import Workflow
from .agent.ai_function import SimpleAIFunction
from .frame.compute_kernel import ComputeKernel,ComputeTask,ComputeTaskResult,ComputeTaskState,ComputeTaskType
from .frame.compute_node import ComputeNode,LocalComputeNode
from .frame.bus import AIBus
from .frame.tunnel import AgentTunnel
from .frame.contact_manager import ContactManager,Contact,FamilyMember
from .frame.queue_compute_node import Queue_ComputeNode
from .environment.environment import Environment,EnvironmentEvent
from .environment.workflow_env import WorkflowEnvironment,CalenderEnvironment,CalenderEvent,PaintEnvironment
from .environment.text_to_speech_function import TextToSpeechFunction
from .environment.image_2_text_function import Image2TextFunction
from .environment.workspace_env import ShellEnvironment,WorkspaceEnvironment
from .storage.storage import ResourceLocation,AIStorage,UserConfig,UserConfigItem
from .net import *
from .knowledge import *
from .package_manager import *
AIOS_Version = "0.5.2, build 2023-11-30"
@@ -12,20 +12,21 @@ import datetime
import copy import copy
import sys import sys
from .agent_base import AgentMsg, AgentMsgStatus, AgentMsgType, FunctionItem, LLMResult, AgentPrompt, AgentReport, \ from ..proto.agent_msg import AgentMsg
AgentTodo, AgentTodoResult, AgentWorkLog, BaseAIAgent from ..proto.compute_task import ComputeTaskResult,ComputeTaskResultCode
from .chatsession import AIChatSession from .agent_base import *
from .compute_task import ComputeTaskResult,ComputeTaskResultCode from .chatsession import *
from .ai_function import AIFunction from .ai_function import *
from .environment import Environment
from .contact_manager import ContactManager,Contact,FamilyMember
from .compute_kernel import ComputeKernel
from .bus import AIBus
from .workspace_env import WorkspaceEnvironment
from .storage import AIStorage
from knowledge import * from ..frame.contact_manager import ContactManager,Contact,FamilyMember
from ..frame.compute_kernel import ComputeKernel
from ..frame.bus import AIBus
from ..environment.environment import *
from ..environment.workspace_env import WorkspaceEnvironment
from ..storage.storage import AIStorage
from ..knowledge import *
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -12,170 +12,13 @@ import json
from typing import List from typing import List
from .ai_function import FunctionItem, AIFunction from .ai_function import FunctionItem, AIFunction
from .compute_task import ComputeTaskResult,ComputeTaskResultCode from ..proto.agent_msg import AgentMsg, AgentMsgType
from .environment import Environment from ..proto.compute_task import ComputeTaskResult,ComputeTaskResultCode
from ..environment.environment import Environment
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class AgentMsgType(Enum):
TYPE_MSG = 0
TYPE_GROUPMSG = 1
TYPE_INTERNAL_CALL = 10
TYPE_ACTION = 20
TYPE_EVENT = 30
TYPE_SYSTEM = 40
class AgentMsgStatus(Enum):
RESPONSED = 0
INIT = 1
SENDING = 2
PROCESSING = 3
ERROR = 4
RECVED = 5
EXECUTED = 6
# msg is a msg / msg resp
# msg body可以有内容类型(MIME标签),text, image, voice, video, file,以及富文本(html)
# msg is a inner function call with result
# msg is a Action with result
# qutoe Msg
# forword msg
# reply msg
# 逻辑上的同一个Message在同一个session中看到的msgid相同
# 在不同的session中看到的msgid不同
class AgentMsg:
def __init__(self,msg_type=AgentMsgType.TYPE_MSG) -> None:
self.msg_id = "msg#" + uuid.uuid4().hex
self.msg_type:AgentMsgType = msg_type
self.prev_msg_id:str = None
self.quote_msg_id:str = None
self.rely_msg_id:str = None # if not none means this is a respone msg
self.session_id:str = None
#forword info
self.create_time = 0
self.done_time = 0
self.topic:str = None # topic is use to find session, not store in db
self.sender:str = None # obj_id.sub_objid@tunnel_id
self.target:str = None
self.mentions:[] = None #use in group chat only
#self.title:str = None
self.body:str = None
self.body_mime:str = None #//default is "text/plain",encode is utf8
#type is call / action
self.func_name = None
self.args = None
self.result_str = None
#type is event
self.event_name = None
self.event_args = None
self.status = AgentMsgStatus.INIT
self.inner_call_chain = []
self.resp_msg = None
@classmethod
def from_json(cls,json_obj:dict) -> 'AgentMsg':
msg = AgentMsg()
return msg
@classmethod
def create_internal_call_msg(self,func_name:str,args:dict,prev_msg_id:str,caller:str):
msg = AgentMsg(AgentMsgType.TYPE_INTERNAL_CALL)
msg.create_time = time.time()
msg.func_name = func_name
msg.args = args
msg.prev_msg_id = prev_msg_id
msg.sender = caller
return msg
def create_action_msg(self,action_name:str,args:dict,caller:str):
msg = AgentMsg(AgentMsgType.TYPE_ACTION)
msg.create_time = time.time()
msg.func_name = action_name
msg.args = args
msg.prev_msg_id = self.msg_id
msg.topic = self.topic
msg.sender = caller
return msg
def create_error_resp(self,error_msg:str):
resp_msg = AgentMsg(AgentMsgType.TYPE_SYSTEM)
resp_msg.create_time = time.time()
resp_msg.rely_msg_id = self.msg_id
resp_msg.body = error_msg
resp_msg.topic = self.topic
resp_msg.sender = self.target
resp_msg.target = self.sender
return resp_msg
def create_resp_msg(self,resp_body):
resp_msg = AgentMsg()
resp_msg.create_time = time.time()
resp_msg.rely_msg_id = self.msg_id
resp_msg.sender = self.target
resp_msg.target = self.sender
resp_msg.body = resp_body
resp_msg.topic = self.topic
return resp_msg
def create_group_resp_msg(self,sender_id,resp_body):
resp_msg = AgentMsg(AgentMsgType.TYPE_GROUPMSG)
resp_msg.create_time = time.time()
resp_msg.rely_msg_id = self.msg_id
resp_msg.target = self.target
resp_msg.sender = sender_id
resp_msg.body = resp_body
resp_msg.topic = self.topic
return resp_msg
def set(self,sender:str,target:str,body:str,topic:str=None) -> None:
self.sender = sender
self.target = target
self.body = body
self.create_time = time.time()
if topic:
self.topic = topic
def get_msg_id(self) -> str:
return self.msg_id
def get_sender(self) -> str:
return self.sender
def get_target(self) -> str:
return self.target
def get_prev_msg_id(self) -> str:
return self.prev_msg_id
def get_quote_msg_id(self) -> str:
return self.quote_msg_id
@classmethod
def parse_function_call(cls,func_string:str):
str_list = shlex.split(func_string)
func_name = str_list[0]
params = str_list[1:]
return func_name, params
class AgentPrompt: class AgentPrompt:
def __init__(self,prompt_str = None) -> None: def __init__(self,prompt_str = None) -> None:
@@ -597,7 +440,8 @@ class BaseAIAgent(abc.ABC):
inner_functions=None, inner_functions=None,
is_json_resp=False, is_json_resp=False,
) -> ComputeTaskResult: ) -> ComputeTaskResult:
from .compute_kernel import ComputeKernel from ..frame.compute_kernel import ComputeKernel
#logger.debug(f"Agent {self.agent_id} do llm token static system:{system_prompt_len},function:{function_token_len},history:{history_token_len},input:{input_len}, totoal prompt:{system_prompt_len + function_token_len + history_token_len} ") #logger.debug(f"Agent {self.agent_id} do llm token static system:{system_prompt_len},function:{function_token_len},history:{history_token_len},input:{input_len}, totoal prompt:{system_prompt_len + function_token_len + history_token_len} ")
if inner_functions is None and env is not None: if inner_functions is None and env is not None:
inner_functions,_ = BaseAIAgent.get_inner_functions(env) inner_functions,_ = BaseAIAgent.get_inner_functions(env)
@@ -633,7 +477,6 @@ class BaseAIAgent(abc.ABC):
org_msg:AgentMsg, org_msg:AgentMsg,
stack_limit = 5 stack_limit = 5
) -> ComputeTaskResult: ) -> ComputeTaskResult:
from .compute_kernel import ComputeKernel
arguments = None arguments = None
try: try:
func_name = inner_func_call_node.get("name") func_name = inner_func_call_node.get("name")
+4
View File
@@ -0,0 +1,4 @@
# TODO: let agent develolp custmized behavior easily
class AgentBehavior:
def __init__(self) -> None:
pass
@@ -7,7 +7,7 @@ import datetime
import uuid import uuid
import json import json
from .agent_base import AgentMsgType, AgentMsg, AgentMsgStatus from ..proto.agent_msg import AgentMsgType, AgentMsg, AgentMsgStatus
class ChatSessionDB: class ChatSessionDB:
def __init__(self, db_file): def __init__(self, db_file):
@@ -7,15 +7,19 @@ from asyncio import Queue
from typing import Optional,Tuple,List from typing import Optional,Tuple,List
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from .environment import Environment,EnvironmentEvent from ..proto.compute_task import *
from .agent_base import AgentMsg,AgentMsgStatus,FunctionItem,LLMResult,AgentPrompt from ..proto.agent_msg import *
from .agent_base import *
from .chatsession import AIChatSession from .chatsession import AIChatSession
from .role import AIRole,AIRoleGroup from .role import AIRole,AIRoleGroup
from .ai_function import AIFunction,FunctionItem from .ai_function import AIFunction,FunctionItem
from .compute_kernel import ComputeKernel
from .compute_task import ComputeTask,ComputeTaskResult,ComputeTaskState,ComputeTaskResultCode from ..frame.compute_kernel import ComputeKernel
from .bus import AIBus from ..frame.bus import AIBus
from .workflow_env import WorkflowEnvironment
from ..environment.environment import Environment,EnvironmentEvent
from ..environment.workflow_env import WorkflowEnvironment
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -1,8 +1,8 @@
import logging import logging
from typing import Dict from typing import Dict
from aios_kernel import ComputeKernel from ..frame.compute_kernel import ComputeKernel
from aios_kernel.ai_function import AIFunction from ..agent.ai_function import AIFunction
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -12,7 +12,7 @@ from hashlib import md5
from typing import Optional, Union, List, Tuple from typing import Optional, Union, List, Tuple
from generic_escape import GenericEscape from generic_escape import GenericEscape
from aios_kernel import AIStorage from ..storage.storage import AIStorage
try: try:
import docker import docker
@@ -1,7 +1,7 @@
from typing import Dict from typing import Dict
from aios_kernel.ai_function import AIFunction from ..agent.ai_function import AIFunction
from aios_kernel.code_interpreter import execute_code from .code_interpreter import execute_code
class CodeInterpreterFunction(AIFunction): class CodeInterpreterFunction(AIFunction):
@@ -1,7 +1,7 @@
import json import json
from typing import Dict from typing import Dict
from aios_kernel.ai_function import AIFunction from ..agent.ai_function import AIFunction
from duckduckgo_search import AsyncDDGS from duckduckgo_search import AsyncDDGS
@@ -5,7 +5,7 @@ from abc import ABC, abstractmethod
from typing import Any, Callable, Optional,Dict,Awaitable,List from typing import Any, Callable, Optional,Dict,Awaitable,List
import logging import logging
from .ai_function import AIFunction from ..agent.ai_function import AIFunction
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -1,8 +1,8 @@
import logging import logging
from typing import Dict from typing import Dict
from aios_kernel import ComputeKernel from ..frame.compute_kernel import ComputeKernel
from aios_kernel.ai_function import AIFunction from ..agent.ai_function import AIFunction
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -5,8 +5,10 @@ import random
from pathlib import Path from pathlib import Path
from typing import Dict from typing import Dict
from aios_kernel import ComputeKernel, AIStorage from ..agent.ai_function import AIFunction
from aios_kernel.ai_function import AIFunction from ..frame.compute_kernel import ComputeKernel
from ..storage.storage import AIStorage
from pydub import AudioSegment from pydub import AudioSegment
@@ -3,8 +3,8 @@ from typing import Dict
from cachetools import TLRUCache, cached from cachetools import TLRUCache, cached
from aios_kernel.ai_function import AIFunction from ..agent.ai_function import AIFunction
from aios_kernel.sql_database import SQLDatabase, get_from_env from .sql_database import SQLDatabase, get_from_env
def _my_ttu(_key, _value, now): def _my_ttu(_key, _value, now):
@@ -5,8 +5,10 @@ import random
from pathlib import Path from pathlib import Path
from typing import Dict from typing import Dict
from aios_kernel import ComputeKernel, AIStorage from ..agent.ai_function import AIFunction
from aios_kernel.ai_function import AIFunction from ..frame.compute_kernel import ComputeKernel
from ..storage.storage import AIStorage
from pydub import AudioSegment from pydub import AudioSegment
@@ -7,19 +7,19 @@ from sqlite3 import Error
import threading import threading
import logging import logging
from typing import Optional from typing import Optional
from .script_to_speech_function import ScriptToSpeechFunction
from .image_2_text_function import Image2TextFunction
from .compute_kernel import ComputeKernel, ComputeTaskResultCode
from .environment import Environment,EnvironmentEvent
from .ai_function import SimpleAIFunction
from .storage import AIStorage
from .contact_manager import ContactManager,Contact,FamilyMember
import aiosqlite import aiosqlite
logger = logging.getLogger(__name__) from ..proto.compute_task import *
from ..agent.ai_function import SimpleAIFunction
from ..frame.compute_kernel import ComputeKernel
from ..frame.contact_manager import ContactManager,Contact,FamilyMember
from ..storage.storage import AIStorage
from .environment import Environment,EnvironmentEvent
from .script_to_speech_function import ScriptToSpeechFunction
from .image_2_text_function import Image2TextFunction
logger = logging.getLogger(__name__)
class CalenderEvent(EnvironmentEvent): class CalenderEvent(EnvironmentEvent):
def __init__(self,data) -> None: def __init__(self,data) -> None:
@@ -17,14 +17,15 @@ import aiofiles
from typing import Any,List from typing import Any,List
import os import os
import chardet import chardet
from markdown import Markdown from markdown import Markdown
import PyPDF2 import PyPDF2
from .agent_base import AgentMsg,AgentTodo,AgentPrompt,AgentTodoResult
from .environment import Environment,EnvironmentEvent from ..proto.agent_msg import *
from .ai_function import AIFunction,SimpleAIFunction from ..agent.agent_base import AgentTodo,AgentPrompt,AgentTodoResult
from .storage import AIStorage,ResourceLocation from ..agent.ai_function import AIFunction,SimpleAIFunction
from ..storage.storage import AIStorage,ResourceLocation
from .simple_kb_db import SimpleKnowledgeDB from .simple_kb_db import SimpleKnowledgeDB
from .environment import Environment,EnvironmentEvent
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -1,10 +1,11 @@
from typing import Coroutine,Dict,Any from typing import Coroutine,Dict,Any
from .agent_base import AgentMsg,AgentMsgStatus,AgentMsgType
import asyncio import asyncio
from asyncio import Queue from asyncio import Queue
import logging import logging
from ..proto.agent_msg import *
from ..agent.agent_base import *
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class AIBusHandler: class AIBusHandler:
@@ -4,13 +4,12 @@ from typing import Optional
import logging import logging
import asyncio import asyncio
import tiktoken import tiktoken
from asyncio import Queue from asyncio import Queue
from knowledge import ObjectID from ..proto.compute_task import *
from .agent_base import AgentPrompt from ..knowledge import ObjectID
from ..agent.agent_base import AgentPrompt
from .compute_node import ComputeNode from .compute_node import ComputeNode
from .compute_task import ComputeTask, ComputeTaskState, ComputeTaskResult, ComputeTaskType,ComputeTaskResultCode
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -18,7 +17,6 @@ logger = logging.getLogger(__name__)
# to suitable computing nodes, achieving a balance of speed, cost, and power consumption, # 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). # is the CORE GOAL of the entire computing task schedule system (aios_kernel).
class ComputeKernel: class ComputeKernel:
_instance = None _instance = None
@classmethod @classmethod
@@ -1,6 +1,6 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from .compute_task import ComputeTask, ComputeTaskType
from ..proto.compute_task import ComputeTask, ComputeTaskType
class ComputeNode(ABC): class ComputeNode(ABC):
def __init__(self) -> None: def __init__(self) -> None:
@@ -2,7 +2,7 @@ from typing import List
import logging import logging
from datetime import datetime from datetime import datetime
from .agent_base import AgentMsg from ..proto.agent_msg import AgentMsg
from .tunnel import AgentTunnel from .tunnel import AgentTunnel
@@ -1,11 +1,13 @@
from typing import List from typing import List
import toml import toml
import time import time
import logging
from datetime import datetime from datetime import datetime
from .agent_base import AgentMsg from ..proto.agent_msg import AgentMsg
from .tunnel import AgentTunnel from .tunnel import AgentTunnel
from .contact import Contact,FamilyMember from .contact import Contact,FamilyMember
import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -4,8 +4,7 @@ from asyncio import Queue
import logging import logging
from abc import abstractmethod from abc import abstractmethod
from .compute_task import ComputeTask, ComputeTaskResult, ComputeTaskResultCode, ComputeTaskState, ComputeTaskType from aios import ComputeTask, ComputeNode,ComputeTaskResult, ComputeTaskResultCode, ComputeTaskState, ComputeTaskType
from .compute_node import ComputeNode
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -1,7 +1,8 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
import logging import logging
from typing import Coroutine from typing import Coroutine
from .agent_base import AgentMsg
from ..proto.agent_msg import AgentMsg
from .bus import AIBus from .bus import AIBus
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -1,4 +1,4 @@
from knowledge.object.object_id import ObjectType from ..object.object_id import ObjectType
from ..object import KnowledgeObject from ..object import KnowledgeObject
from ..data import ChunkList, ChunkListWriter from ..data import ChunkList, ChunkListWriter
from ..object import ObjectType from ..object import ObjectType
@@ -1,13 +1,11 @@
import os import os
import json
import logging
from .object import ObjectStore, ObjectRelationStore, ObjectID, ObjectType, KnowledgeObject from .object import ObjectStore, ObjectRelationStore, ObjectID, ObjectType, KnowledgeObject
from .core_object import DocumentObject, ImageObject, VideoObject, RichTextObject, EmailObject from .core_object import DocumentObject, ImageObject, VideoObject, RichTextObject, EmailObject
from .data import ChunkStore, ChunkTracker, ChunkListWriter, ChunkReader from .data import ChunkStore, ChunkTracker, ChunkListWriter, ChunkReader
import json from ..storage.storage import AIStorage
import logging
# KnowledgeStore class, which aggregates ChunkStore, ChunkTracker, and ObjectStore, and is a global singleton that makes it easy to use these three built-in store examples # KnowledgeStore class, which aggregates ChunkStore, ChunkTracker, and ObjectStore, and is a global singleton that makes it easy to use these three built-in store examples
class KnowledgeStore: class KnowledgeStore:
@@ -17,8 +15,7 @@ class KnowledgeStore:
if cls._instance is None: if cls._instance is None:
cls._instance = super().__new__(cls) cls._instance = super().__new__(cls)
import aios_kernel knowledge_dir = AIStorage.get_instance().get_myai_dir() / "knowledge" / "objects"
knowledge_dir = aios_kernel.storage.AIStorage().get_myai_dir() / "knowledge" / "objects"
if not os.path.exists(knowledge_dir): if not os.path.exists(knowledge_dir):
os.makedirs(knowledge_dir) os.makedirs(knowledge_dir)
@@ -6,7 +6,8 @@ import aiofiles
import os import os
from typing import Tuple from typing import Tuple
from ndn_client import ContentId,NDN_Client #from ndn_client import ContentId,NDN_Client
from ..net import ContentId,NDN_Client
from .pkg import PackageInfo,PackageMediaInfo from .pkg import PackageInfo,PackageMediaInfo
from .env import PackageEnv from .env import PackageEnv
+167
View File
@@ -0,0 +1,167 @@
import logging
import uuid
from enum import Enum
import time
logger = logging.getLogger(__name__)
class AgentMsgType(Enum):
TYPE_MSG = 0
TYPE_GROUPMSG = 1
TYPE_INTERNAL_CALL = 10
TYPE_ACTION = 20
TYPE_EVENT = 30
TYPE_SYSTEM = 40
class AgentMsgStatus(Enum):
RESPONSED = 0
INIT = 1
SENDING = 2
PROCESSING = 3
ERROR = 4
RECVED = 5
EXECUTED = 6
# msg is a msg / msg resp
# msg body可以有内容类型(MIME标签),text, image, voice, video, file,以及富文本(html)
# msg is a inner function call with result
# msg is a Action with result
# qutoe Msg
# forword msg
# reply msg
# 逻辑上的同一个Message在同一个session中看到的msgid相同
# 在不同的session中看到的msgid不同
class AgentMsg:
def __init__(self,msg_type=AgentMsgType.TYPE_MSG) -> None:
self.msg_id = "msg#" + uuid.uuid4().hex
self.msg_type:AgentMsgType = msg_type
self.prev_msg_id:str = None
self.quote_msg_id:str = None
self.rely_msg_id:str = None # if not none means this is a respone msg
self.session_id:str = None
#forword info
self.create_time = 0
self.done_time = 0
self.topic:str = None # topic is use to find session, not store in db
self.sender:str = None # obj_id.sub_objid@tunnel_id
self.target:str = None
self.mentions:[] = None #use in group chat only
#self.title:str = None
self.body:str = None
self.body_mime:str = None #//default is "text/plain",encode is utf8
#type is call / action
self.func_name = None
self.args = None
self.result_str = None
#type is event
self.event_name = None
self.event_args = None
self.status = AgentMsgStatus.INIT
self.inner_call_chain = []
self.resp_msg = None
@classmethod
def from_json(cls,json_obj:dict) -> 'AgentMsg':
msg = AgentMsg()
return msg
@classmethod
def create_internal_call_msg(self,func_name:str,args:dict,prev_msg_id:str,caller:str):
msg = AgentMsg(AgentMsgType.TYPE_INTERNAL_CALL)
msg.create_time = time.time()
msg.func_name = func_name
msg.args = args
msg.prev_msg_id = prev_msg_id
msg.sender = caller
return msg
def create_action_msg(self,action_name:str,args:dict,caller:str):
msg = AgentMsg(AgentMsgType.TYPE_ACTION)
msg.create_time = time.time()
msg.func_name = action_name
msg.args = args
msg.prev_msg_id = self.msg_id
msg.topic = self.topic
msg.sender = caller
return msg
def create_error_resp(self,error_msg:str):
resp_msg = AgentMsg(AgentMsgType.TYPE_SYSTEM)
resp_msg.create_time = time.time()
resp_msg.rely_msg_id = self.msg_id
resp_msg.body = error_msg
resp_msg.topic = self.topic
resp_msg.sender = self.target
resp_msg.target = self.sender
return resp_msg
def create_resp_msg(self,resp_body):
resp_msg = AgentMsg()
resp_msg.create_time = time.time()
resp_msg.rely_msg_id = self.msg_id
resp_msg.sender = self.target
resp_msg.target = self.sender
resp_msg.body = resp_body
resp_msg.topic = self.topic
return resp_msg
def create_group_resp_msg(self,sender_id,resp_body):
resp_msg = AgentMsg(AgentMsgType.TYPE_GROUPMSG)
resp_msg.create_time = time.time()
resp_msg.rely_msg_id = self.msg_id
resp_msg.target = self.target
resp_msg.sender = sender_id
resp_msg.body = resp_body
resp_msg.topic = self.topic
return resp_msg
def set(self,sender:str,target:str,body:str,topic:str=None) -> None:
self.sender = sender
self.target = target
self.body = body
self.create_time = time.time()
if topic:
self.topic = topic
def get_msg_id(self) -> str:
return self.msg_id
def get_sender(self) -> str:
return self.sender
def get_target(self) -> str:
return self.target
def get_prev_msg_id(self) -> str:
return self.prev_msg_id
def get_quote_msg_id(self) -> str:
return self.quote_msg_id
@classmethod
def parse_function_call(cls,func_string:str):
str_list = shlex.split(func_string)
func_name = str_list[0]
params = str_list[1:]
return func_name, params
@@ -3,8 +3,8 @@ from enum import Enum
import uuid import uuid
import time import time
from typing import Union from typing import Union
from knowledge import ObjectID from ..knowledge import ObjectID
from .storage import AIStorage from ..storage.storage import AIStorage
class ComputeTaskResultCode(Enum): class ComputeTaskResultCode(Enum):
OK = 0 OK = 0
@@ -195,7 +195,7 @@ class AIStorage:
/opt/aios /opt/aios
""" """
if self.is_dev_mode: if self.is_dev_mode:
return os.path.abspath(_file_dir + "/../") return os.path.abspath(_file_dir + "/../../")
else: else:
return "/opt/aios/" return "/opt/aios/"
@@ -206,7 +206,7 @@ class AIStorage:
/opt/aios/app /opt/aios/app
""" """
if self.is_dev_mode: if self.is_dev_mode:
return os.path.abspath(_file_dir + "/../../rootfs/") return os.path.abspath(_file_dir + "/../../../rootfs/")
else: else:
return "/opt/aios/app/" return "/opt/aios/app/"
-32
View File
@@ -1,32 +0,0 @@
from .environment import Environment,EnvironmentEvent
from .agent_base import AgentMsg,AgentMsgStatus,AgentMsgType,AgentPrompt,CustomAIAgent
from .chatsession import AIChatSession
from .agent import AIAgent,AIAgentTemplete, BaseAIAgent
from .compute_kernel import ComputeKernel,ComputeTask,ComputeTaskResult,ComputeTaskState,ComputeTaskType
from .compute_node import ComputeNode,LocalComputeNode
from .open_ai_node import OpenAI_ComputeNode
from .role import AIRole,AIRoleGroup
from .storage import ResourceLocation,AIStorage,UserConfig,UserConfigItem
from .workflow import Workflow
from .bus import AIBus
from .workflow_env import WorkflowEnvironment,CalenderEnvironment,CalenderEvent,PaintEnvironment
from .local_llama_compute_node import LocalLlama_ComputeNode
from .whisper_node import WhisperComputeNode
from .google_text_to_speech_node import GoogleTextToSpeechNode
from .tunnel import AgentTunnel
from .tg_tunnel import TelegramTunnel
from .email_tunnel import EmailTunnel
from .contact_manager import ContactManager,Contact,FamilyMember
from .text_to_speech_function import TextToSpeechFunction
from .image_2_text_function import Image2TextFunction
from .workspace_env import ShellEnvironment
from .local_stability_node import Local_Stability_ComputeNode
from .stability_node import Stability_ComputeNode
from .local_st_compute_node import LocalSentenceTransformer_Text_ComputeNode,LocalSentenceTransformer_Image_ComputeNode
from .compute_node_config import ComputeNodeConfig
from .ai_function import SimpleAIFunction
from .workspace_env import WorkspaceEnvironment
from .openai_tts_node import OpenAITTSComputeNode
AIOS_Version = "0.5.2, build 2023-11-29"
+1 -3
View File
@@ -6,9 +6,7 @@ import sys
import runpy import runpy
from typing import Any, Callable, Dict, List, Optional, Union from typing import Any, Callable, Dict, List, Optional, Union
from aios_kernel import AIAgent,AIAgentTemplete,AIStorage,Environment from aios import AIAgent,AIAgentTemplete,AIStorage,Environment,BaseAIAgent,PackageEnv,PackageEnvManager,PackageMediaInfo,PackageInstallTask
from aios_kernel.agent_base import BaseAIAgent
from package_manager import PackageEnv,PackageEnvManager,PackageMediaInfo,PackageInstallTask
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -7,9 +7,8 @@ import mailparser
import logging import logging
import time import time
import datetime import datetime
from .tunnel import AgentTunnel
from .agent_base import AgentMsg from aios import AgentTunnel,AgentMsg,ContactManager
from .contact_manager import ContactManager
from email.message import EmailMessage from email.message import EmailMessage
+1
View File
@@ -0,0 +1 @@
from .google_text_to_speech_node import *
@@ -7,9 +7,7 @@ from typing import Optional
from google.cloud import texttospeech from google.cloud import texttospeech
from .storage import AIStorage from aios import AIStorage,ComputeTask, ComputeTaskResult, ComputeTaskState, ComputeTaskType,ComputeNode
from .compute_task import ComputeTask, ComputeTaskResult, ComputeTaskState, ComputeTaskType
from .compute_node import ComputeNode
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
+1 -1
View File
@@ -2,7 +2,7 @@ import os
import runpy import runpy
import toml import toml
import asyncio import asyncio
from knowledge import KnowledgePipelineEnvironment, KnowledgePipeline from aios import KnowledgePipelineEnvironment, KnowledgePipeline
class KnowledgePipelineManager: class KnowledgePipelineManager:
+1
View File
@@ -0,0 +1 @@
from .local_llama_compute_node import LocalLlama_ComputeNode
@@ -5,9 +5,7 @@ import requests
from typing import Optional, List from typing import Optional, List
from pydantic import BaseModel from pydantic import BaseModel
from .compute_task import ComputeTask, ComputeTaskResult, ComputeTaskResultCode, ComputeTaskState, ComputeTaskType from aios import ComputeTask,Queue_ComputeNode, ComputeTaskResult, ComputeTaskResultCode, ComputeTaskState, ComputeTaskType,AIStorage,UserConfig
from .queue_compute_node import Queue_ComputeNode
from .storage import AIStorage,UserConfig
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -121,7 +119,7 @@ class LocalLlama_ComputeNode(Queue_ComputeNode):
"tool_choices": [], "tool_choices": [],
"max_tokens": 4000 "max_tokens": 4000
} }
if llm_inner_functions is not None:
for fun in llm_inner_functions: for fun in llm_inner_functions:
body["tools"].append({ body["tools"].append({
"type": "function", "type": "function",
+1 -2
View File
@@ -1,8 +1,7 @@
# define a knowledge base class # define a knowledge base class
import json import json
import string import string
from aios_kernel import AIStorage, Environment, SimpleAIFunction, CustomAIAgent, AgentPrompt, AgentMsg from aios import *
from knowledge import *
from .mail import MailStorage, Mail from .mail import MailStorage, Mail
class IssueState(Enum): class IssueState(Enum):
+1 -2
View File
@@ -2,8 +2,7 @@ import os
import logging import logging
import json import json
import string import string
from knowledge import * from aios import *
from aios_kernel.storage import AIStorage
from .mail import Mail, MailStorage from .mail import Mail, MailStorage
+1 -1
View File
@@ -7,7 +7,7 @@ import datetime
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
import sqlite3 import sqlite3
import html2text import html2text
from knowledge import * from aios import *
class Mail: class Mail:
def __init__(self, **kwargs) -> None: def __init__(self, **kwargs) -> None:
+1 -2
View File
@@ -3,8 +3,7 @@ import logging
import json import json
import imaplib import imaplib
import mailparser import mailparser
from knowledge import * from aios import *
from aios_kernel.storage import AIStorage
class EmailSpider: class EmailSpider:
+3
View File
@@ -0,0 +1,3 @@
from .open_ai_node import *
from .openai_tts_node import *
from .whisper_node import *
@@ -9,10 +9,7 @@ import aiohttp
import base64 import base64
import requests import requests
from .compute_task import ComputeTask, ComputeTaskResult, ComputeTaskState, ComputeTaskType,ComputeTaskResultCode from aios import ComputeTask, ComputeTaskResult, ComputeTaskState, ComputeTaskType,ComputeTaskResultCode,ComputeNode,AIStorage,UserConfig
from .compute_node import ComputeNode
from .storage import AIStorage,UserConfig
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -4,7 +4,7 @@ import logging
import os import os
from asyncio import Queue from asyncio import Queue
from aios_kernel import ComputeNode, ComputeTask, ComputeTaskState, ComputeTaskResult, ComputeTaskType, AIStorage from aios import ComputeNode, ComputeTask, ComputeTaskState, ComputeTaskResult, ComputeTaskType, AIStorage
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -13,9 +13,7 @@ from openai.cli._progress import BufferReader
from pydub import AudioSegment from pydub import AudioSegment
from datetime import timedelta from datetime import timedelta
from . import AIStorage from aios import AIStorage,ComputeNode,ComputeTask, ComputeTaskResult, ComputeTaskState, ComputeTaskType
from .compute_node import ComputeNode
from .compute_task import ComputeTask, ComputeTaskResult, ComputeTaskState, ComputeTaskType
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -24,7 +22,6 @@ SECONDS_IN_MINUTE = 60
HOURS_IN_DAY = 24 HOURS_IN_DAY = 24
MICROSECONDS_IN_MILLISECOND = 1000 MICROSECONDS_IN_MILLISECOND = 1000
def timedelta_to_vtt_timestamp(timedelta_timestamp): def timedelta_to_vtt_timestamp(timedelta_timestamp):
hrs, secs_remainder = divmod(timedelta_timestamp.seconds, SECONDS_IN_HOUR) hrs, secs_remainder = divmod(timedelta_timestamp.seconds, SECONDS_IN_HOUR)
hrs += timedelta_timestamp.days * HOURS_IN_DAY hrs += timedelta_timestamp.days * HOURS_IN_DAY
+2
View File
@@ -0,0 +1,2 @@
from .local_stability_node import *
from .stability_node import *
@@ -9,9 +9,7 @@ import requests
from typing import Tuple from typing import Tuple
from pathlib import Path from pathlib import Path
from .compute_task import ComputeTask, ComputeTaskResult, ComputeTaskState, ComputeTaskType, ComputeTaskResultCode from aios import ComputeTask, ComputeTaskResult, ComputeTaskState, ComputeTaskType,ComputeTaskResultCode,ComputeNode,AIStorage,UserConfig
from .compute_node import ComputeNode
from .storage import AIStorage, UserConfig
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -9,9 +9,7 @@ from PIL import Image
from stability_sdk import client from stability_sdk import client
import stability_sdk.interfaces.gooseai.generation.generation_pb2 as generation import stability_sdk.interfaces.gooseai.generation.generation_pb2 as generation
from .compute_task import ComputeTask, ComputeTaskResult, ComputeTaskState, ComputeTaskType, ComputeTaskResultCode from aios import ComputeTask, ComputeTaskResult, ComputeTaskState, ComputeTaskType,ComputeTaskResultCode,ComputeNode,AIStorage,UserConfig
from .compute_node import ComputeNode
from .storage import AIStorage, UserConfig
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
+1
View File
@@ -0,0 +1 @@
from .local_st_compute_node import *
@@ -5,9 +5,8 @@ from pydantic import BaseModel
from typing import Union from typing import Union
from PIL import Image from PIL import Image
import io import io
from .compute_task import ComputeTask, ComputeTaskState, ComputeTaskType,ComputeTaskResult,ComputeTaskResultCode
from .queue_compute_node import Queue_ComputeNode from aios import ComputeTask, ComputeTaskResult, ComputeTaskState, ComputeTaskType,ComputeTaskResultCode,ComputeNode,AIStorage,UserConfig,ObjectID,Queue_ComputeNode
from knowledge import ObjectID
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -10,13 +10,7 @@ from telegram import Bot
from telegram.ext import Updater from telegram.ext import Updater
from telegram.error import Forbidden, NetworkError from telegram.error import Forbidden, NetworkError
from knowledge import ObjectType, KnowledgeStore from aios import ObjectType, KnowledgeStore,AgentTunnel,AIStorage,ContactManager,Contact,FamilyMember,AgentMsg,AgentMsgType
from .tunnel import AgentTunnel
from .storage import AIStorage
from .contact_manager import ContactManager,Contact,FamilyMember
from .agent_base import AgentMsg,AgentMsgType
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -2,8 +2,7 @@ import logging
import toml import toml
import os import os
from aios_kernel import Workflow,AIStorage from aios import Workflow,AIStorage,PackageEnv,PackageEnvManager,PackageMediaInfo,PackageInstallTask
from package_manager import PackageEnv,PackageEnvManager,PackageMediaInfo,PackageInstallTask
from agent_manager import AgentManager from agent_manager import AgentManager
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
+1
View File
@@ -0,0 +1 @@
# might implement by Rust in the future
+34
View File
@@ -0,0 +1,34 @@
#目录说明
## aios
系统的主要内核部分
### agent
智能体相关目录(包括agent和workflow),也是aios的关键抽象
### frame
aios的核心框架
### proto
非系统内部的,承诺长期兼容的协议定义
### enviroment
enviroment定义
其它内置的基础环境实现,包含其它非LLM AI能力的function
### knowledge
知识库相关实现
### storage
传统的存储组件
### net
基础网络库(主要是NDN,NON网络)的基础组件
## node_daemon
运行在host_os上,通过传统os概念控制aios的各个基础组件的启动。可以看成是aios的bios
aios是一个network os, 因此这个组件里还包含了最为基础的仓库实现,以支持各个组件的在线发布\安装\更新
## component
可以按需加载的build-in组件
## service
内置的service
+12 -7
View File
@@ -11,7 +11,6 @@ from logging.handlers import RotatingFileHandler
from typing import Any, Optional, TypeVar, Tuple, Sequence from typing import Any, Optional, TypeVar, Tuple, Sequence
import argparse import argparse
from prompt_toolkit import HTML, PromptSession, prompt,print_formatted_text from prompt_toolkit import HTML, PromptSession, prompt,print_formatted_text
from prompt_toolkit.formatted_text import FormattedText from prompt_toolkit.formatted_text import FormattedText
from prompt_toolkit.selection import SelectionState from prompt_toolkit.selection import SelectionState
@@ -20,8 +19,6 @@ from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
from prompt_toolkit.completion import WordCompleter from prompt_toolkit.completion import WordCompleter
from prompt_toolkit.styles import Style from prompt_toolkit.styles import Style
directory = os.path.dirname(__file__) directory = os.path.dirname(__file__)
sys.path.append(directory + '/../../') sys.path.append(directory + '/../../')
@@ -30,15 +27,23 @@ sys.path.append(directory + '/../../')
# os.environ['HTTPS_PROXY'] = '127.0.0.1:10809' # os.environ['HTTPS_PROXY'] = '127.0.0.1:10809'
import proxy import proxy
from aios_kernel import * from aios import *
from knowledge import *
sys.path.append(directory + '/../../component/') sys.path.append(directory + '/../../component/')
from google_node import *
from llama_node import *
from openai_node import *
from sd_node import *
from st_node import *
from agent_manager import AgentManager from agent_manager import AgentManager
from workflow_manager import WorkflowManager from workflow_manager import WorkflowManager
from knowledge_manager import KnowledgePipelineManager from knowledge_manager import KnowledgePipelineManager
from tg_tunnel import TelegramTunnel
from email_tunnel import EmailTunnel
from compute_node_config import *
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -1,4 +1,5 @@
""" """
compute node config
Configuration for nodes: Configuration for nodes:
``` ```
@@ -14,12 +15,18 @@ Configuration for nodes:
""" """
import logging import logging
from typing import List from typing import List
import sys
import os import os
import toml import toml
from .local_llama_compute_node import LocalLlama_ComputeNode
from .storage import AIStorage from aios import AIStorage
directory = os.path.dirname(__file__)
sys.path.append(directory + '/../../component/')
from llama_node import LocalLlama_ComputeNode
# define singleton class knowledge pipline # define singleton class knowledge pipline
class ComputeNodeConfig: class ComputeNodeConfig:
+1 -1
View File
@@ -9,7 +9,7 @@ import logging
directory = os.path.dirname(__file__) directory = os.path.dirname(__file__)
sys.path.append(directory + '/../../') sys.path.append(directory + '/../../')
from aios_kernel import AIStorage from aios import AIStorage
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
-1
View File
@@ -1 +0,0 @@
TODO