Add AgentSessionService and refactor agent routes

Move session-related responsibilities into a new application-layer AgentSessionService (and AgentSessionFeedbackResult dataclass), provide a bootstrap factory (get_agent_session_service), and update agent API routes to call the service instead of accessing ConversationStore directly. Routes now translate ValueError into 404 responses and use service methods for get/list/history/delete/feedback. Also update package exports and docs/READMEs to declare the backend architecture authority, enforce api -> application -> domain ports -> infrastructure boundaries, and call out legacy services/workflows as migration-only. These changes centralize session logic in the application layer and tighten architecture guidance for future backend work.
This commit is contained in:
ash66
2026-05-22 09:50:30 +08:00
parent 37f7a60b0a
commit 091a02c522
8 changed files with 223 additions and 33 deletions

View File

@@ -65,7 +65,7 @@ async def chat_with_session(request: ChatRequest):
model=request.model or settings.llm_model,
top_k=request.top_k or settings.rag_top_k,
)
session = get_conversation_store().get_session(session_id)
session = get_agent_session_service().get_session(session_id)
return ChatResponse(
session_id=session_id,
answer=result.answer,
@@ -133,45 +133,52 @@ async def chat_stream(request: ChatRequest):
@router.get("/session/{session_id}", response_model=SessionInfo)
async def get_session_info(session_id: str):
"""Return session info."""
session = get_conversation_store().get_session(session_id)
if not session:
raise HTTPException(status_code=404, detail="会话不存在或已过期")
return SessionInfo(
session_id=session.session_id,
message_count=len(session.messages),
created_at=session.created_at,
updated_at=session.updated_at,
)
try:
session = get_agent_session_service().get_session(session_id)
return SessionInfo(
session_id=session.session_id,
message_count=len(session.messages),
created_at=session.created_at,
updated_at=session.updated_at,
)
except ValueError as exc:
raise HTTPException(status_code=404, detail=str(exc))
@router.get("/session/{session_id}/history")
async def get_session_history(session_id: str, max_turns: int = 5):
"""Return session history."""
session = get_conversation_store().get_session(session_id)
if not session:
raise HTTPException(status_code=404, detail="会话不存在或已过期")
history = [{"role": msg.role, "content": msg.content} for msg in session.messages[-(max_turns * 2):]]
return {"session_id": session_id, "history": history}
try:
history = get_agent_session_service().get_history(session_id=session_id, max_turns=max_turns)
return {"session_id": session_id, "history": history}
except ValueError as exc:
raise HTTPException(status_code=404, detail=str(exc))
@router.delete("/session/{session_id}")
async def delete_session(session_id: str):
"""Delete session."""
if not get_conversation_store().delete_session(session_id):
raise HTTPException(status_code=404, detail="会话不存在")
return {"message": "会话已删除", "session_id": session_id}
try:
get_agent_session_service().delete_session(session_id)
return {"message": "会话已删除", "session_id": session_id}
except ValueError as exc:
raise HTTPException(status_code=404, detail=str(exc))
@router.get("/sessions", response_model=List[SessionInfo])
async def list_sessions():
"""List sessions."""
return [SessionInfo(**item) for item in get_conversation_store().list_sessions()]
return [SessionInfo(**item) for item in get_agent_session_service().list_sessions()]
@router.post("/feedback")
async def submit_feedback(request: FeedbackRequest):
"""Submit feedback."""
session = get_conversation_store().get_session(request.session_id)
if not session:
raise HTTPException(status_code=404, detail="会话不存在")
return {"message": "反馈已提交", "session_id": request.session_id, "message_index": request.message_index}
try:
result = get_agent_session_service().submit_feedback(
session_id=request.session_id,
message_index=request.message_index,
)
return {"message": "反馈已提交", "session_id": result.session_id, "message_index": result.message_index}
except ValueError as exc:
raise HTTPException(status_code=404, detail=str(exc))