Динамическое редактирование сообщения бота Telegram при использовании потока = True в функции model.generate_content() gPython

Программы на Python
Ответить
Anonymous
 Динамическое редактирование сообщения бота Telegram при использовании потока = True в функции model.generate_content() g

Сообщение Anonymous »

Я разрабатываю бота для Telegram с использованием aiogram, который принимает сообщение пользователя в качестве приглашения и генерирует ответ с помощью google-generativeai GenerativeModel. Он отлично работает в обычном режиме, когда я жду полного ответа, но я хочу получать фрагменты ответа с помощью параметраstream=True и добавлять новые фрагменты в сообщение телеграммы с помощью message.edit_text() функция. Проблема в том, что я столкнулся с ошибкой:
aiogram.exceptions.TelegramBadRequest: Telegram server says - Bad Request: can't parse entities: Can't find end of the entity starting at byte offset 73
Вот мои функции:
from aiogram import Bot, Dispatcher, Router, types
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from google.api_core.exceptions import BadRequest as GoogleBadRequest

from app.database import engine
from app.models import Language, TelegramUser
from app.services.ai import generate_response
from app.services.users import get_or_create_telegram_user, get_translated_message as _, refresh_last_interaction_date

bot = Bot(token=TOKEN,
default=DefaultBotProperties())

dp = Dispatcher()

telegram_router = Router()

dp.include_router(telegram_router)

...

@dp.message()
async def handle_prompt(message: types.Message):
async with AsyncSession(engine) as db:
user, __ = await get_or_create_telegram_user(message, db)
prompt = message.text

temp_message_text = await _("timer_1", user.language_id, db)
temp_message = await message.answer(temp_message_text)

# Accumulate the complete response
accumulated_text = ""

try:
async for chunk in generate_response(prompt):
accumulated_text += chunk

# Send the complete response with correct formatting
await temp_message.edit_text(
accumulated_text,
disable_web_page_preview=True,
parse_mode=ParseMode.MARKDOWN
)

except Exception as e:
print(f"Error in handle_prompt: {e}")
await temp_message.edit_text("An error occurred during processing.")

finally:
await refresh_last_interaction_date(user.chat_id, db)

# ai.py

from typing import AsyncGenerator

import google.generativeai as genai

from app.constants import GEMINI_API_KEY
from app.utils.helpers import sync_to_async_iterable

# Set up the Gemini API configuration
genai.configure(api_key=GEMINI_API_KEY)

# Initialize the Gemini model
model = genai.GenerativeModel(model_name="gemini-1.5-flash")

async def generate_response(prompt: str, **kwargs) -> AsyncGenerator[str, None]:
try:
response = sync_to_async_iterable(model.generate_content(prompt, stream=True, **kwargs))
async for content in response:
yield content.text
except Exception as e:
print(f"Error in generate_response: {e}")
yield "An error occurred during processing." # Yield an error message

Проблема в том, что когда я получаю фрагменты ответа, иногда в фрагменте присутствует открывающий символ уценки, а закрывающий символ — нет. В этом случае возникает ошибка aiogram.Exceptions.TelegramBadRequest: сервер Telegram сообщает: «Неверный запрос: невозможно проанализировать объекты: невозможно найти конец объекта, начиная со смещения байта ..». Я пробовал и ParseMode.MARKDOWN, и ParseMode.MARKDOWN_V2, но проблема та же. Я пытался удалить параметр parse_mode, если возникло это исключение, но, похоже, это не помогло.
Я обнаружил, чтоgenerate_contents() возвращает текст, отформатированный с помощью markdown2< /code> и что Telegram требует строгого форматирования.
Я не очень знаком с форматированием уценки и асинхронным программированием, поэтому мне нужна помощь с этой проблемой.
Версия Python: 3.10.8

Используемые пакеты:
aiogram==3.15.0
google-generativeai==0.8.3


Подробнее здесь: https://stackoverflow.com/questions/792 ... le-generat
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»