|
|
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.""" |
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
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 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"}) |
|
|
|
|
|
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) |
|
|
|
|
|
|