decision-helper-bot / new_app.py
DeMaking's picture
Rename app.py to new_app.py
238aa37 verified
raw
history blame
4.56 kB
import logging
import os
from fastapi import FastAPI, Request
from contextlib import asynccontextmanager
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackContext
import httpx
import asyncio
from transformers import pipeline
from langdetect import detect
from huggingface_hub import login
import socket
# Global variables
TOKEN = os.getenv("TELEGRAM_BOT_TOKEN") # Telegram Token
HF_HUB_TOKEN = os.getenv("HUGGINGFACEHUB_API_TOKEN")
# Verify Hugging Face token
if not HF_HUB_TOKEN:
raise ValueError("Missing Hugging Face API token. Please set HUGGINGFACEHUB_API_TOKEN in environment variables.")
login(token=HF_HUB_TOKEN)
# Verify Telegram token
if not TOKEN:
raise ValueError("Missing Telegram token. Please set TELEGRAM_BOT_TOKEN in environment variables.")
try:
response = httpx.get(f"https://api.telegram.org/bot{TOKEN}/getMe")
print(f"Using TELEGRAM_TOKEN: {TOKEN[:5]}***") # Part of the token
print(response.json())
except httpx.RequestError as e:
print(f"aaRequest failed: {e}")
# Load Hebrew and English text generation models
hebrew_generator = pipeline("text-generation", model="Norod78/hebrew-gpt_neo-small")
english_generator = pipeline("text-generation", model="distilgpt2")
# Function to detect language
def detect_language(user_input):
try:
lang = detect(user_input)
return "hebrew" if lang == "he" else "english" if lang == "en" else "unsupported"
except:
return "unsupported"
# Function to generate a response
def generate_response(text):
language = detect_language(text)
if language == "hebrew":
return hebrew_generator(text, max_length=100)[0]["generated_text"]
elif language == "english":
return english_generator(text, max_length=100)[0]["generated_text"]
return "Sorry, I only support Hebrew and English."
# Create Telegram Bot
telegram_app = Application.builder().token(TOKEN).build()
# Initialize Telegram
async def init_telegram():
await telegram_app.initialize()
await telegram_app.start()
# Configure logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)
# Command and Message Handlers
async def start(update: Update, context: CallbackContext):
await update.message.reply_text("Hello! Tell me your decision-making issue in Hebrew or English, and I'll try to help you.")
async def handle_message(update: Update, context: CallbackContext):
user_text = update.message.text
response = generate_response(user_text)
await update.message.reply_text(response)
telegram_app.add_handler(CommandHandler("start", start))
telegram_app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
# FastAPI lifespan event
@asynccontextmanager
async def lifespan(app: FastAPI):
print("Starting application...")
# Check internet connection
try:
async with httpx.AsyncClient() as client:
response = await client.get("https://api.telegram.org")
print(f"Network test successful! Status Code: {response.status_code}")
except Exception as e:
print(f"Network test failed: {e}")
# Start Telegram bot
asyncio.create_task(init_telegram()) # Run in background
yield # Wait until app closes
print("Shutting down application...")
# Create FastAPI app
app = FastAPI(lifespan=lifespan)
@app.get("/")
async def root():
return {"message": "Decision Helper Bot is running!"}
@app.post("/")
async def receive_update(request: Request):
update = Update.de_json(await request.json(), telegram_app.bot)
await telegram_app.process_update(update)
return {"status": "ok"}
# async def check_internet():
# try:
# async with httpx.AsyncClient() as client:
# response = await client.get("https://api.telegram.org")
# print(f"Network test successful! Status Code: {response.status_code}")
# except Exception as e:
# print(f"Network test failed: {e}")
# asyncio.run(check_internet())
# Network test
def test_network():
try:
socket.gethostbyname("api.telegram.org")
print("Network test passed!")
except socket.gaierror:
print("Network test failed: No address associated with hostname")
test_network()
# Run the server
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8443)
# uvicorn.run(app, host="0.0.0.0", port=7860)