diff --git a/handlers/__init__.py b/handlers/__init__.py index 237d6e6..383e79d 100644 --- a/handlers/__init__.py +++ b/handlers/__init__.py @@ -21,32 +21,43 @@ T = TypeVar("T", bound=Callable) BOT_MESSAGE_LENGTH = 4000 -def bot_reply_markdown(message: Message, hint: str, text: str, bot: TeleBot) -> None: +def bot_reply_markdown(reply_id: Message, who: str, text: str, bot: TeleBot) -> None: """ reply the Markdown by take care of the message length. it will fallback to plain text in case of any failure """ try: if len(text.encode("utf-8")) <= BOT_MESSAGE_LENGTH: - bot.reply_to( - message, - f"**{hint}**:\n{telegramify_markdown.convert(text)}", - parse_mode="MarkdownV2", + bot.edit_message_text( + f"**{who}**:\n{telegramify_markdown.convert(text)}", + chat_id=reply_id.chat.id, + message_id=reply_id.message_id, + parse_mode="MarkdownV2" ) return # Need a split of message msgs = smart_split(text, BOT_MESSAGE_LENGTH) - for i in range(len(msgs)): + bot.edit_message_text( + f"**{who}** \[1/{len(msgs)}\]:\n{telegramify_markdown.convert(msgs[0])}", + chat_id=reply_id.chat.id, + message_id=reply_id.message_id, + parse_mode="MarkdownV2" + ) + for i in range(1, len(msgs)): bot.reply_to( - message, + reply_id.reply_to_message, f"**{hint}** \[{i+1}/{len(msgs)}\]:\n{telegramify_markdown.convert(msgs[i])}", parse_mode="MarkdownV2", ) except Exception as e: print(traceback.format_exc()) # print(f"wrong markdown format: {text}") - bot.reply_to(message, f"{hint}:\n{text}") + bot.edit_message_text( + f"**{who}**:\n{text}", + chat_id=reply_id.chat.id, + message_id=reply_id.message_id, + ) def extract_prompt(message: str, bot_name: str) -> str: diff --git a/handlers/claude.py b/handlers/claude.py index 315caa6..89b283d 100644 --- a/handlers/claude.py +++ b/handlers/claude.py @@ -37,7 +37,9 @@ def claude_handler(message: Message, bot: TeleBot) -> None: ) else: player_message = claude_player_dict[str(message.from_user.id)] - if m.strip() == "clear": + + q = m.strip() + if q == "clear" or len(q) == 0: bot.reply_to( message, "just clear you claude messages history", @@ -45,6 +47,12 @@ def claude_handler(message: Message, bot: TeleBot) -> None: player_message.clear() return + # show something, make it more responsible + reply_id = bot.reply_to(message, + "**Claude** is __thinking__...", + parse_mode="MarkdownV2" + ) + player_message.append({"role": "user", "content": m}) # keep the last 5, every has two ask and answer. if len(player_message) > 10: @@ -57,7 +65,7 @@ def claude_handler(message: Message, bot: TeleBot) -> None: # tricky player_message.pop() r = client.messages.create( - max_tokens=1024, messages=player_message, model=ANTHROPIC_MODEL + max_tokens=4096, messages=player_message, model=ANTHROPIC_MODEL ) if not r.content: claude_reply_text = "Claude did not answer." @@ -81,7 +89,7 @@ def claude_handler(message: Message, bot: TeleBot) -> None: player_message.clear() return - bot_reply_markdown(message, "Claude answer", claude_reply_text, bot) + bot_reply_markdown(reply_id, "Claude", claude_reply_text, bot) def claude_pro_handler(message: Message, bot: TeleBot) -> None: @@ -94,7 +102,8 @@ def claude_pro_handler(message: Message, bot: TeleBot) -> None: ) else: player_message = claude_pro_player_dict[str(message.from_user.id)] - if m.strip() == "clear": + q = m.strip() + if q == "clear" or len(q) == 0: bot.reply_to( message, "just clear you claude opus messages history", diff --git a/handlers/gemini.py b/handlers/gemini.py index 84dc99c..9c2f03d 100644 --- a/handlers/gemini.py +++ b/handlers/gemini.py @@ -49,13 +49,21 @@ def gemini_handler(message: Message, bot: TeleBot) -> None: gemini_player_dict[str(message.from_user.id)] = player else: player = gemini_player_dict[str(message.from_user.id)] - if m.strip() == "clear": + q = m.strip() + if q == "clear" or len(q) == 0: bot.reply_to( message, "just clear you gemini messages history", ) player.history.clear() return + + # show something, make it more responsible + reply_id = bot.reply_to(message, + "**Gemini** is __thinking__...", + parse_mode="MarkdownV2" + ) + # keep the last 5, every has two ask and answer. if len(player.history) > 10: player.history = player.history[2:] @@ -64,7 +72,7 @@ def gemini_handler(message: Message, bot: TeleBot) -> None: player.send_message(m) gemini_reply_text = player.last.text.strip() # Gemini is often using ':' in **Title** which not work in Telegram Markdown - gemini_reply_text = gemini_reply_text.replace(": **", "**\: ") + gemini_reply_text = gemini_reply_text.replace(":**", "\:**") except StopCandidateException as e: match = re.search(r'content\s*{\s*parts\s*{\s*text:\s*"([^"]+)"', str(e)) if match: @@ -79,7 +87,7 @@ def gemini_handler(message: Message, bot: TeleBot) -> None: return # By default markdown - bot_reply_markdown(message, "Gemini answer", gemini_reply_text, bot) + bot_reply_markdown(reply_id, "Gemini", gemini_reply_text, bot) def gemini_photo_handler(message: Message, bot: TeleBot) -> None: diff --git a/handlers/yi.py b/handlers/yi.py index 6de7164..ccd194c 100644 --- a/handlers/yi.py +++ b/handlers/yi.py @@ -35,7 +35,8 @@ def yi_handler(message: Message, bot: TeleBot) -> None: ) else: player_message = yi_player_dict[str(message.from_user.id)] - if m.strip() == "clear": + q = m.strip() + if q == "clear" or len(q) == 0: bot.reply_to( message, "just clear your yi messages history", @@ -43,6 +44,12 @@ def yi_handler(message: Message, bot: TeleBot) -> None: player_message.clear() return + # show something, make it more responsible + reply_id = bot.reply_to(message, + "**Yi** is __thinking__...", + parse_mode="MarkdownV2" + ) + player_message.append({"role": "user", "content": m}) # keep the last 5, every has two ask and answer. if len(player_message) > 10: @@ -81,7 +88,7 @@ def yi_handler(message: Message, bot: TeleBot) -> None: return # reply back as Markdown and fallback to plain text if failed. - bot_reply_markdown(message, "yi answer", yi_reply_text, bot) + bot_reply_markdown(replay_id, "Yi", yi_reply_text, bot) def _image_to_data_uri(file_path):