vk_chat_bot/vk/handlers/default.py
Kirill Kirilenko 7fc6373fca Рефакторинг ИИ-агента.
Добавлена обработка ответов боту (вместо прямого упоминания).
2025-12-28 22:30:43 +03:00

71 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from typing import Optional
from vkbottle.bot import Message
from vkbottle.framework.labeler import BotLabeler
from vkbottle_types.codegen.objects import GroupsGroup
import utils
from ai_agent import AiAgent
import vk.vk_database as database
labeler = BotLabeler()
agent: Optional[AiAgent] = None
bot_user: Optional[GroupsGroup] = None
# Обычные сообщения (не команды и не действия)
@labeler.chat_message()
async def any_message_handler(message: Message):
chat_id = message.peer_id
chat = database.DB.create_chat_if_not_exists(chat_id)
if chat['active'] == 0:
return
# Игнорировать ботов
if message.from_id < 0:
return
# Не учитывать служебные сообщения
if message.action is not None:
return
user_id = message.from_id
database.DB.create_user_if_not_exists(chat_id, user_id)
database.DB.user_set_last_message(chat_id, user_id, utils.posix_time())
database.DB.user_increment_messages(chat_id, user_id)
global bot_user
if bot_user is None:
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)
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
else:
return
user = await message.ctx_api.users.get(user_ids=[message.from_id])
if len(user) == 1:
user_name = "{} {}".format(user[0].first_name, user[0].last_name)
else:
user_name = '@id' + str(message.from_id)
chat_prompt = chat['ai_prompt']
global agent
if agent is None:
# noinspection PyUnresolvedReferences
agent = AiAgent(message.ctx_api.config['openrouter_token'])
await message.ctx_api.messages.set_activity(peer_id=chat_id, type='typing')
await message.reply(await agent.get_reply(chat_id, chat_prompt, user_name, message_text))
def clear_ai_chat_context(chat_id: int):
global agent
if agent is not None:
agent.clear_chat_context(chat_id)