File size: 2,958 Bytes
814baac 4e5884c 29cfad5 345cfbe af26a45 29cfad5 814baac 4e5884c 29cfad5 814baac 4e5884c 29cfad5 af26a45 345cfbe 814baac 29cfad5 af26a45 a50f8ce 29cfad5 af26a45 29cfad5 af26a45 29cfad5 af26a45 814baac 4e5884c 29cfad5 af26a45 29cfad5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_framework import status
from agent_manager import get_or_create_agent, end_session, get_message_list, maybe_delete_session_agent
from django.conf import settings
@csrf_exempt
@permission_classes([AllowAny])
@api_view(['GET'])
def hello(request):
return Response({"message": "Hello from Grammo!"})
@csrf_exempt
@permission_classes([AllowAny])
@api_view(['POST'])
def chat(request):
"""Start or continue an existing chat session."""
# Prefer secure HttpOnly cookie for session tracking
cookie_session = request.COOKIES.get("gm_session")
chat_session = int(request.data.get("chat_session", 0))
if chat_session == 0:
maybe_delete_session_agent(cookie_session)
cookie_session = None
message = request.data.get("message")
if not message:
return Response({
"status": "error",
"response": "Invalid message."
}, status=status.HTTP_400_BAD_REQUEST)
# Use cookie if present; otherwise create a new session
agent, session_key = get_or_create_agent(cookie_session, chat_session)
mode = request.data.get("mode")
tone = request.data.get("tone")
messages = get_message_list(mode, tone, message)
result = agent.invoke({ "messages": messages },
config={ "configurable": {"thread_id": session_key } }
)
last_message = result.get('messages', [])[-1] if result.get('messages') else None
if not (last_message and hasattr(last_message, 'content') and last_message.content):
return Response({
"status": "error",
"response": "Server Error"
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
resp = Response({
"status": "success",
"response": last_message.content
}, status=status.HTTP_200_OK)
# If cookie was missing, set it now with secure attributes
if not cookie_session:
secure = True if settings.MODE == 'production' else False
samesite = 'None' if settings.MODE == 'production' else 'Lax'
resp.set_cookie(
"gm_session",
value=session_key,
httponly=True,
secure=secure,
samesite=samesite,
max_age=60 * 60 * 24
)
return resp
@csrf_exempt
@permission_classes([AllowAny])
@api_view(['POST'])
def end(request):
"""End and delete the chat session."""
cookie_session = request.COOKIES.get("gm_session")
if end_session(cookie_session):
resp = Response({"status": "success", "message": "Session ended successfully"})
# Clear cookie
resp.delete_cookie("gm_session")
return resp
return Response({
"status": "error",
"response": "No active session."
}, status=status.HTTP_404_NOT_FOUND)
def handler404(request, exception):
"""Custom 404 handler that returns JSON response."""
return Response({
"status": "error",
"response": "Not found"
}, status=status.HTTP_404_NOT_FOUND)
|