Compare commits

..

2 commits

Author SHA1 Message Date
3db3f13cda Из системного запроса удалено упоминание Telegram.
В случае ошибки API возвращается ее описание, а вызвавший ее запрос не добавляется в контекст.
2025-12-29 22:10:36 +03:00
44d6b3528b Поправлена проверка на упоминание бота. 2025-12-29 22:07:34 +03:00
3 changed files with 30 additions and 16 deletions

View file

@ -5,7 +5,7 @@ from openrouter import OpenRouter
SYSTEM_PROMPT = """ SYSTEM_PROMPT = """
Ты - помощник в групповом чате Telegram. Ты - помощник в групповом чате.
Отвечай на вопросы и поддерживай контекст беседы. Отвечай на вопросы и поддерживай контекст беседы.
Ты не можешь обсуждать политику и религию. Ты не можешь обсуждать политику и религию.
Сообщения пользователей будут приходить в следующем формате: '[Имя]: текст сообщения' Сообщения пользователей будут приходить в следующем формате: '[Имя]: текст сообщения'
@ -13,7 +13,6 @@ SYSTEM_PROMPT = """
""" """
@dataclass
class ChatContext: class ChatContext:
def __init__(self, max_messages: int): def __init__(self, max_messages: int):
self.max_messages: int = max_messages self.max_messages: int = max_messages
@ -28,6 +27,9 @@ class ChatContext:
def get_messages_for_api(self) -> List[Dict[str, str]]: def get_messages_for_api(self) -> List[Dict[str, str]]:
return self.messages return self.messages
def remove_last_message(self):
self.messages.pop()
class AiAgent: class AiAgent:
def __init__(self, api_token: str): def __init__(self, api_token: str):
@ -37,13 +39,12 @@ class AiAgent:
async def get_reply(self, chat_id: int, chat_prompt: str, user_name: str, message: str) -> str: async def get_reply(self, chat_id: int, chat_prompt: str, user_name: str, message: str) -> str:
context = self._get_chat_context(chat_id, chat_prompt) context = self._get_chat_context(chat_id, chat_prompt)
context.add_message(role="user", content=f"[{user_name}]: {message}") context.add_message(role="user", content=f"[{user_name}]: {message}")
messages_for_api = context.get_messages_for_api()
try: try:
# Get response from OpenRouter # Get response from OpenRouter
response = await self.client.chat.send_async( response = await self.client.chat.send_async(
model="meta-llama/llama-3.3-70b-instruct:free", model="meta-llama/llama-3.3-70b-instruct:free",
messages=messages_for_api, messages=context.get_messages_for_api(),
max_tokens=500, max_tokens=500,
temperature=0.7 temperature=0.7
) )
@ -57,8 +58,9 @@ class AiAgent:
return ai_response return ai_response
except Exception as e: except Exception as e:
print(f"Error processing message: {e}") context.remove_last_message()
return "Извините, при обработке запроса произошла ошибка." print(f"Ошибка выполнения запроса к ИИ: {e}")
return f"Извините, при обработке запроса произошла ошибка:\n{e}"
def clear_chat_context(self, chat_id: int): def clear_chat_context(self, chat_id: int):
self.chat_contexts.pop(chat_id, None) self.chat_contexts.pop(chat_id, None)

View file

@ -54,10 +54,14 @@ async def any_message_handler(message: Message):
if bot_user is None: if bot_user is None:
bot_user = await message.bot.get_me() bot_user = await message.bot.get_me()
if message.content_type == ContentType.TEXT and message.text.find('@' + bot_user.username) != -1: # Ответ на сообщение бота
message_text = message.text.replace('@' + bot_user.username, bot_user.first_name) if message.reply_to_message and message.reply_to_message.from_user.id == bot_user.id:
elif message.reply_to_message and message.reply_to_message.from_user.id == bot_user.id:
message_text = message.text message_text = message.text
else:
# Сообщение содержит @bot_username
bot_username_mention = '@' + bot_user.username
if message.content_type == ContentType.TEXT and message.text.find(bot_username_mention) != -1:
message_text = message.text.replace(bot_username_mention, bot_user.first_name)
else: else:
return return

View file

@ -1,3 +1,4 @@
import re
from typing import Optional from typing import Optional
from vkbottle.bot import Message from vkbottle.bot import Message
@ -39,12 +40,19 @@ async def any_message_handler(message: Message):
if bot_user is None: if bot_user is None:
bot_user = (await message.ctx_api.groups.get_by_id()).groups[0] bot_user = (await message.ctx_api.groups.get_by_id()).groups[0]
if message.text is not None and message.text.find('@' + bot_user.screen_name) != -1: # Ответ на сообщение бота
message_text = message.text.replace('@' + bot_user.screen_name, bot_user.name) if message.reply_message and message.reply_message.from_id == -bot_user.id:
elif message.text is not None and message.text.find('club' + str(bot_user.id)) != -1:
message_text = message.text.replace('club' + str(bot_user.id), bot_user.name)
elif message.reply_message and message.reply_message.from_id == -bot_user.id:
message_text = message.text message_text = message.text
else:
# Сообщение содержит @bot_username
bot_username_mention = '@' + bot_user.screen_name
if message.text is not None and message.text.find(bot_username_mention) != -1:
message_text = message.text.replace(bot_username_mention, bot_user.name)
else:
# Сообщение содержит [club<bot_id>|<some_name>]
pattern = r"\[club" + str(bot_user.id) + r"\|(.+)]"
if message.text is not None and re.search(pattern, message.text) is not None:
message_text = re.sub(pattern, r'\1', message.text)
else: else:
return return