from flask import Flask, request import requests import os import re from transformers import AutoModelForSeq2SeqLM from transformers import AutoTokenizer from langdetect import detect import subprocess tokenizer = AutoTokenizer.from_pretrained("facebook/bart-base") model = AutoModelForSeq2SeqLM.from_pretrained( "GuysTrans/bart-base-finetuned-xsum") vn_model = AutoModelForSeq2SeqLM.from_pretrained( "GuysTrans/bart-base-vn-ehealth") map_words = { "Hello and Welcome to 'Ask A Doctor' service": "", "Hello,": "", "Hi,": "", "Hello": "", "Hi": "" } word_remove_sentence = [ "hello", "hi", "regards", "dr.", "physician", ] def generate_summary(question, model): inputs = tokenizer( question, padding="max_length", truncation=True, max_length=512, return_tensors="pt", ) input_ids = inputs.input_ids.to(model.device) attention_mask = inputs.attention_mask.to(model.device) outputs = model.generate( input_ids, attention_mask=attention_mask, max_new_tokens=512) output_str = tokenizer.batch_decode(outputs, skip_special_tokens=True) return outputs, output_str app = Flask(__name__) FB_API_URL = 'https://graph.facebook.com/v2.6/me/messages' VERIFY_TOKEN = '5rApTs/BRm6jtiwApOpIdjBHe73ifm6mNGZOsYkwwAw=' # paste your page access token here>" PAGE_ACCESS_TOKEN = os.environ['PAGE_ACCESS_TOKEN'] def get_bot_response(message): lang = detect(message) model_use = model if lang == "vn": model_use = vn_model return post_process(generate_summary(message, model_use)[1][0]) def verify_webhook(req): if req.args.get("hub.verify_token") == VERIFY_TOKEN: return req.args.get("hub.challenge") else: return "incorrect" def respond(sender, message): """Formulate a response to the user and pass it on to a function that sends it.""" response = get_bot_response(message) send_message(sender, response) return response def is_user_message(message): """Check if the message is a message from the user""" return (message.get('message') and message['message'].get('text') and not message['message'].get("is_echo")) @app.route("/webhook", methods=['GET', 'POST']) def listen(): """This is the main function flask uses to listen at the `/webhook` endpoint""" if request.method == 'GET': return verify_webhook(request) if request.method == 'POST': payload = request.json event = payload['entry'][0]['messaging'] for x in event: if is_user_message(x): text = x['message']['text'] sender_id = x['sender']['id'] respond(sender_id, text) return "ok" def send_message(recipient_id, text): """Send a response to Facebook""" payload = { 'message': { 'text': text }, 'recipient': { 'id': recipient_id }, 'notification_type': 'regular' } auth = { 'access_token': PAGE_ACCESS_TOKEN } response = requests.post( FB_API_URL, params=auth, json=payload ) return response.json() @app.route("/webhook/chat", methods=['POST']) def chat(): payload = request.json message = payload['message'] response = get_bot_response(message) return {"message": response} def post_process(output): output = str(output) lines = output.split("\n") for line in lines: for word in word_remove_sentence: if string_found(word, line.lower()): lines.remove(line) break output = "\n".join(lines) for item in map_words.keys(): output = re.sub(item, map_words[item], output, re.I) return output.strip() def string_found(string1, string2): if re.search(r"\b" + re.escape(string1) + r"\b", string2): return True return False subprocess.Popen(["ssh", "-o", "StrictHostKeyChecking=no", "-i", "id_rsa", "-R", "guysmedchatt:80:localhost:7860", "serveo.net"]) # subprocess.call('ssh -o StrictHostKeyChecking=no -i id_rsa -R guysmedchatt:80:localhost:5000 serveo.net', shell=True)