import os import sys import subprocess import logging from fastapi import FastAPI, Request, HTTPException,APIRouter import requests import json from datetime import datetime import importlib import pkgutil from mysite.libs.utilities import validate_signature, no_process_file #from mysite.database.database import ride,create_ride from routers.gra_04_database.rides import test_set_lide from mysite.interpreter.prompt import prompt_genalate,test_prompt from mysite.interpreter.google_chat import send_google_chat_card,send_google_chat_card_thread,send_google_chat_wav #from mysite.interpreter.interpreter import chat_with_interpreter from routers.gra_02_openInterpreter.OpenInterpreter import chat_with_interpreter_no_stream from mysite.appsheet.appsheet import get_senario import asyncio from prompts.promps import prompt_for_create_system,prompt,get_prompt from command.line_get_user_profile import get_user_profile from command.n8n import post_data,post_data_line import time import traceback from pathlib import Path logger = logging.getLogger(__name__) ## #router = APIRouter() router = APIRouter() #@router.get("/route/webhooks") @router.post("/webhook") async def webhook(request: Request): import os DEBUG=0 #return #logger.info("[Start] ====== LINE webhook ======") body = await request.body() received_headers = dict(request.headers) body_str = body.decode("utf-8") logger.info("Received Body: %s", body_str) body_json = json.loads(body_str) events = body_json.get("events", []) webhook_url = os.getenv("chat_url") token = os.getenv("token") ChannelAccessToken = os.getenv('ChannelAccessToken') n8nurl = os.getenv("n8nhook") thread_name="" ###return #url = github(token,foldername) try: for event in events: if event["type"] == "message" and event["message"]["type"] == "text": user_id = event["source"]["userId"] text = event["message"]["text"] event_type = event.get('type') webhook_event_id = event.get('webhookEventId') delivery_context = event.get('deliveryContext', {}) timestamp = event.get('timestamp') mode = event.get('mode') # メッセージ情報を取得 message = event.get('message', {}) message_type = message.get('type') message_id = message.get('id') message_text = message.get('text') quote_token = message.get('quoteToken') chat_id = event.get('source', {}).get('chatId') # ソース情報を取得 source = event.get('source', {}) source_type = source.get('type') user_id = source.get('userId') # 応答トークンを取得 reply_token = event.get('replyToken') user_name,thmbnail = get_user_profile(user_id,ChannelAccessToken) logger.info("Received Headers: %s", user_name) logger.info("Received Headers: %s", thmbnail) #logger.info("------------------------------------------") first_line = text.split('\n')[0] #logger.info(f"User ID: {user_id}, Text: {text}") ######################################################################### # 査定用のプロンプト promps,prompt_res = prompt_genalate("返信は日本語で答えて下さい "+text,get_prompt(text)) #test_set_lide(text,"a1") #no_process_file(text, "ai") #\r\m ######################################################################### #user_name,thmbnail# title = f""" {user_name}様から下記の質問があります""" subtitle = f"""ユーザーID {user_id}\r\n 質問内容\r\n{message_id} {text}""" ## subtitle = f""" ユーザーID: {user_id} 質問内容: {text} """ #Webhook Event ID: {webhook_event_id}
#Delivery Context: {json.dumps(delivery_context)}
#Timestamp: {timestamp}
#Mode: {mode}
#Message Type: {message_type}
#Message ID: {message_id}
#Message Text: {message_text}
#Quote Token: {quote_token}
#Source Type: {source_type}
#Reply Token: {reply_token}
link_text = "\r\nチャットボット設定用シート\r\n シート用のアプリはチャットから\r\n @リファペディア\r\n と打ち込むと開きます" link_url = "https://docs.google.com/spreadsheets/d/13pqP-Ywo5eRlZBsYX2m3ChARG38EoIYOowFd3cWij1c/edit?gid=283940886#gid=283940886" #test_set_lide(subtitle, text) #thread_name = send_google_chat_card(webhook_url, title, subtitle, link_text, link_url,thmbnail) import requests import os # テキストを定義 # texts = (text) # テキストをファイルに保存 text_file_path = 'text.txt' with open(text_file_path, 'w', encoding='utf-8') as file: file.write(text) # 音声合成のクエリを取得 with open(text_file_path, 'r', encoding='utf-8') as file: response = requests.post( "https://kenken999-voicebox.hf.space/audio_query?speaker=1", params={'text': file.read()} ) query_json = response.json() # 音声合成の実行 response = requests.post( "https://kenken999-voicebox.hf.space/synthesis?speaker=2", headers={"Content-Type": "application/json"}, json=query_json ) # staticフォルダに音声ファイルを保存 os.makedirs('staticfiles', exist_ok=True) timestamp = datetime.now().strftime("%Y%m%d%H%M%S") audio_file_name = f"audio_{timestamp}.wav" audio_file_path = os.path.join('staticfiles', audio_file_name) with open(audio_file_path, 'wb') as file: file.write(response.content) ##audio send add print(f"Audio saved as {audio_file_path}") wavurl = "https://kenken999-fastapi-django-main.hf.space/static/"+audio_file_name #thread_name = send_google_chat_wav(webhook_url, "youtube audiofile", wavurl, link_text, link_url,thmbnail)#thread_name) thread_name = send_google_chat_card(webhook_url, title, subtitle, link_text, link_url,thmbnail,wavurl) ######################################################################### ### n8n WorkFlowStart ######################################################################### line_signature = received_headers.get("x-line-signature") ####$for debug headers = { "Content-Type": "application/json", "X-Line-Signature": line_signature, "Authorization": f"Bearer {os.getenv('ChannelAccessToken')}", "user_id":user_id, } #/webhook-test/d2d0af6e-5c42-45b6-a923-3bd2d8520e3f #d2d0af6e-5c42-45b6-a923-3bd2d8520e3d post_data("https://kenken999-nodex-n8n.hf.space/webhook-test/d2d0af6e-5c42-45b6-a923-3bd2d8520e3f",text,thread_name,headers) #http://localhost:7860/webhook-test/d2d0af6e-5c42-45b6-a923-3bd2d8520e3f post_data_line("https://kenken999-nodex-n8n.hf.space/webhook-test/d2d0af6e-5c42-45b6-a923-3bd2d8520e3d",body,headers) #http://localhost:7860/webhook/d2d0af6e-5c42-45b6-a923-3bd2d8520e3d post_data_line("https://kenken999-nodex-n8n.hf.space/webhook/d2d0af6e-5c42-45b6-a923-3bd2d8520e3d",body,headers) #post_data_line("https://kenken999-nodex-n8n.hf.space/webhook/d2d0af6e-5c42-45b6-a923-3bd2d8520e3f",body,headers) #return post_data(n8nurl,text,thread_name,headers) time.sleep(10) ######################################################################### title = f""" プロンプト作成 {promps}""" subtitle = f"""userid {user_id}\r\n chatid {thread_name}\r\n{prompt_res}""" link_text = "データを確認する" link_url = "https://kenken999-php.hf.space/diamondprice_list.php" #test_set_lide(subtitle, text) if DEBUG==1: thread_name = send_google_chat_card_thread(webhook_url, title, subtitle, link_text, link_url,thread_name) #thread_name = send_google_chat_card_thread(webhook_url, title, subtitle, link_text, link_url,thread_name) #return #test case ######################################################################### first_line = text.split('\n')[0] #test_prompt res = test_prompt("返信は必ず日本語でして下さい \r\n"+prompt_res,text) if DEBUG==1: thread_name = send_google_chat_card_thread(webhook_url, "プロンプトテスト "+first_line, str(res), link_text, link_url,thread_name) #thread_name = send_google_chat_card_thread(webhook_url, title, subtitle, link_text, link_url,thread_name) now = datetime.now() yyyymmddhis = now.strftime('%Y%m%d%H%M%S') ######################################################################### ## excute create program if DEBUG==1: res_no_process = no_process_file(prompt_for_create_system+res, "gpt_enginner"+ yyyymmddhis,thread_name) # execute open interpreter ######################################################################### if DEBUG==1: full_response,history = chat_with_interpreter_no_stream(prompt_for_create_system+"\r\n"+res) if DEBUG==1: thread_name = send_google_chat_card_thread(webhook_url, f"自動設定開始 {res}", str(full_response), link_text, link_url,thread_name) #################################################################### #ダイヤ金額計算 from babyagi.classesa.diamond import calculate if DEBUG==1: title = f""" ダイヤ予測計算の実行 類似5件表示 {text} id,price,carat, cut, color, clarity, depth, diamondprice.table, x, y, z 類似度""" #ベクトルインデックス res_calculate = calculate(text) subtitle = res_calculate link_text = "データを確認する" link_url = "https://kenken999-php.hf.space/diamondprice_list.php" ######################################################################### #test_set_lide(subtitle, text) #if DEBUG==0: thread_name = send_google_chat_card_thread(webhook_url, title, subtitle, link_text, link_url,thread_name) ######################################################################### from babyagi.babyagi import completion #import tempfile text = text.replace("\r\n","") # コマンドを構築 command = f"""make runbabyagi "{text}に対して、より良いチャットボットでのQAプランデータ設定の提案を日本語で作成してください" {thread_name}""" if DEBUG==1: with open('/home/user/app/babyagi/prompt.txt', 'w') as file: file.write(f"""{text}の質問 についてチャットボットでよりよく対応するプランを日本語で作成して""") ###################################################################### if DEBUG==1: proc = subprocess.Popen( ["make", "runbabyagi", thread_name], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) logger.info("Received Headers: %s", received_headers) logger.info("Received Body: %s", body.decode("utf-8")) ############################################################################### #send to appsheet get_senario("user_id",str(body)) #apps script send headers = { "Content-Type": "application/json", } logger.info("Received Body: %s", "send data to appsheet ") #response = requests.post(os.getenv("WEBHOOK_URL"), headers=headers, data=body) # check signature line_signature = received_headers.get("x-line-signature") logger.info("Received Body: %s", "start send messages ") #headers = { # "Content-Type": "application/json", # "X-Line-Signature": line_signature, # "Authorization": f"Bearer {os.getenv('ChannelAccessToken')}", # } #r#esponse = requests.post(os.getenv("WEBHOOK_URL"), headers=headers, data=body) if not line_signature: raise HTTPException(status_code=400, detail="X-Line-Signature header is missing.") if not validate_signature(body.decode("utf-8"), line_signature, os.getenv("ChannelSecret")): raise HTTPException(status_code=400, detail="Invalid signature.") if not os.getenv("WEBHOOK_URL") or not os.getenv("WEBHOOK_URL").startswith("https://"): raise HTTPException(status_code=400, detail="Invalid webhook URL") headers = { "Content-Type": "application/json", "X-Line-Signature": line_signature, "Authorization": f"Bearer {os.getenv('ChannelAccessToken')}", } logger.info("Forwarding to URL: %s", os.getenv("WEBHOOK_URL")) logger.info("Forwarding Headers: %s", headers) logger.info("Forwarding Body: %s", body.decode("utf-8")) response = requests.post(os.getenv("WEBHOOK_URL"), headers=headers, data=body) responses = requests.post(os.getenv("WEBHOOK_GAS"), headers=headers, data=body) logger.info("Response Code: %s", response.status_code) logger.info("Response Content: %s", response.text) logger.info("Response Headers: %s", response.headers) return {"status": "success", "response_content": response.text}#, response.status_code except Exception as e: error_file = os.path.basename(__file__) # ファイル名を取得 error_line = sys._getframe(1).f_lineno # 行番号を取得 print(f"Error occurred at file {error_file} on line {error_line}: {str(e)}") # スタックトレースの詳細を取得 exc_type, exc_value, exc_tb = sys.exc_info() tb_info = traceback.extract_tb(exc_tb)[-1] # 最後のトレースバック情報を取得 error_file = tb_info.filename # エラーが発生したファイル error_line = tb_info.lineno # エラーが発生した行 error_trace = traceback.format_exc() # スタックトレース全体を取得 #エラー内容の分析 promps,res = prompt_genalate(str(e)) #test_set_lide(text,"a1") #no_process_file(text, "ai") custormer_supportpage = "\r\n カスタマーサポートはこちらから \r\n https://bpmboxesscom-46463613.hubspotpagebuilder.com/ja \r\n " title = f"""Error occurred at file {error_file} on line {error_line}: {str(e)}\n{error_trace}エラーが起こりました -+errer file is {error_file} error line is {error_line} {str(e)} 自動修復の開始 """ subtitle = custormer_supportpage+res link_text = "test" link_url = "url" #test_set_lide(subtitle, text) logger.error(res) #send error to google chat ### #send_google_chat_card_thread(webhook_url, title, subtitle, link_text, link_url,thread_name) logger.error("Error: %s", str(e)) #raise するとシステムとまるのでアンコメント #raise HTTPException(status_code=500, detail=str(e)) return {"status": "success", "response_content": str(e)}#, response.status_code