@@ -10,8 +10,10 @@ from tools.chats.models import Chat from tools.copywrite.models import Copywrite from tools.public_api.models import APIStore -from messages.models import Message from ml_model.services.base import SimpleService +from ml_model.tasks import openrouter_run + +from messages.models import Message class Deepseek(SimpleService): @@ -36,7 +38,9 @@ class Deepseek(SimpleService): price = input_tokens * price_map['input'] + output_tokens * price_map['output'] + self.PRICE_BIAS return price.quantize(Decimal('0.1'), rounding='ROUND_UP') - def save_results(self, content: Iterator[Any], t: timedelta, save: bool = True) -> list[Message]: + def save_results( + self, content: str, t: timedelta, save: bool = True + ) -> list[Message]: msgs = [ Message( content=content, @@ -51,46 +55,28 @@ class Deepseek(SimpleService): def make(self, input_message: Message, save: bool = True) -> list[Message]: info = input_message.info.copy() version = info.pop('version') + callback_data = { + **input_message.info, + } + messages = self.get_chat_history() start_time = time.time() - chat_history = self.get_chat_history() - message = f"История диалога:{chat_history}. Новое сообщение от пользователя: {input_message.content} AI:'" - with httpx.Client( - base_url='https://openrouter.ai/api/v1', - headers={'Authorization': f'Bearer {settings.OPENROUTER_API_KEY}'}, - ) as client: - resp = client.post( - 'chat/completions', - json={ - 'model': version, - 'messages': [{'role': 'user', 'content': message}], - }, - ) - if ( - (data := resp.json()) - and data.get('choices') - and (content := ','.join([choice['message']['content'] for choice in data.get('choices')])) - ): - result = content - process_time = timedelta(seconds=(time.time() - start_time)) - self.handle_invoice( - input_message.content_object.model, - version=version, - input_tokens=data['usage']['prompt_tokens'], - output_tokens=data['usage']['completion_tokens'], - ) - msgs = self.save_results(result, process_time) - return msgs - raise Exception('No answer from Deepseek, please retry later') + result = openrouter_run(version, messages, callback_data, self.title) + 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], + ) + msgs = self.save_results(result[0], process_time) + return msgs - def get_chat_history(self, message_limit: int = 10, max_token_limit: int = 1500): - history = [] + def get_chat_history(self, message_limit: int = 10, max_character_limit: int = 1500): if isinstance(self.store, Chat): air_messages = list( reversed( Message.objects.filter( - chats_chats_messages=self.store, - is_deleted=False, - is_sent=True + chats_chats_messages=self.store, is_deleted=False, is_sent=True ).order_by('-created_at')[:message_limit] ) ) @@ -106,12 +92,15 @@ class Deepseek(SimpleService): ).order_by('-created_at')[:message_limit] ) ) + memory = [] for msg in air_messages: - buffer = msg.content or '' - history.append(buffer) - total_length = sum(len(msg) for msg in history) - while total_length > max_token_limit and history: - removed_message = history.pop(0) - total_length -= len(removed_message) - message_history = '; '.join(history) - return message_history + content = msg.content or '' + if msg.from_model: + memory.append({'role': 'assistant', 'content': content}) + else: + memory.append({'role': 'user', 'content': content}) + character_length = sum(len(content['content']) for content in memory) + while character_length > max_character_limit: + character_length -= len(memory.pop(0)) + return memory +