Статус "печатает" поддерживается до завершения запроса к ИИ.

This commit is contained in:
Kirill Kirilenko 2026-01-01 01:57:26 +03:00
parent 324cbe16a6
commit 50c984cfd7
3 changed files with 41 additions and 9 deletions

View file

@ -1,3 +1,4 @@
from functools import partial
from typing import Optional from typing import Optional
from aiogram import Router, F, Bot from aiogram import Router, F, Bot
@ -92,8 +93,10 @@ async def any_message_handler(message: Message):
# noinspection PyUnresolvedReferences # noinspection PyUnresolvedReferences
agent = AiAgent(message.bot.config['openrouter_token']) agent = AiAgent(message.bot.config['openrouter_token'])
await message.bot.send_chat_action(chat_id, 'typing') await message.reply(
await message.reply(await agent.get_reply(chat_id, chat_prompt, ai_message, ai_fwd_messages)) await utils.run_with_progress(partial(agent.get_reply, chat_id, chat_prompt, ai_message, ai_fwd_messages),
partial(message.bot.send_chat_action, chat_id, 'typing'),
interval=4))
def clear_ai_chat_context(chat_id: int): def clear_ai_chat_context(chat_id: int):
@ -114,5 +117,6 @@ async def get_ai_reply(bot: Bot, chat_id, user: User, message: str, fwd_user: Us
# noinspection PyUnresolvedReferences # noinspection PyUnresolvedReferences
agent = AiAgent(bot.config['openrouter_token']) agent = AiAgent(bot.config['openrouter_token'])
await bot.send_chat_action(chat_id, 'typing') return await utils.run_with_progress(partial(agent.get_reply, chat_id, chat_prompt, ai_message, ai_fwd_messages),
return await agent.get_reply(chat_id, chat_prompt, ai_message, ai_fwd_messages) partial(bot.send_chat_action(chat_id, 'typing')),
interval=4)

View file

@ -1,5 +1,6 @@
import asyncio
from calendar import timegm from calendar import timegm
from typing import Optional from typing import Awaitable, Callable, Coroutine, Optional
from pymorphy3 import MorphAnalyzer from pymorphy3 import MorphAnalyzer
from time import gmtime from time import gmtime
@ -21,3 +22,26 @@ def full_name(first_name: str, last_name: Optional[str]) -> str:
if last_name is not None: if last_name is not None:
return f"{first_name} {last_name}" return f"{first_name} {last_name}"
return first_name return first_name
async def run_with_progress(main_func: Callable[[], Coroutine], progress_func: Callable[[], Awaitable], interval: int):
completion_event = asyncio.Event()
async def progress():
while not completion_event.is_set():
await progress_func()
wait_event_task = asyncio.create_task(completion_event.wait())
wait_timer_task = asyncio.create_task(asyncio.sleep(interval))
await asyncio.wait([wait_event_task, wait_timer_task],
return_when=asyncio.FIRST_COMPLETED)
if completion_event.is_set():
wait_timer_task.cancel()
progress_task = asyncio.create_task(progress())
main_task = asyncio.create_task(main_func())
result = await main_task
completion_event.set()
await progress_task
return result

View file

@ -1,4 +1,5 @@
import re import re
from functools import partial
from typing import Optional, Tuple, List from typing import Optional, Tuple, List
from vkbottle import API from vkbottle import API
@ -87,8 +88,10 @@ async def any_message_handler(message: Message):
# noinspection PyUnresolvedReferences # noinspection PyUnresolvedReferences
agent = AiAgent(message.ctx_api.config['openrouter_token']) 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 message.reply(await agent.get_reply(chat_id, chat_prompt, ai_message, ai_fwd_messages)) await utils.run_with_progress(partial(agent.get_reply, chat_id, chat_prompt, ai_message, ai_fwd_messages),
partial(message.ctx_api.messages.set_activity, peer_id=chat_id, type='typing'),
interval=4))
def clear_ai_chat_context(chat_id: int): def clear_ai_chat_context(chat_id: int):
@ -112,5 +115,6 @@ async def get_ai_reply(api: API, chat_id, message: Tuple[int, str], fwd_messages
# noinspection PyUnresolvedReferences # noinspection PyUnresolvedReferences
agent = AiAgent(api.config['openrouter_token']) agent = AiAgent(api.config['openrouter_token'])
await api.messages.set_activity(peer_id=chat_id, type='typing') return await utils.run_with_progress(partial(agent.get_reply, chat_id, chat_prompt, ai_message, ai_fwd_messages),
return await agent.get_reply(chat_id, chat_prompt, ai_message, ai_fwd_messages) partial(api.messages.set_activity, peer_id=chat_id, type='typing'),
interval=4)