ForcePilot/backend/package/yuxi/services/history_query_service.py

72 lines
2.8 KiB
Python

from fastapi import HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from yuxi.agents.buildin import agent_manager
from yuxi.repositories.conversation_repository import ConversationRepository
from yuxi.utils.logging_config import logger
async def get_agent_history_view(
*,
agent_id: str,
thread_id: str,
current_user_id: str,
db: AsyncSession,
) -> dict:
if not agent_manager.get_agent(agent_id):
raise HTTPException(status_code=404, detail=f"智能体 {agent_id} 不存在")
conv_repo = ConversationRepository(db)
conversation = await conv_repo.get_conversation_by_thread_id(thread_id)
if not conversation or conversation.user_id != str(current_user_id) or conversation.status == "deleted":
raise HTTPException(status_code=404, detail="对话线程不存在")
messages = await conv_repo.get_messages_by_thread_id(thread_id)
history: list[dict] = []
role_type_map = {"user": "human", "assistant": "ai", "tool": "tool", "system": "system"}
for msg in messages:
user_feedback = None
if msg.feedbacks:
for feedback in msg.feedbacks:
if feedback.user_id == str(current_user_id):
user_feedback = {
"id": feedback.id,
"rating": feedback.rating,
"reason": feedback.reason,
"created_at": feedback.created_at.isoformat() if feedback.created_at else None,
}
break
msg_dict = {
"id": msg.id,
"type": role_type_map.get(msg.role, msg.role),
"content": msg.content,
"created_at": msg.created_at.isoformat() if msg.created_at else None,
"error_type": msg.extra_metadata.get("error_type") if msg.extra_metadata else None,
"error_message": msg.extra_metadata.get("error_message") if msg.extra_metadata else None,
"extra_metadata": msg.extra_metadata,
"message_type": msg.message_type,
"image_content": msg.image_content,
"feedback": user_feedback,
}
if msg.tool_calls:
msg_dict["tool_calls"] = [
{
"id": str(tc.id),
"name": tc.tool_name,
"function": {"name": tc.tool_name},
"args": tc.tool_input or {},
"tool_call_result": {"content": (tc.tool_output or "")} if tc.status == "success" else None,
"status": tc.status,
"error_message": tc.error_message,
}
for tc in msg.tool_calls
]
history.append(msg_dict)
logger.info(f"Loaded {len(history)} messages with feedback for thread {thread_id}")
return {"history": history}