@@ -3,7 +3,7 @@ import time from datetime import timedelta from decimal import Decimal from io import BytesIO -from typing import Any, Dict, Iterator +from typing import Any, Iterator from pathlib import Path import filetype @@ -48,7 +48,6 @@ class Grok(SimpleService): SUPPORTED_EXTENSIONS = ['PDF', 'DOC', 'DOCX', 'XLSX', 'JPG', 'JPEG', 'PNG', 'WEBP'] - def calculate_price( self, version: str, input_tokens: int, output_tokens: int, image: FieldFile, embedding_tokens: int ) -> Decimal: @@ -81,18 +80,15 @@ class Grok(SimpleService): messages = self.get_chat_history() messages.append({'role': 'user', 'content': input_message.content}) embedding_tokens = 0 - image = None if input_message.file: file_service = FileProcessingService file_bytes = input_message.file.read() kind = filetype.guess(file_bytes[:550]) - if not kind: if Path(input_message.file.name).suffix[1:].upper() not in self.SUPPORTED_EXTENSIONS: raise FileExtensionNotSupported(self.SUPPORTED_EXTENSIONS) raise CorruptedFileError - raw_file_extension = kind.extension file_extension = file_service.get_file_extension(raw_file_extension, file_bytes) if file_extension in ('pdf', 'doc', 'docx', 'xlsx'): @@ -107,7 +103,6 @@ class Grok(SimpleService): ).quantize(Decimal('0.1'), rounding='ROUND_UP') if (balance := PaymentPlanSelector(self.store.user).get_current_balance()) < predict_price: raise InsufficientBalance(balance, predict_price) - if len(text) > 20_000: for proxy in Proxy.objects.all(): document_name = chunks[0].partition(f':{chr(10)}')[2].split(f'{chr(10)}')[0][:100] @@ -130,11 +125,11 @@ class Grok(SimpleService): f'{chunks}. Вопрос: {input_message.content}' ) - elif file_extension in ('jpg', 'jpeg', 'png', 'webp'): image = input_message.file mime = kind.mime if kind else 'application/octet-stream' + input_message.file.seek(0) normalized_image = Image.open(input_message.file) format = 'jpeg' if kind.extension == 'jpg' else kind.extension buf = BytesIO() @@ -148,29 +143,28 @@ class Grok(SimpleService): else: raise FileExtensionNotSupported(self.SUPPORTED_EXTENSIONS) - result = openrouter_run(version, messages, callback_data, 'Grok') - process_time = timedelta(seconds=(time.time() - start_time)) - self.handle_invoice( - input_message.content_object.model, - version=version, - input_tokens=result[1], - output_tokens=result[2], - embedding_tokens=embedding_tokens, - image=image, - ) - msgs = self.save_results(result[0], process_time) - return msgs - - - + result = openrouter_run(version, messages, callback_data, 'Grok') + process_time = timedelta(seconds=(time.time() - start_time)) + self.handle_invoice( + input_message.content_object.model, + version=version, + input_tokens=result[1], + output_tokens=result[2], + embedding_tokens=embedding_tokens, + image=image, + ) + msgs = self.save_results(result[0], process_time) + return msgs - def get_chat_history(self, message_limit: int = 10, max_character_limit: int = 1500) -> list[dict[str, str | list]]: + def get_chat_history( + self, message_limit: int = 10, max_character_limit: int = 1500 + ) -> list[dict[str, str | list]]: if isinstance(self.store, Chat): air_messages = list( reversed( Message.objects.filter( chats_chats_messages=self.store, is_deleted=False, is_sent=True - ).order_by('-created_at')[1:message_limit + 1] + ).order_by('-created_at')[1 : message_limit + 1] ) ) elif isinstance(self.store, APIStore):