91 lines
3.4 KiB
Python
91 lines
3.4 KiB
Python
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()
|