Я разрабатываю бота для 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
Динамическое редактирование сообщения бота Telegram при использовании потока = True в функции model.generate_content() g ⇐ Python
Программы на Python
1732984678
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79240046/edit-a-telegram-bot-message-dynamically-when-using-stream-true-in-google-generat[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия