import asyncio from json import tool from utils.scripts import import_library from utils.config import cohere_key cohere = import_library("cohere") import cohere co = cohere.Client(cohere_key) from utils.misc import modules_help, prefix from utils.scripts import format_exc from utils.db import db from utils.rentry import paste as rentry_paste from pyrogram import Client, filters, enums from pyrogram.types import Message from pyrogram.errors import MessageTooLong @Client.on_message(filters.command("cohere", prefix) & filters.me) async def cohere(c: Client, message: Message): try: user_id = message.from_user.id chat_history = db.get_chat_history(user_id) if len(message.command) > 1: prompt = message.text.split(maxsplit=1)[1] elif message.reply_to_message: prompt = message.reply_to_message.text else: await message.edit_text( f"Usage: {prefix}cohere [prompt/reply to message]" ) return db.add_chat_history(user_id, {"role": "USER", "message": prompt}) await message.edit_text("Umm, lemme think...") response = co.chat_stream( chat_history=chat_history, model="command-r-plus", message=prompt, temperature=0.8, tools=[{"name": "internet_search"}], connectors=[], prompt_truncation="OFF", ) output = "" tool_message = "" data = [] for event in response: if event.event_type == "tool-calls-chunk": if event.tool_call_delta and event.tool_call_delta.text is None: tool_message += "" else: tool_message += event.text if event.event_type == "search-results": data.append(event.documents) if event.event_type == "text-generation": output += event.text if output == "": output = "I can't seem to find an answer to that" db.add_chat_history(user_id, {"role": "CHATBOT", "message": output}) await message.edit_text(f"{tool_message}") await asyncio.sleep(5) try: data = data[0] references = "" reference_dict = {} for item in data: title = item["title"] url = item["url"] if title not in reference_dict: reference_dict[title] = url i = 1 for title, url in reference_dict.items(): references += f"**{i}.** [{title}]({url})\n" i += 1 await message.edit_text( f"**Question:**`{prompt}`\n**Answer:** {output}\n\n**References:**\n{references}", parse_mode=enums.ParseMode.MARKDOWN, disable_web_page_preview=True, ) except IndexError: references = "" await message.edit_text( f"**Question:**`{prompt}`\n**Answer:** {output}\n", parse_mode=enums.ParseMode.MARKDOWN, disable_web_page_preview=True, ) except MessageTooLong: await message.edit_text( "Output is too long... Pasting to rentry..." ) try: output = output + "\n\n" + references if references else output rentry_url, edit_code = await rentry_paste( text=output, return_edit=True ) except RuntimeError: await message.edit_text( "Error: Failed to paste to rentry" ) return await c.send_message( "me", f"Here's your edit code for Url: {rentry_url}\nEdit code: {edit_code}", disable_web_page_preview=True, ) await message.edit_text( f"Output: {rentry_url}\nNote: Edit Code has been sent to your saved messages", disable_web_page_preview=True, ) except Exception as e: await message.edit_text(f"An error occurred: {format_exc(e)}") modules_help["cohere"] = { "cohere": "Chat with cohere ai" + "\nSupports Chat History\n" + "Supports real time internet search" }