mirror of
				https://github.com/cdryzun/tg_bot_collections.git
				synced 2025-11-04 08:46:44 +08:00 
			
		
		
		
	@ -55,6 +55,12 @@ Note, if you are using third party service, you need to `export OPENAI_API_BASE=
 | 
				
			|||||||
2. export GROQ_API_KEY=${the_key}
 | 
					2. export GROQ_API_KEY=${the_key}
 | 
				
			||||||
3. use `llama_pro: ${message}` to ask
 | 
					3. use `llama_pro: ${message}` to ask
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Bot -> qwen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. visit https://api.together.xyz/settings/api-keys get the key
 | 
				
			||||||
 | 
					2. export TOGETHER_API_KEY=${the_key}
 | 
				
			||||||
 | 
					3. use `qwen_pro: ${message}` to ask
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## HOW TO Install and Run
 | 
					## HOW TO Install and Run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,6 @@
 | 
				
			|||||||
from os import environ
 | 
					from os import environ
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from openai import OpenAI
 | 
					 | 
				
			||||||
from telebot import TeleBot
 | 
					from telebot import TeleBot
 | 
				
			||||||
from telebot.types import Message
 | 
					from telebot.types import Message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										169
									
								
								handlers/qwen.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								handlers/qwen.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,169 @@
 | 
				
			|||||||
 | 
					# qwen use https://api.together.xyz
 | 
				
			||||||
 | 
					from os import environ
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from telebot import TeleBot
 | 
				
			||||||
 | 
					from telebot.types import Message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from . import *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from together import Together
 | 
				
			||||||
 | 
					from telegramify_markdown import convert
 | 
				
			||||||
 | 
					from telegramify_markdown.customize import markdown_symbol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					markdown_symbol.head_level_1 = "📌"  # If you want, Customizing the head level 1 symbol
 | 
				
			||||||
 | 
					markdown_symbol.link = "🔗"  # If you want, Customizing the link symbol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QWEN_API_KEY = environ.get("TOGETHER_API_KEY")
 | 
				
			||||||
 | 
					QWEN_MODEL = "Qwen/Qwen1.5-110B-Chat"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if QWEN_API_KEY:
 | 
				
			||||||
 | 
					    client = Together(api_key=QWEN_API_KEY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Global history cache
 | 
				
			||||||
 | 
					qwen_player_dict = {}
 | 
				
			||||||
 | 
					qwen_pro_player_dict = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def qwen_handler(message: Message, bot: TeleBot) -> None:
 | 
				
			||||||
 | 
					    """qwen : /qwen <question>"""
 | 
				
			||||||
 | 
					    m = message.text.strip()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    player_message = []
 | 
				
			||||||
 | 
					    # restart will lose all TODO
 | 
				
			||||||
 | 
					    if str(message.from_user.id) not in qwen_player_dict:
 | 
				
			||||||
 | 
					        qwen_player_dict[str(message.from_user.id)] = (
 | 
				
			||||||
 | 
					            player_message  # for the imuutable list
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        player_message = qwen_player_dict[str(message.from_user.id)]
 | 
				
			||||||
 | 
					    if m.strip() == "clear":
 | 
				
			||||||
 | 
					        bot.reply_to(
 | 
				
			||||||
 | 
					            message,
 | 
				
			||||||
 | 
					            "just clear your qwen messages history",
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        player_message.clear()
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    if m[:4].lower() == "new ":
 | 
				
			||||||
 | 
					        m = m[4:].strip()
 | 
				
			||||||
 | 
					        player_message.clear()
 | 
				
			||||||
 | 
					    m = enrich_text_with_urls(m)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    who = "qwen"
 | 
				
			||||||
 | 
					    # show something, make it more responsible
 | 
				
			||||||
 | 
					    reply_id = bot_reply_first(message, who, bot)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    player_message.append({"role": "user", "content": m})
 | 
				
			||||||
 | 
					    # keep the last 5, every has two ask and answer.
 | 
				
			||||||
 | 
					    if len(player_message) > 10:
 | 
				
			||||||
 | 
					        player_message = player_message[2:]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qwen_reply_text = ""
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        r = client.chat.completions.create(
 | 
				
			||||||
 | 
					            messages=player_message, max_tokens=8192, model=QWEN_MODEL
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        content = r.choices[0].message.content.encode("utf8").decode()
 | 
				
			||||||
 | 
					        if not content:
 | 
				
			||||||
 | 
					            qwen_reply_text = f"{who} did not answer."
 | 
				
			||||||
 | 
					            player_message.pop()
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            qwen_reply_text = content
 | 
				
			||||||
 | 
					            player_message.append(
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "role": "assistant",
 | 
				
			||||||
 | 
					                    "content": qwen_reply_text,
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    except Exception as e:
 | 
				
			||||||
 | 
					        print(e)
 | 
				
			||||||
 | 
					        bot_reply_markdown(reply_id, who, "answer wrong", bot)
 | 
				
			||||||
 | 
					        # pop my user
 | 
				
			||||||
 | 
					        player_message.pop()
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # reply back as Markdown and fallback to plain text if failed.
 | 
				
			||||||
 | 
					    bot_reply_markdown(reply_id, who, qwen_reply_text, bot)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def qwen_pro_handler(message: Message, bot: TeleBot) -> None:
 | 
				
			||||||
 | 
					    """qwen_pro : /qwen_pro <question>"""
 | 
				
			||||||
 | 
					    m = message.text.strip()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    player_message = []
 | 
				
			||||||
 | 
					    # restart will lose all TODO
 | 
				
			||||||
 | 
					    if str(message.from_user.id) not in qwen_player_dict:
 | 
				
			||||||
 | 
					        qwen_player_dict[str(message.from_user.id)] = (
 | 
				
			||||||
 | 
					            player_message  # for the imuutable list
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        player_message = qwen_player_dict[str(message.from_user.id)]
 | 
				
			||||||
 | 
					    if m.strip() == "clear":
 | 
				
			||||||
 | 
					        bot.reply_to(
 | 
				
			||||||
 | 
					            message,
 | 
				
			||||||
 | 
					            "just clear your qwen messages history",
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        player_message.clear()
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    if m[:4].lower() == "new ":
 | 
				
			||||||
 | 
					        m = m[4:].strip()
 | 
				
			||||||
 | 
					        player_message.clear()
 | 
				
			||||||
 | 
					    m = enrich_text_with_urls(m)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    who = "qwen Pro"
 | 
				
			||||||
 | 
					    reply_id = bot_reply_first(message, who, bot)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    player_message.append({"role": "user", "content": m})
 | 
				
			||||||
 | 
					    # keep the last 5, every has two ask and answer.
 | 
				
			||||||
 | 
					    if len(player_message) > 10:
 | 
				
			||||||
 | 
					        player_message = player_message[2:]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        r = client.chat.completions.create(
 | 
				
			||||||
 | 
					            messages=player_message,
 | 
				
			||||||
 | 
					            max_tokens=8192,
 | 
				
			||||||
 | 
					            model=QWEN_MODEL,
 | 
				
			||||||
 | 
					            stream=True,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        s = ""
 | 
				
			||||||
 | 
					        start = time.time()
 | 
				
			||||||
 | 
					        for chunk in r:
 | 
				
			||||||
 | 
					            if chunk.choices[0].delta.content is None:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            s += chunk.choices[0].delta.content
 | 
				
			||||||
 | 
					            if time.time() - start > 1.7:
 | 
				
			||||||
 | 
					                start = time.time()
 | 
				
			||||||
 | 
					                bot_reply_markdown(reply_id, who, s, bot, split_text=False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if not bot_reply_markdown(reply_id, who, s, bot):
 | 
				
			||||||
 | 
					            # maybe not complete
 | 
				
			||||||
 | 
					            # maybe the same message
 | 
				
			||||||
 | 
					            player_message.clear()
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        player_message.append(
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                "role": "assistant",
 | 
				
			||||||
 | 
					                "content": convert(s),
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    except Exception as e:
 | 
				
			||||||
 | 
					        print(e)
 | 
				
			||||||
 | 
					        bot_reply_markdown(reply_id, who, "answer wrong", bot)
 | 
				
			||||||
 | 
					        player_message.clear()
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if QWEN_API_KEY:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def register(bot: TeleBot) -> None:
 | 
				
			||||||
 | 
					        bot.register_message_handler(qwen_handler, commands=["qwen"], pass_bot=True)
 | 
				
			||||||
 | 
					        bot.register_message_handler(qwen_handler, regexp="^qwen:", pass_bot=True)
 | 
				
			||||||
 | 
					        bot.register_message_handler(
 | 
				
			||||||
 | 
					            qwen_pro_handler, commands=["qwen_pro"], pass_bot=True
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        bot.register_message_handler(
 | 
				
			||||||
 | 
					            qwen_pro_handler, regexp="^qwen_pro:", pass_bot=True
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
							
								
								
									
										20
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					[project]
 | 
				
			||||||
 | 
					# PEP 621 project metadata
 | 
				
			||||||
 | 
					# See https://www.python.org/dev/peps/pep-0621/
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					    "pyTelegramBotAPI>=4.16",
 | 
				
			||||||
 | 
					    "cairosvg",
 | 
				
			||||||
 | 
					    "github-poster",
 | 
				
			||||||
 | 
					    "prettymapp",
 | 
				
			||||||
 | 
					    "google-generativeai>=0.4",
 | 
				
			||||||
 | 
					    "anthropic",
 | 
				
			||||||
 | 
					    "telegramify-markdown",
 | 
				
			||||||
 | 
					    "openai",
 | 
				
			||||||
 | 
					    "requests",
 | 
				
			||||||
 | 
					    "urlextract",
 | 
				
			||||||
 | 
					    "requests",
 | 
				
			||||||
 | 
					    "groq",
 | 
				
			||||||
 | 
					    "together>=1.1.5",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					requires-python = ">=3.10"
 | 
				
			||||||
							
								
								
									
										120
									
								
								requirements.txt
									
									
									
									
									
								
							
							
						
						
									
										120
									
								
								requirements.txt
									
									
									
									
									
								
							@ -1,12 +1,108 @@
 | 
				
			|||||||
pyTelegramBotAPI>=4.16
 | 
					# This file is @generated by PDM.
 | 
				
			||||||
cairosvg
 | 
					# Please do not edit it manually.
 | 
				
			||||||
github_poster
 | 
					
 | 
				
			||||||
prettymapp
 | 
					aiohttp==3.9.5
 | 
				
			||||||
google-generativeai>=0.4
 | 
					aiosignal==1.3.1
 | 
				
			||||||
anthropic
 | 
					annotated-types==0.6.0
 | 
				
			||||||
telegramify-markdown
 | 
					anthropic==0.25.8
 | 
				
			||||||
openai
 | 
					anyio==4.3.0
 | 
				
			||||||
requests
 | 
					async-timeout==4.0.3; python_version < "3.11"
 | 
				
			||||||
urlextract
 | 
					attrs==23.2.0
 | 
				
			||||||
requests
 | 
					cachetools==5.3.3
 | 
				
			||||||
groq
 | 
					cairocffi==1.7.0
 | 
				
			||||||
 | 
					cairosvg==2.7.1
 | 
				
			||||||
 | 
					certifi==2024.2.2
 | 
				
			||||||
 | 
					cffi==1.16.0
 | 
				
			||||||
 | 
					charset-normalizer==3.3.2
 | 
				
			||||||
 | 
					click==8.1.7
 | 
				
			||||||
 | 
					click-plugins==1.1.1
 | 
				
			||||||
 | 
					cligj==0.7.2
 | 
				
			||||||
 | 
					colorama==0.4.6; platform_system == "Windows"
 | 
				
			||||||
 | 
					colour==0.1.5
 | 
				
			||||||
 | 
					contourpy==1.2.1
 | 
				
			||||||
 | 
					cssselect2==0.7.0
 | 
				
			||||||
 | 
					cycler==0.12.1
 | 
				
			||||||
 | 
					defusedxml==0.7.1
 | 
				
			||||||
 | 
					distro==1.9.0
 | 
				
			||||||
 | 
					emoji==2.11.1
 | 
				
			||||||
 | 
					eval-type-backport==0.2.0
 | 
				
			||||||
 | 
					exceptiongroup==1.2.1; python_version < "3.11"
 | 
				
			||||||
 | 
					filelock==3.14.0
 | 
				
			||||||
 | 
					fiona==1.9.6
 | 
				
			||||||
 | 
					fonttools==4.51.0
 | 
				
			||||||
 | 
					frozenlist==1.4.1
 | 
				
			||||||
 | 
					fsspec==2024.3.1
 | 
				
			||||||
 | 
					geopandas==0.14.4
 | 
				
			||||||
 | 
					github-poster==2.7.4
 | 
				
			||||||
 | 
					google-ai-generativelanguage==0.6.2
 | 
				
			||||||
 | 
					google-api-core==2.19.0
 | 
				
			||||||
 | 
					google-api-python-client==2.128.0
 | 
				
			||||||
 | 
					google-auth==2.29.0
 | 
				
			||||||
 | 
					google-auth-httplib2==0.2.0
 | 
				
			||||||
 | 
					google-generativeai==0.5.2
 | 
				
			||||||
 | 
					googleapis-common-protos==1.63.0
 | 
				
			||||||
 | 
					groq==0.5.0
 | 
				
			||||||
 | 
					grpcio==1.63.0
 | 
				
			||||||
 | 
					grpcio-status==1.62.2
 | 
				
			||||||
 | 
					h11==0.14.0
 | 
				
			||||||
 | 
					httpcore==1.0.5
 | 
				
			||||||
 | 
					httplib2==0.22.0
 | 
				
			||||||
 | 
					httpx==0.27.0
 | 
				
			||||||
 | 
					huggingface-hub==0.23.0
 | 
				
			||||||
 | 
					idna==3.7
 | 
				
			||||||
 | 
					kiwisolver==1.4.5
 | 
				
			||||||
 | 
					markdown-it-py==3.0.0
 | 
				
			||||||
 | 
					matplotlib==3.8.4
 | 
				
			||||||
 | 
					mdurl==0.1.2
 | 
				
			||||||
 | 
					mistletoe==1.3.0
 | 
				
			||||||
 | 
					multidict==6.0.5
 | 
				
			||||||
 | 
					networkx==3.3
 | 
				
			||||||
 | 
					numpy==1.26.4
 | 
				
			||||||
 | 
					openai==1.26.0
 | 
				
			||||||
 | 
					osmnx==1.9.2
 | 
				
			||||||
 | 
					packaging==24.0
 | 
				
			||||||
 | 
					pandas==2.2.2
 | 
				
			||||||
 | 
					pendulum==3.0.0
 | 
				
			||||||
 | 
					pillow==10.3.0
 | 
				
			||||||
 | 
					platformdirs==4.2.1
 | 
				
			||||||
 | 
					prettymapp==0.3.0
 | 
				
			||||||
 | 
					proto-plus==1.23.0
 | 
				
			||||||
 | 
					protobuf==4.25.3
 | 
				
			||||||
 | 
					pyarrow==16.0.0
 | 
				
			||||||
 | 
					pyasn1==0.6.0
 | 
				
			||||||
 | 
					pyasn1-modules==0.4.0
 | 
				
			||||||
 | 
					pycparser==2.22
 | 
				
			||||||
 | 
					pydantic==2.7.1
 | 
				
			||||||
 | 
					pydantic-core==2.18.2
 | 
				
			||||||
 | 
					pygments==2.18.0
 | 
				
			||||||
 | 
					pyogrio==0.7.2
 | 
				
			||||||
 | 
					pyparsing==3.1.2
 | 
				
			||||||
 | 
					pyproj==3.6.1
 | 
				
			||||||
 | 
					pytelegrambotapi==4.17.0
 | 
				
			||||||
 | 
					python-dateutil==2.9.0.post0
 | 
				
			||||||
 | 
					pytz==2024.1
 | 
				
			||||||
 | 
					pyyaml==6.0.1
 | 
				
			||||||
 | 
					requests==2.31.0
 | 
				
			||||||
 | 
					rich==13.7.1
 | 
				
			||||||
 | 
					rsa==4.9
 | 
				
			||||||
 | 
					shapely==2.0.4
 | 
				
			||||||
 | 
					shellingham==1.5.4
 | 
				
			||||||
 | 
					six==1.16.0
 | 
				
			||||||
 | 
					sniffio==1.3.1
 | 
				
			||||||
 | 
					svgwrite==1.4.3
 | 
				
			||||||
 | 
					tabulate==0.9.0
 | 
				
			||||||
 | 
					telegramify-markdown==0.1.2
 | 
				
			||||||
 | 
					time-machine==2.14.1; implementation_name != "pypy"
 | 
				
			||||||
 | 
					tinycss2==1.3.0
 | 
				
			||||||
 | 
					together==1.1.5
 | 
				
			||||||
 | 
					tokenizers==0.19.1
 | 
				
			||||||
 | 
					tqdm==4.66.4
 | 
				
			||||||
 | 
					typer==0.12.3
 | 
				
			||||||
 | 
					typing-extensions==4.11.0
 | 
				
			||||||
 | 
					tzdata==2024.1
 | 
				
			||||||
 | 
					uritemplate==4.1.1
 | 
				
			||||||
 | 
					uritools==4.0.2
 | 
				
			||||||
 | 
					urlextract==1.9.0
 | 
				
			||||||
 | 
					urllib3==2.2.1
 | 
				
			||||||
 | 
					webencodings==0.5.1
 | 
				
			||||||
 | 
					yarl==1.9.4
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user