Files
rag/api/session_routes.py
lacerate551 183a57e7f1 refactor(api): 统一响应格式迁移 + 异步任务系统 + 状态码体系完善
- 将全部路由文件(12个)的 jsonify 响应迁移至 success_response/error_response 统一格式
- 修复 sync_routes.py error_response 参数错误(P0)
- 新增异步任务系统:task_registry + task_routes
- 新增状态码:TASK_NOT_FOUND(4014)、TASK_CONFLICT(4015)、REINDEX_ERROR(5040)
- 修正 task_routes/exam_pkg 中语义不匹配的状态码
- 更新 curl 测试手册、后端对接规范文档
- 添加缓存性能报告和 Redis 迁移计划
2026-06-05 22:56:00 +08:00

125 lines
4.1 KiB
Python

"""
会话管理 API
路由:
- GET /sessions - 用户会话列表
- GET /history/<session_id> - 获取会话历史
- DELETE /session/<session_id> - 删除会话
- POST /clear/<session_id> - 清空会话历史
"""
from flask import Blueprint, request, jsonify, current_app
from auth.gateway import require_gateway_auth
from core.status_codes import SUCCESS, BAD_REQUEST, FORBIDDEN, NOT_FOUND, INTERNAL_ERROR, SERVICE_UNAVAILABLE, DELETE_SUCCESS
from api.response_utils import success_response, error_response
session_bp = Blueprint('session', __name__)
@session_bp.route('/sessions', methods=['GET'])
@require_gateway_auth
def get_sessions():
"""
获取用户的会话列表
返回:
{
"sessions": [
{
"session_id": "...",
"created_at": "...",
"last_active": "...",
"preview": "最后一条消息预览..."
}
]
}
"""
session_manager = current_app.config['SESSION_MANAGER']
if session_manager is None:
return error_response("SERVICE_UNAVAILABLE", SERVICE_UNAVAILABLE, "会话服务不可用", http_status=503)
user_id = request.current_user["user_id"]
sessions = session_manager.get_user_sessions(user_id, limit=20)
# 添加最后一条消息预览
for s in sessions:
history = session_manager.get_history(s["session_id"], limit=1)
if history:
s["preview"] = history[0]["content"][:50] + "..."
else:
s["preview"] = "空会话"
return success_response(data={"sessions": sessions})
@session_bp.route('/history/<session_id>', methods=['GET'])
@require_gateway_auth
def get_history(session_id):
"""
获取会话历史
返回:
{
"history": [
{"role": "user/assistant", "content": "...", "created_at": "..."}
]
}
"""
session_manager = current_app.config['SESSION_MANAGER']
if session_manager is None:
return error_response("SERVICE_UNAVAILABLE", SERVICE_UNAVAILABLE, "会话服务不可用", http_status=503)
user_id = request.current_user["user_id"]
# 验证会话归属
sessions = session_manager.get_user_sessions(user_id)
session_ids = [s["session_id"] for s in sessions]
if session_id not in session_ids:
return error_response("FORBIDDEN", FORBIDDEN, "无权访问此会话", http_status=403)
history = session_manager.get_history(session_id, limit=100)
return success_response(data={"history": history})
@session_bp.route('/session/<session_id>', methods=['DELETE'])
@require_gateway_auth
def delete_session(session_id):
"""删除会话"""
session_manager = current_app.config['SESSION_MANAGER']
if session_manager is None:
return error_response("SERVICE_UNAVAILABLE", SERVICE_UNAVAILABLE, "会话服务不可用", http_status=503)
user_id = request.current_user["user_id"]
# 验证会话归属
sessions = session_manager.get_user_sessions(user_id)
session_ids = [s["session_id"] for s in sessions]
if session_id not in session_ids:
return error_response("FORBIDDEN", FORBIDDEN, "无权访问此会话", http_status=403)
session_manager.delete_session(session_id)
return success_response(status_code=DELETE_SUCCESS, message="会话已删除")
@session_bp.route('/clear/<session_id>', methods=['POST'])
@require_gateway_auth
def clear_history(session_id):
"""清空会话历史(保留会话)"""
session_manager = current_app.config['SESSION_MANAGER']
if session_manager is None:
return error_response("SERVICE_UNAVAILABLE", SERVICE_UNAVAILABLE, "会话服务不可用", http_status=503)
user_id = request.current_user["user_id"]
# 验证会话归属
sessions = session_manager.get_user_sessions(user_id)
session_ids = [s["session_id"] for s in sessions]
if session_id not in session_ids:
return error_response("FORBIDDEN", FORBIDDEN, "无权访问此会话", http_status=403)
session_manager.clear_history(session_id)
return success_response(message="历史已清空")