Update Jarvis implement

This commit is contained in:
Liu Zhicong
2024-01-15 22:52:13 -08:00
parent 5885301c19
commit 0bc2aaf45b
9 changed files with 802 additions and 170 deletions
+104 -27
View File
@@ -1,10 +1,14 @@
# pylint:disable=E0402
from datetime import datetime,timedelta
from typing import Dict
import json
import threading
from typing import Dict, List
import sqlite3
from ..frame.compute_kernel import ComputeKernel
from ..proto.ai_function import SimpleAIAction
from ..proto.agent_msg import AgentMsg, AgentMsgType
from ..proto.agent_task import AgentWorkLog
from .llm_context import GlobaToolsLibrary
from .chatsession import AIChatSession
@@ -16,28 +20,39 @@ logger = logging.getLogger(__name__)
class AgentMemory:
def __init__(self,agent_id:str,db_path:str) -> None:
self.agent_id:str= agent_id
self.chat_db:str = db_path
self.memory_db:str = db_path
self.model_name:str = "gp4-1106-preview"
self.threshold_hours = 72
@classmethod
def register_actions(cls):
async def action_chatlog_append(parms:Dict):
memory = parms.get("_memory")
if memory:
return await memory.action_chatlog_append(parms)
chatlog_append_action = SimpleAIAction("chatlog_append","Append request & reply message to chatlog. No params",action_chatlog_append)
GlobaToolsLibrary.get_instance().register_tool_function(chatlog_append_action,"agent.memory.chatlog.append")
def _get_conn(self):
""" get db connection """
local = threading.local()
if not hasattr(local, 'conn'):
local.conn = self._create_connection(self.memory_db)
return local.conn
def _create_connection(self, db_file):
""" create a database connection to a SQLite database """
conn = None
try:
conn = sqlite3.connect(db_file)
except Error as e:
logging.error("Error occurred while connecting to database: %s", e)
return None
if conn:
self._create_table(conn)
return conn
def get_session_from_msg(self,msg:AgentMsg) -> AIChatSession:
if msg.msg_type == AgentMsgType.TYPE_GROUPMSG:
session_topic = msg.target + "#" + msg.topic
chatsession = AIChatSession.get_session(self.agent_id,session_topic,self.chat_db)
chatsession = AIChatSession.get_session(self.agent_id,session_topic,self.memory_db)
else:
session_topic = msg.get_sender() + "#" + msg.topic
chatsession = AIChatSession.get_session(self.agent_id,session_topic,self.chat_db)
chatsession = AIChatSession.get_session(self.agent_id,session_topic,self.memory_db)
return chatsession
async def load_chatlogs(self,msg:AgentMsg,n:int=6,m:int=64,token_limit=800)->str:
@@ -84,19 +99,83 @@ class AgentMemory:
return histroy_str
async def action_chatlog_append(self,params:Dict) -> str:
# 使用params可以得到: LLM Process的输入,LLM Result,基于LLM Result构造的参数,当前actionItem
input_msg:AgentMsg = params.get("input").get("msg")
llm_result = params.get("llm_result")
chatsession = self.get_session_from_msg(input_msg)
resp_msg = params.get("resp_msg")
if resp_msg:
tags = llm_result.raw_result.get("tags")
chatsession.append(input_msg,tags)
chatsession.append(resp_msg,tags)
# async def action_chatlog_append(self,params:Dict) -> str:
#
# input_msg:AgentMsg = params.get("input").get("msg")
# llm_result = params.get("llm_result")
# chatsession = self.get_session_from_msg(input_msg)
# resp_msg = params.get("resp_msg")
# if resp_msg:
# tags = llm_result.raw_result.get("tags")
# chatsession.append(input_msg,tags)
# chatsession.append(resp_msg,tags)
return "OK"
# return "OK"
async def load_worklogs(self,operator_id:str,owner_id:str=None, work_types:List[str]=None,token_limit=800):
conn = self._get_conn()
c = conn.cursor()
query = 'SELECT * FROM worklog WHERE 1=1'
params = []
if operator_id is not None:
query += ' AND operator=?'
params.append(operator_id)
if owner_id is not None:
query += ' AND owner_id=?'
params.append(owner_id)
if work_types:
query += ' AND work_type IN ({})'.format(', '.join('?'*len(work_types)))
params.extend(work_types)
query += ' ORDER BY timestamp DESC LIMIT 8'
c.execute(query, tuple(params))
rows = c.fetchall()
conn.close()
return [self.from_db_row(row) for row in rows]
def _create_table(self,conn):
c = conn.cursor()
c.execute('''
CREATE TABLE IF NOT EXISTS worklog (
logid TEXT PRIMARY KEY,
owner_id TEXT,
work_type TEXT,
timestamp REAL,
content TEXT,
result TEXT,
meta TEXT,
operator TEXT
)
''')
conn.commit()
conn.close()
@classmethod
def from_db_row(self,row):
log = AgentWorkLog()
# 这里高度依赖表结构的顺序
log.logid, log.owner_id, log.work_type, log.timestamp, log.content, log.result, meta_str, log.operator = row
log.meta = json.loads(meta_str) if meta_str else None
return log
async def append_worklog(self,log:AgentWorkLog)->str:
conn = self._get_conn()
c = conn.cursor()
# 将meta字典转换为JSON字符串
meta_str = json.dumps(log.meta,ensure_ascii=False) if log.meta else None
c.execute('''
INSERT INTO worklog (logid, owner_id, work_type, timestamp, content, result, meta, operator)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
''', (log.logid, log.owner_id, log.work_type, log.timestamp, log.content, log.result, meta_str, log.operator))
conn.commit()
conn.close()
async def get_contact_summary(self,contact_id:str) -> str:
if contact_id is None:
return None
@@ -114,8 +193,6 @@ class AgentMemory:
async def update_sth_summary(self,sth_id:str,summary:str) -> str:
return None
async def get_log_summary(self,msg:AgentMsg) -> str:
return None