@@ -13,6 +13,7 @@ from ml_model.services.gemini import Gemini from ml_model.services.geminiimage import Geminiimage from ml_model.services.gptimage import Gptimage from ml_model.services.hailuo import Hailuo +from ml_model.services.hunyuan import Hunyuan from ml_model.services.sora import Sora from ml_model.services.speedance import Speedance from ml_model.services.granite import Granite @@ -33,7 +34,9 @@ from ml_model.services.raifgpt import Raifgpt from ml_model.services.runway import Runway from ml_model.services.ray import Ray from ml_model.services.recraft import Recraft +from ml_model.services.reve import Reve from ml_model.services.sdxlemoji import Sdxlemoji +from ml_model.services.seedream import Seedream from ml_model.services.stablediffusion import Stablediffusion from ml_model.services.upscaleai import Upscaleai from ml_model.services.veo import Veo @@ -0,0 +1,53 @@ +import time +from datetime import timedelta +from decimal import Decimal +from io import BytesIO + +import requests +from django.core.files import File + +from messages.models import Message +from ml_model.services.base import SimpleService +from ml_model.tasks import replicate_run + +from payments.exceptions.insufficient_balance import InsufficientBalance +from payments.selectors.payment_plan_selector import PaymentPlanSelector + + +class Hunyuan(SimpleService): + + PRICE = Decimal('1.575') + + _CALLBACK = 'tencent/hunyuan-video:6c9132aee14409cd6568d030453f1ba50f5f3412b844fe67f78a9eb62d55664f' + + def calculate_price(self, process_time: timedelta) -> Decimal: + price = self.PRICE * Decimal(process_time.total_seconds()) + return price.quantize(Decimal('0.1'), rounding='ROUND_UP') + + def save_results(self, content: str, t: timedelta, video: str, save: bool = True) -> list[Message]: + msg = Message( + content=content, + content_object=self.store, + elapsed_time=t, + file=File(BytesIO(requests.get(video).content), '.mp4'), + ) + if save: + return Message.objects.bulk_create([msg]) + return [msg] + + def make(self, input_message: Message, save: bool = True) -> list[Message]: + if ( + (balance := PaymentPlanSelector(self.store.user).get_current_balance()) + < (cost := Decimal('378')) + ): + raise InsufficientBalance(balance, cost) + callback_data = { + 'prompt': self.translate_prompt(input_message.content), + **input_message.info, + } + start_time = time.time() + video = replicate_run(self._CALLBACK, callback_data) + process_time = timedelta(seconds=(time.time() - start_time)) + self.handle_invoice(input_message.content_object.model, process_time=process_time) + msgs = self.save_results(input_message.content, process_time, video, save) + return msgs @@ -0,0 +1,64 @@ +import base64 +import time +from datetime import timedelta +from decimal import Decimal +from io import BytesIO + +import filetype +import requests +from django.core.files import File + +from messages.models import Message +from ml_model.services.base import SimpleService +from ml_model.tasks import replicate_run + + +class Reve(SimpleService): + PRICE = { + 'create': Decimal('7.5'), + 'edit-fast': Decimal('3') + } + + def calculate_price(self, type: str) -> Decimal: + return self.PRICE[type].quantize(Decimal('0.1'), rounding='ROUND_UP') + + def save_results( + self, + prompt: str, + image: str, + time: timedelta, + save: bool = True, + ) -> list[Message]: + messages: list[Message] = [] + messages.append( + Message( + content_object=self.store, + elapsed_time=time, + content=prompt, + file=File(BytesIO(requests.get(image).content), '.png'), + ) + ) + if save: + return Message.objects.bulk_create(messages) + return messages + + def make(self, input_message: Message, save: bool = True) -> list[Message]: + start_time = time.time() + callback_data = { + 'prompt': self.translate_prompt(input_message.content), + **input_message.info, + } + type = 'create' + if input_message.file: + kind = filetype.guess(input_message.file.read(20)) + mime = kind.mime if kind else 'application/octet-stream' + input_message.file.seek(0) + image = f'data:{mime};base64,{base64.b64encode(input_message.file.read()).decode("utf-8")}' + input_message.file.close() + callback_data.update({'image': image}) + type = 'edit-fast' + image = replicate_run(f'reve/{type}', callback_data) + process_time = timedelta(seconds=(time.time() - start_time)) + self.handle_invoice(input_message.content_object.model, type=type) + msgs = self.save_results(input_message.content, image, process_time, save) + return msgs @@ -0,0 +1,60 @@ +import base64 +import logging +import time +from datetime import timedelta +from decimal import Decimal +from io import BytesIO + +import filetype +import requests +from django.core.files import File + +from messages.models import Message +from ml_model.models import ModelCategory, ModelInput, ModelParameter +from ml_model.services.base import SimpleService +from ml_model.tasks import replicate_run + + +class Seedream(SimpleService): + PRICE = Decimal('9') + + def calculate_price(self, max_images: int) -> Decimal: + return self.PRICE.quantize(Decimal('0.1'), rounding='ROUND_UP') * max_images + + def save_results(self, prompt: str, images: list, time: timedelta, save: bool = True) -> list[Message]: + messages: list[Message] = [] + for image in images: + messages.append( + Message( + content_object=self.store, + elapsed_time=time, + content=prompt, + file=File(BytesIO(requests.get(image).content), '.png'), + ) + ) + if save: + return Message.objects.bulk_create(messages) + return messages + + def make(self, input_message: Message, save: bool = True) -> list[Message]: + start_time = time.time() + callback_data = { + 'prompt': self.translate_prompt(input_message.content), + 'size': 'custom', + **input_message.info, + } + if input_message.info.get('story_mode', False): + callback_data.update({'sequential_image_generation': 'auto', 'max_images': 5}) + callback_data['prompt'] = f'Generate a sequence of multiple images. {callback_data["prompt"]}' + if input_message.file: + kind = filetype.guess(input_message.file.read(20)) + mime = kind.mime if kind else 'application/octet-stream' + input_message.file.seek(0) + image = f'data:{mime};base64,{base64.b64encode(input_message.file.read()).decode("utf-8")}' + input_message.file.close() + callback_data.update({'image_input': [image]}) + images = replicate_run('bytedance/seedream-4', callback_data) + process_time = timedelta(seconds=(time.time() - start_time)) + self.handle_invoice(input_message.content_object.model, max_images=len(images)) + msgs = self.save_results(input_message.content, images, process_time, save) + return msgs