Skip to content

Commit

Permalink
feat: add chat_completion action on the room endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
helllllllder committed Jul 12, 2023
1 parent 5a5317d commit fd9941d
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 2 deletions.
23 changes: 22 additions & 1 deletion chats/apps/api/v1/msgs/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ def create(self, validated_data):
file_type.startswith("audio")
or file_type.lower() in settings.UNPERMITTED_AUDIO_TYPES
):

export_conf = {"format": settings.AUDIO_TYPE_TO_CONVERT}
if settings.AUDIO_CODEC_TO_CONVERT != "":
export_conf["codec"] = settings.AUDIO_CODEC_TO_CONVERT
Expand Down Expand Up @@ -210,3 +209,25 @@ class Meta:

class MessageWSSerializer(MessageSerializer):
pass


class ChatCompletionSerializer(serializers.ModelSerializer):
role = serializers.SerializerMethodField(read_only=True)
content = serializers.CharField(read_only=True, source="text")

class Meta:
model = ChatMessage
fields = [
"role",
"content",
]

extra_kwargs = {
"media_file": {"write_only": True},
}

def get_role(self, message: ChatMessage):
if message.contact:
return "user"
else:
return "assistant"
24 changes: 23 additions & 1 deletion chats/apps/api/v1/rooms/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
from rest_framework.viewsets import GenericViewSet

from chats.apps.api.v1 import permissions as api_permissions
from chats.apps.api.v1.internal.rest_clients.openai_rest_client import OpenAIClient
from chats.apps.api.v1.msgs.serializers import ChatCompletionSerializer
from chats.apps.api.v1.rooms import filters as room_filters
from chats.apps.api.v1.rooms.serializers import (
RoomMessageStatusSerializer,
Expand Down Expand Up @@ -237,4 +239,24 @@ def perform_destroy(self, instance):
)
def chat_completion(self, request, *args, **kwargs):
room = self.get_object()
pass
token = room.queue.sector.project.openai_token
if not token:
return Response(
status=status.HTTP_400_BAD_REQUEST,
data={"detail": "OpenAI token not found"},
)
messages = room.last_5_messages()
serialized_data = ChatCompletionSerializer(messages).data
sector = room.queue.sector
if sector.completion_context:
serialized_data.append(
{"role": "system", "content": sector.completion_context}
)

openai_client = OpenAIClient()
completion_response = openai_client.chat_completion(
token=token, messages=serialized_data
)
return Response(
status=completion_response.status_code, data=completion_response.json()
)
4 changes: 4 additions & 0 deletions chats/apps/rooms/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,10 @@ def serialized_ws_data(self):

return RoomSerializer(self).data

@property
def last_5_messages(self):
return self.messages.exclude(text="").order_by("-created_on")[:5]

def close(self, tags: list = [], end_by: str = ""):
self.is_active = False
self.ended_at = timezone.now()
Expand Down

0 comments on commit fd9941d

Please sign in to comment.