Skip to content

Commit d06a48c

Browse files
feat: mem version1
1 parent 9fd11a9 commit d06a48c

File tree

4 files changed

+609
-1
lines changed

4 files changed

+609
-1
lines changed
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
'''
2+
Author: ai-business-hql [email protected]
3+
Date: 2025-11-19
4+
LastEditors: ai-business-hql [email protected]
5+
LastEditTime: 2025-11-19
6+
FilePath: /ComfyUI-Copilot/backend/dao/session_message_table.py
7+
Description: Session message table for conversation memory management with compression
8+
'''
9+
10+
import os
11+
import json
12+
from typing import Dict, Any, Optional, List
13+
from sqlalchemy import create_engine, Column, Integer, String, DateTime, Text
14+
from sqlalchemy.ext.declarative import declarative_base
15+
from sqlalchemy.orm import sessionmaker
16+
from datetime import datetime
17+
18+
# 创建数据库基类
19+
Base = declarative_base()
20+
21+
# 定义session_message表模型
22+
class SessionMessage(Base):
23+
__tablename__ = 'session_message'
24+
25+
id = Column(Integer, primary_key=True, autoincrement=True)
26+
session_id = Column(String(255), nullable=False, unique=True) # 每个session只有一条记录
27+
messages = Column(Text, nullable=False) # JSON字符串,存储完整消息列表
28+
index = Column(Integer, default=0) # 已压缩的消息数量,messages[:index]已被摘要
29+
summary = Column(Text, nullable=True) # 压缩后的历史摘要
30+
attributes = Column(Text, nullable=True) # JSON字符串,存储额外属性
31+
created_at = Column(DateTime, default=datetime.utcnow)
32+
33+
def to_dict(self):
34+
return {
35+
'id': self.id,
36+
'session_id': self.session_id,
37+
'messages': json.loads(self.messages) if self.messages else [],
38+
'index': self.index,
39+
'summary': self.summary,
40+
'attributes': json.loads(self.attributes) if self.attributes else None,
41+
'created_at': self.created_at.isoformat() if self.created_at else None
42+
}
43+
44+
class SessionMessageManager:
45+
"""会话消息管理器"""
46+
47+
def __init__(self, db_path: str = None):
48+
if db_path is None:
49+
# 默认数据库路径
50+
current_dir = os.path.dirname(os.path.abspath(__file__))
51+
db_dir = os.path.join(current_dir, '..', 'data')
52+
os.makedirs(db_dir, exist_ok=True)
53+
db_path = os.path.join(db_dir, 'session_message.db')
54+
55+
self.db_path = db_path
56+
self.engine = create_engine(f'sqlite:///{db_path}', echo=False)
57+
self.SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=self.engine)
58+
59+
# 创建表
60+
Base.metadata.create_all(bind=self.engine)
61+
62+
def get_session(self):
63+
"""获取数据库会话"""
64+
return self.SessionLocal()
65+
66+
def get_session_message(self, session_id: str) -> Optional[Dict[str, Any]]:
67+
"""获取指定session的消息记录"""
68+
session = self.get_session()
69+
try:
70+
record = session.query(SessionMessage)\
71+
.filter(SessionMessage.session_id == session_id)\
72+
.first()
73+
74+
if record:
75+
return record.to_dict()
76+
return None
77+
finally:
78+
session.close()
79+
80+
def save_session_message(
81+
self,
82+
session_id: str,
83+
messages: List[Dict[str, Any]],
84+
index: int = 0,
85+
summary: str = None,
86+
attributes: Optional[Dict[str, Any]] = None
87+
) -> int:
88+
"""保存或更新会话消息记录"""
89+
session = self.get_session()
90+
try:
91+
# 查找是否已存在
92+
record = session.query(SessionMessage)\
93+
.filter(SessionMessage.session_id == session_id)\
94+
.first()
95+
96+
if record:
97+
# 更新已有记录
98+
record.messages = json.dumps(messages, ensure_ascii=False)
99+
record.index = index
100+
record.summary = summary
101+
if attributes:
102+
record.attributes = json.dumps(attributes, ensure_ascii=False)
103+
session.commit()
104+
session.refresh(record)
105+
return record.id
106+
else:
107+
# 创建新记录
108+
new_record = SessionMessage(
109+
session_id=session_id,
110+
messages=json.dumps(messages, ensure_ascii=False),
111+
index=index,
112+
summary=summary,
113+
attributes=json.dumps(attributes, ensure_ascii=False) if attributes else None
114+
)
115+
session.add(new_record)
116+
session.commit()
117+
session.refresh(new_record)
118+
return new_record.id
119+
except Exception as e:
120+
session.rollback()
121+
raise e
122+
finally:
123+
session.close()
124+
125+
def update_summary(self, session_id: str, summary: str, index: int) -> bool:
126+
"""更新指定session的摘要和索引"""
127+
session = self.get_session()
128+
try:
129+
record = session.query(SessionMessage)\
130+
.filter(SessionMessage.session_id == session_id)\
131+
.first()
132+
133+
if record:
134+
record.summary = summary
135+
record.index = index
136+
session.commit()
137+
return True
138+
return False
139+
except Exception as e:
140+
session.rollback()
141+
raise e
142+
finally:
143+
session.close()
144+
145+
def delete_session_message(self, session_id: str) -> bool:
146+
"""删除指定session的消息记录"""
147+
session = self.get_session()
148+
try:
149+
record = session.query(SessionMessage)\
150+
.filter(SessionMessage.session_id == session_id)\
151+
.first()
152+
153+
if record:
154+
session.delete(record)
155+
session.commit()
156+
return True
157+
return False
158+
except Exception as e:
159+
session.rollback()
160+
raise e
161+
finally:
162+
session.close()
163+
164+
# 全局会话消息管理器实例
165+
session_message_manager = SessionMessageManager()
166+
167+
def get_session_message(session_id: str) -> Optional[Dict[str, Any]]:
168+
"""获取会话消息的便捷函数"""
169+
return session_message_manager.get_session_message(session_id)
170+
171+
def save_session_message(
172+
session_id: str,
173+
messages: List[Dict[str, Any]],
174+
index: int = 0,
175+
summary: str = None,
176+
attributes: Optional[Dict[str, Any]] = None
177+
) -> int:
178+
"""保存会话消息的便捷函数"""
179+
return session_message_manager.save_session_message(
180+
session_id, messages, index, summary, attributes
181+
)
182+
183+
def update_summary(session_id: str, summary: str, index: int) -> bool:
184+
"""更新摘要的便捷函数"""
185+
return session_message_manager.update_summary(session_id, summary, index)
186+
187+
def delete_session_message(session_id: str) -> bool:
188+
"""删除会话消息的便捷函数"""
189+
return session_message_manager.delete_session_message(session_id)
190+

backend/service/mcp_client.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
Author: ai-business-hql [email protected]
33
Date: 2025-06-16 16:50:17
44
LastEditors: ai-business-hql [email protected]
5-
LastEditTime: 2025-11-18 19:18:30
5+
LastEditTime: 2025-11-19 20:16:03
66
FilePath: /comfyui_copilot/backend/service/mcp-client.py
77
Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
88
'''
@@ -34,6 +34,7 @@
3434

3535
from ..agent_factory import create_agent
3636
from ..service.workflow_rewrite_agent import create_workflow_rewrite_agent
37+
from ..service.message_memory import message_memory_optimize
3738
from ..utils.request_context import get_rewrite_context, get_session_id, get_config
3839
from ..utils.logger import log
3940
from openai.types.responses import ResponseTextDeltaEvent
@@ -117,6 +118,11 @@ def _strip_trailing_whitespace_from_messages(
117118
if not config:
118119
raise ValueError("No config found in request context")
119120

121+
# Optimize messages with memory compression
122+
log.info(f"[MCP] Original messages count: {len(messages)}")
123+
messages = message_memory_optimize(session_id, messages)
124+
log.info(f"[MCP] Optimized messages count: {len(messages)}, messages: {messages}")
125+
120126
# Create MCP server instances
121127
mcp_server = MCPServerSse(
122128
params= {

0 commit comments

Comments
 (0)