AforativeBot / app.py
measmonysuon's picture
Update app.py
cc6aaf9 verified
raw
history blame
4.89 kB
from flask import Flask, request
import telebot
import os
import requests
import google.generativeai as genai
import tempfile
import logging
import re
from telebot.apihelper import ApiTelegramException
import time
# Replace with your actual API keys and bot token
GOOGLE_API_KEY = 'AIzaSyAYXUMnwmR4nUGDCs97FJJsafcQAPAAuzE'
BOT_TOKEN = '7484321656:AAFaswxTqaSHu_s4jd_pk2Q2OJJWYcWHwAM'
# Initialize the Telegram bot
bot = telebot.TeleBot(BOT_TOKEN)
# Configure logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('bot_debug.log'), # Log to a file
logging.StreamHandler() # Also log to console
]
)
logger = logging.getLogger(__name__)
# Configure Google Generative AI
genai.configure(api_key=GOOGLE_API_KEY)
# Create the model
generation_config = {
"temperature": 1,
"top_p": 0.95,
"top_k": 64,
"max_output_tokens": 8192,
"response_mime_type": "text/plain",
}
model = genai.GenerativeModel(
model_name="gemini-1.5-pro",
generation_config=generation_config,
system_instruction="Please respond to user input"
)
chat_session = model.start_chat(
history=[
{"role": "user", "parts": ["hi\n"]},
{"role": "model", "parts": ["Hello! πŸ‘‹ How can I help you today? 😊 \n"]},
{"role": "user", "parts": ["I am looking for photo booth service?"]},
{"role": "model", "parts": ["That's great! πŸŽ‰ I can definitely help you with information about Aforative Media's photo booth services. \n\nTo give you the most relevant information, could you tell me a little more about what you're looking for? ..."]},
{"role": "user", "parts": ["How much for photo booth services?"]},
{"role": "model", "parts": ["You're smart to ask about pricing upfront! πŸ˜‰ \n\nAforative Media's Mr. & Ms. Booth photo booth services start at **USD 390 for a minimum of 2 hours**. ..."]},
{"role": "user", "parts": ["How about videography service?"]},
{"role": "model", "parts": ["You're thinking about capturing the memories on film too? Excellent choice! Videography adds a whole other dimension to remembering special events. \n\nAforative Media offers excellent videography services, and just like their photo booths, their videography packages are competitively priced and flexible. ..."]},
]
)
# Initialize Flask app
app = Flask(__name__)
@app.route(f'/bot{BOT_TOKEN}', methods=['POST'])
def webhook():
"""Handles incoming updates from Telegram."""
try:
json_str = request.get_data(as_text=True)
logger.debug(f"Received update: {json_str}")
update = telebot.types.Update.de_json(json_str)
bot.process_new_updates([update])
return 'ok', 200
except Exception as e:
logger.error(f"Error in webhook: {e}")
return 'error', 500
@bot.message_handler(content_types=['text'])
def handle_text_messages(message):
"""Handles text messages and responds based on predefined questions or Generative AI."""
logger.debug(f"Received message: {message.text} from chat_id {message.chat.id}")
try:
prompt = f"Respond to the user: {message.text}"
response = chat_session.send_message(prompt) # Generate response using text and prompt
response_text = response.text
# Log the response
logger.debug(f"Generated response: {response_text}")
# Send the response to the chat
bot.send_message(message.chat.id, response_text, parse_mode='Markdown')
logger.info(f"Response sent to chat_id {message.chat.id}")
except Exception as e:
logger.error(f"Error during GenAI processing: {e}")
error_message = "Sorry, I can't answer this query right now but I will improve from time to time."
bot.send_message(message.chat.id, error_message, parse_mode='Markdown')
logger.error(f"Error message sent to chat_id {message.chat.id}")
def set_webhook():
"""Sets the webhook for the Telegram bot."""
webhook_url = f"https://api.telegram.org/bot{BOT_TOKEN}/setWebhook?url=https://measmonysuon-flyingbird.hf.space/bot{BOT_TOKEN}"
retries = 5
while retries > 0:
try:
response = requests.get(webhook_url)
result = response.json()
if result.get('ok'):
logger.info("Webhook set successfully.")
return
else:
logger.error(f"Failed to set webhook: {result}")
except requests.exceptions.RequestException as e:
logger.error(f"Request exception: {e}")
retries -= 1
time.sleep(5) # Wait before retrying
logger.error("Failed to set webhook after multiple attempts.")
if __name__ == "__main__":
set_webhook() # Set the webhook before starting the Flask app
app.run(host='0.0.0.0', port=5000)