@@ -6,5 +6,6 @@ from .ml_service import ( VideoView, CodeView, ParamView, + OpenAICompatibleAPIView ) from .user import UserInfoAPIView @@ -1,5 +1,8 @@ import logging +import uuid +from datetime import datetime +from django.db.models import Q from drf_spectacular.utils import extend_schema from rest_framework import status from rest_framework.response import Response @@ -42,6 +45,39 @@ class CodeView(BaseGenerationView): description = 'Get Code Generation from model in URL slug. Only POST Requests.' +class OpenAICompatibleAPIView(BaseGenerationView): + + def post(self, request, *args, **kwargs): + content = '\n'.join(f"[{msg['role'].capitalize()}] {msg['content']}" for msg in request.data.pop('messages')) + version = request.data.pop('model') + request.data['info'] = {key: request.data.pop(key) for key in request.data.copy().keys()} + request.data['content'] = content + request.data['info']['version'] = version + model_slug = NeuronModel.objects.filter( + Q(model_modelversions__slug=request.data['info']['version']) | Q(slug=request.data['info']['version']) + ).first().slug + result = super().post(request, model_slug, True, *args, **kwargs) + return Response({ + 'id': str(uuid.uuid4()), + 'object': 'chat.completion', + 'created': int(result.data[0]['created_at'].timestamp()), + 'model': version, + 'choices': [ + { + 'index': 0, + 'message': { + 'role': 'assistant', + 'content': result.data[0]['content'] + }, + 'finish_reason': 'stop' + } + ], + 'service_tier': 'auto', + 'system_fingerprint': str(uuid.uuid4()), + 'usage': None + }, 201) + + class ParamView(APIView): @extend_schema(responses={200: ModelParameterSerializer}) def get(self, request, model_slug, *args, **kwargs): @@ -4,6 +4,7 @@ from tools.public_api import views urlpatterns = [ path('api-key', views.APIKeyView.as_view()), path('me', views.UserInfoAPIView.as_view()), + path('openai/chat/completions', views.OpenAICompatibleAPIView.as_view()) ] for view in (