Compare commits
2 commits
7fc6373fca
...
3db3f13cda
| Author | SHA1 | Date | |
|---|---|---|---|
| 3db3f13cda | |||
| 44d6b3528b |
3 changed files with 30 additions and 16 deletions
14
ai_agent.py
14
ai_agent.py
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue