@@ -1,7 +1,11 @@ +import base64 import logging import uuid from datetime import datetime +from io import BytesIO +import filetype +from django.core.files.uploadedfile import InMemoryUploadedFile from django.db.models import Q from drf_spectacular.utils import extend_schema from rest_framework import status @@ -48,11 +52,39 @@ class CodeView(BaseGenerationView): 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')) + content_lines = [] + file = None + for m in request.data.pop('messages', []): + role = m['role'].capitalize() + msg_content = m.get('content', []) + if isinstance(msg_content, str): + content_lines.append(f"[{role}] {msg_content}") + else: + for c in msg_content: + if c['type'] == 'text': + content_lines.append(f"[{role}] {c['text']}") + elif c['type'] == 'image_url': + data_url = c['image_url']['url'] + encoded = data_url.split('base64')[-1] + buf = BytesIO(base64.b64decode(encoded)) + kind = filetype.guess(buf.read(20)) + buf.seek(0) + mime = kind.mime if kind else 'application/octet-stream' + ext = kind.extension if kind else 'bin' + file = InMemoryUploadedFile( + buf, + field_name="file", + name=f"api-file.{ext}", + content_type=mime, + size=buf.getbuffer().nbytes, + charset=None + ) + content = '\n'.join(content_lines) 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 + request.data['file'] = file model_slug = NeuronModel.objects.filter( Q(model_modelversions__slug=request.data['info']['version']) | Q(slug=request.data['info']['version']) ).first().slug