@@ -23,6 +23,7 @@ from langchain_core.messages import ( AIMessage, BaseMessage, HumanMessage, + SystemMessage, ) from langchain_core.prompts.prompt import PromptTemplate from langchain_core.runnables import RunnableWithMessageHistory @@ -161,9 +162,11 @@ class Chatgpt(SimpleService): if model_name not in self.TOKENS_COST.keys(): raise Exception(_('No matching version found')) chat_history = self.get_chat_history() + if model_name in ('o1-preview', 'o1-mini'): + chat_history.messages.pop(0) conversation = RunnableWithMessageHistory( runnable=self.llm, - get_session_history=lambda _: self.get_chat_history(), + get_session_history=lambda _: chat_history, ) llm_input = HumanMessage(content=input_content) if file and not image: @@ -175,10 +178,12 @@ class Chatgpt(SimpleService): output_tokens = 0 self.assert_enough_balance(input_tokens, image_size, model=self.llm.model_name) if model_name in ('o3-mini', 'gpt-4.5-preview'): + system = chat_history.messages.pop(0) messages = [ {'role': 'user' if isinstance(msg, HumanMessage) else 'assistant', 'content': msg.content} for msg in chat_history.messages ] + messages.insert(0, {'role': 'system', 'content': system.content}) if image: messages[-1]['content'] = [ {'type': 'text', 'text': input_message.content}, @@ -195,10 +200,14 @@ class Chatgpt(SimpleService): 'Средний контекст': 'medium', 'Большой контекст': 'high' } + if model_name not in ('o1-preview', 'o1-mini'): + system = chat_history.messages.pop(0) messages = [ {'role': 'user' if isinstance(msg, HumanMessage) else 'assistant', 'content': msg.content} for msg in chat_history.messages ] + if model_name not in ('o1-preview', 'o1-mini'): + messages.insert(0, {'role': 'system', 'content': system.content}) search_context_size = search_context_sizes.get(info.get('web_search', 'Средний контекст')) info['web_search'] = search_context_size json_data = { @@ -309,6 +318,13 @@ class Chatgpt(SimpleService): ) ) memory = InMemoryChatMessageHistory() + memory.add_message(SystemMessage( + content=( + 'Отныне все ответы должны быть представлены как единая строка (str). Не использовать никаких ' + 'структурированных форматов, таких как JSON, словари (dict) или списки (list). ' + 'Любая информация должна быть преобразована в простой строковый текст (str).' + ) + )) for msg in air_messages: content = msg.content or '' if msg.from_model: @@ -320,7 +336,7 @@ class Chatgpt(SimpleService): tokens = self.llm.get_num_tokens_from_messages(messages) while tokens > token_limit: - messages.pop(0) + messages.pop(1) tokens = self.llm.get_num_tokens_from_messages(messages) return memory @@ -46,6 +46,18 @@ class Qwen(SimpleService): version = f'qwen/{input_message.info.pop("version", "qwq-32b")}' callback_data = {'provider': {'order': ['DeepInfra']}, **input_message.info} messages = self.get_chat_history() + messages.insert( + 0, + { + 'role': 'system', + 'content': ( + 'Отвечай строго на том языке, на котором к тебе обратились или прямо указали, на каком языке отвечать. ' + 'Если язык невозможно однозначно определить или сообщение не несёт явного смысла на этом языке — используй русский язык. ' + 'Если сообщение не несёт очевидного смысла вообще — ответь, что не знаешь, как помочь. ' + 'Не уходи в длительные рассуждения и отвечай максимально чётко и по делу.' + ) + } + ) messages.append({'role': 'user', 'content': input_message.content}) result = openrouter_run(version, messages, callback_data, 'Qwen') process_time = timedelta(seconds=(time.time() - start_time))