ChatData / lib /sessions.py
lqhl's picture
Synced repo using 'sync_with_huggingface' Github Action
0e573d0 verified
raw
history blame contribute delete
No virus
3.21 kB
import json
try:
from sqlalchemy.orm import declarative_base
except ImportError:
from sqlalchemy.ext.declarative import declarative_base
from langchain.schema import BaseChatMessageHistory
from datetime import datetime
from sqlalchemy import Column, Text, orm, create_engine
from .schemas import create_message_model, create_session_table
def get_sessions(engine, model_class, user_id):
with orm.sessionmaker(engine)() as session:
result = (
session.query(model_class)
.where(
model_class.session_id == user_id
)
.order_by(model_class.create_by.desc())
)
return json.loads(result)
class SessionManager:
def __init__(self, session_state, host, port, username, password,
db='chat', sess_table='sessions', msg_table='chat_memory') -> None:
conn_str = f'clickhouse://{username}:{password}@{host}:{port}/{db}?protocol=https'
self.engine = create_engine(conn_str, echo=False)
self.sess_model_class = create_session_table(
sess_table, declarative_base())
self.sess_model_class.metadata.create_all(self.engine)
self.msg_model_class = create_message_model(
msg_table, declarative_base())
self.msg_model_class.metadata.create_all(self.engine)
self.Session = orm.sessionmaker(self.engine)
self.session_state = session_state
def list_sessions(self, user_id):
with self.Session() as session:
result = (
session.query(self.sess_model_class)
.where(
self.sess_model_class.user_id == user_id
)
.order_by(self.sess_model_class.create_by.desc())
)
sessions = []
for r in result:
sessions.append({
"session_id": r.session_id.split("?")[-1],
"system_prompt": r.system_prompt,
})
return sessions
def modify_system_prompt(self, session_id, sys_prompt):
with self.Session() as session:
session.update(self.sess_model_class).where(
self.sess_model_class == session_id).value(system_prompt=sys_prompt)
session.commit()
def add_session(self, user_id, session_id, system_prompt, **kwargs):
with self.Session() as session:
elem = self.sess_model_class(
user_id=user_id, session_id=session_id, system_prompt=system_prompt,
create_by=datetime.now(), additionals=json.dumps(kwargs)
)
session.add(elem)
session.commit()
def remove_session(self, session_id):
with self.Session() as session:
session.query(self.sess_model_class).where(
self.sess_model_class.session_id == session_id).delete()
# session.query(self.msg_model_class).where(self.msg_model_class.session_id==session_id).delete()
if "agent" in self.session_state:
self.session_state.agent.memory.chat_memory.clear()
if "file_analyzer" in self.session_state:
self.session_state.file_analyzer.clear_files()