add banbanmini backend
This commit is contained in:
90
talkingq-url/services/history_service.py
Normal file
90
talkingq-url/services/history_service.py
Normal file
@@ -0,0 +1,90 @@
|
||||
import time
|
||||
from typing import Dict, List, Optional
|
||||
from services.conversation_history import conversation_history_manager
|
||||
from services.role_manager import role_manager
|
||||
|
||||
class HistoryService:
|
||||
async def get_history_paginated(
|
||||
self,
|
||||
device_id: str,
|
||||
role_key: Optional[str] = None,
|
||||
page: int = 1,
|
||||
page_size: int = 20,
|
||||
since: Optional[float] = None,
|
||||
until: Optional[float] = None
|
||||
) -> Dict:
|
||||
"""分页获取会话历史"""
|
||||
device_history = await conversation_history_manager.get_history(device_id, role_key)
|
||||
if not device_history or not device_history.history:
|
||||
return {
|
||||
"total": 0,
|
||||
"page": page,
|
||||
"page_size": page_size,
|
||||
"data": [],
|
||||
"role_key": role_key or "",
|
||||
"role_name": "未知角色"
|
||||
}
|
||||
|
||||
role_info = await role_manager.get_role(device_history.role_key) if device_history.role_key else None
|
||||
role_name = role_info.get("name", "未知角色") if role_info else "未知角色"
|
||||
|
||||
filtered_history = device_history.history
|
||||
if since:
|
||||
filtered_history = [msg for msg in filtered_history if
|
||||
msg.get("timestamp", 0) >= since]
|
||||
if until:
|
||||
filtered_history = [msg for msg in filtered_history if
|
||||
msg.get("timestamp", 0) <= until]
|
||||
|
||||
total_messages = len(filtered_history)
|
||||
|
||||
start_idx = (page - 1) * page_size
|
||||
end_idx = start_idx + page_size
|
||||
paged_messages = filtered_history[start_idx:end_idx]
|
||||
|
||||
current_time = time.time()
|
||||
for i, msg in enumerate(paged_messages):
|
||||
if "timestamp" not in msg:
|
||||
paged_messages[i]["timestamp"] = current_time - (total_messages - i) * 60
|
||||
|
||||
return {
|
||||
"total": total_messages,
|
||||
"page": page,
|
||||
"page_size": page_size,
|
||||
"data": paged_messages,
|
||||
"role_key": device_history.role_key or "",
|
||||
"role_name": role_name
|
||||
}
|
||||
|
||||
async def get_history_summary(self, device_id: str, days: int = 7) -> List[Dict]:
|
||||
"""获取会话历史摘要"""
|
||||
role_histories = await conversation_history_manager.get_device_role_histories(device_id)
|
||||
if not role_histories:
|
||||
return []
|
||||
|
||||
summaries = []
|
||||
cutoff_time = time.time() - (days * 24 * 60 * 60)
|
||||
|
||||
for role_key, history in role_histories.items():
|
||||
if history.last_interaction_time < cutoff_time:
|
||||
continue
|
||||
|
||||
role_info = await role_manager.get_role(role_key)
|
||||
role_name = role_info.get("name", "未知角色") if role_info else "未知角色"
|
||||
|
||||
last_message = ""
|
||||
if history.history:
|
||||
last_message = history.history[-1].get("assistant", "")[:100]
|
||||
|
||||
summaries.append({
|
||||
"role_key": role_key,
|
||||
"role_name": role_name,
|
||||
"last_interaction": history.last_interaction_time,
|
||||
"message_count": len(history.history),
|
||||
"last_message": last_message
|
||||
})
|
||||
|
||||
summaries.sort(key=lambda x: x["last_interaction"], reverse=True)
|
||||
return summaries
|
||||
|
||||
history_service = HistoryService()
|
||||
Reference in New Issue
Block a user