openrag/src/api/chat.py
Lucas Oliveira 28e566a1f4
feat: add session delete functionality (#70)
* implement delete user conversation on agent

* format

* implement delete session endpoint

* implement delete session on persistence services

* added deletion of sessions and added fetch sessions with query instead of with useEffect

* removed unused texts

* implemented dropdown menu on conversations
2025-09-24 17:41:53 -03:00

181 lines
5.7 KiB
Python

from starlette.requests import Request
from starlette.responses import JSONResponse, StreamingResponse
from utils.logging_config import get_logger
logger = get_logger(__name__)
async def chat_endpoint(request: Request, chat_service, session_manager):
"""Handle chat requests"""
data = await request.json()
prompt = data.get("prompt", "")
previous_response_id = data.get("previous_response_id")
stream = data.get("stream", False)
filters = data.get("filters")
limit = data.get("limit", 10)
score_threshold = data.get("scoreThreshold", 0)
user = request.state.user
user_id = user.user_id
jwt_token = session_manager.get_effective_jwt_token(user_id, request.state.jwt_token)
if not prompt:
return JSONResponse({"error": "Prompt is required"}, status_code=400)
# Set context variables for search tool (similar to search endpoint)
if filters:
from auth_context import set_search_filters
set_search_filters(filters)
from auth_context import set_search_limit, set_score_threshold
set_search_limit(limit)
set_score_threshold(score_threshold)
if stream:
return StreamingResponse(
await chat_service.chat(
prompt,
user_id,
jwt_token,
previous_response_id=previous_response_id,
stream=True,
),
media_type="text/event-stream",
headers={
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "Cache-Control",
},
)
else:
result = await chat_service.chat(
prompt,
user_id,
jwt_token,
previous_response_id=previous_response_id,
stream=False,
)
return JSONResponse(result)
async def langflow_endpoint(request: Request, chat_service, session_manager):
"""Handle Langflow chat requests"""
data = await request.json()
prompt = data.get("prompt", "")
previous_response_id = data.get("previous_response_id")
stream = data.get("stream", False)
filters = data.get("filters")
limit = data.get("limit", 10)
score_threshold = data.get("scoreThreshold", 0)
user = request.state.user
user_id = user.user_id
jwt_token = session_manager.get_effective_jwt_token(user_id, request.state.jwt_token)
if not prompt:
return JSONResponse({"error": "Prompt is required"}, status_code=400)
# Set context variables for search tool (similar to chat endpoint)
if filters:
from auth_context import set_search_filters
set_search_filters(filters)
from auth_context import set_search_limit, set_score_threshold
set_search_limit(limit)
set_score_threshold(score_threshold)
try:
if stream:
return StreamingResponse(
await chat_service.langflow_chat(
prompt,
user_id,
jwt_token,
previous_response_id=previous_response_id,
stream=True,
),
media_type="text/event-stream",
headers={
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "Cache-Control",
},
)
else:
result = await chat_service.langflow_chat(
prompt,
user_id,
jwt_token,
previous_response_id=previous_response_id,
stream=False,
)
return JSONResponse(result)
except Exception as e:
import traceback
traceback.print_exc()
logger.error("Langflow request failed", error=str(e))
return JSONResponse(
{"error": f"Langflow request failed: {str(e)}"}, status_code=500
)
async def chat_history_endpoint(request: Request, chat_service, session_manager):
"""Get chat history for a user"""
user = request.state.user
user_id = user.user_id
try:
history = await chat_service.get_chat_history(user_id)
return JSONResponse(history)
except Exception as e:
return JSONResponse(
{"error": f"Failed to get chat history: {str(e)}"}, status_code=500
)
async def langflow_history_endpoint(request: Request, chat_service, session_manager):
"""Get langflow chat history for a user"""
user = request.state.user
user_id = user.user_id
try:
history = await chat_service.get_langflow_history(user_id)
return JSONResponse(history)
except Exception as e:
return JSONResponse(
{"error": f"Failed to get langflow history: {str(e)}"}, status_code=500
)
async def delete_session_endpoint(request: Request, chat_service, session_manager):
"""Delete a chat session"""
user = request.state.user
user_id = user.user_id
session_id = request.path_params["session_id"]
try:
# Delete from both local storage and Langflow
result = await chat_service.delete_session(user_id, session_id)
if result.get("success"):
return JSONResponse({"message": "Session deleted successfully"})
else:
return JSONResponse(
{"error": result.get("error", "Failed to delete session")},
status_code=500
)
except Exception as e:
logger.error(f"Error deleting session: {e}")
return JSONResponse(
{"error": f"Failed to delete session: {str(e)}"}, status_code=500
)