70 lines
2.5 KiB
Python
70 lines
2.5 KiB
Python
from fastapi import FastAPI, Request, BackgroundTasks
|
|
from fastapi.responses import JSONResponse
|
|
from pydantic import BaseModel
|
|
from utils import send_message,llm_reply_to_text,handle_image_message,get_llm_response,send_audio_message,fetch_media,text_to_speech,llm_reply_to_text_v2,audio_conversion
|
|
import os
|
|
import requests
|
|
import httpx
|
|
from dotenv import load_dotenv
|
|
#from utils import handle_image_message
|
|
|
|
load_dotenv()
|
|
app = FastAPI()
|
|
|
|
ACCESS_TOKEN = os.getenv("ACCESS_TOKEN")
|
|
AGENT_URL = os.getenv("AGENT_URL")
|
|
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
|
|
class WhatsAppMessage(BaseModel):
|
|
object: str
|
|
entry: list
|
|
|
|
|
|
# @app.get("/webhook")
|
|
# async def verify_webhook(request: Request):
|
|
# mode = request.query_params.get("hub.mode")
|
|
# token = request.query_params.get("hub.verify_token")
|
|
# challenge = request.query_params.get("hub.challenge")
|
|
# print(mode)
|
|
# print(token)
|
|
# print(challenge)
|
|
|
|
# # if mode and token and mode == "subscribe" and token == "1234":
|
|
# # return {"hub_verfiy_mode":mode,"hub_verify_token":token, "hub_verify_challange":challenge }
|
|
# # return token
|
|
|
|
# return int(challenge)
|
|
# # return {"error": "Invalid verification token"}
|
|
|
|
|
|
|
|
|
|
|
|
@app.post("/webhook")
|
|
async def webhook_handler(request: Request, background_tasks: BackgroundTasks):
|
|
data = await request.json()
|
|
message_data = WhatsAppMessage(**data)
|
|
|
|
change = message_data.entry[0]["changes"][0]["value"]
|
|
print(change)
|
|
if 'messages' in change:
|
|
message = change["messages"][-1]
|
|
user_phone = message["from"]
|
|
print(message)
|
|
if "text" in message:
|
|
user_message = message["text"]["body"].lower()
|
|
print(user_message)
|
|
background_tasks.add_task(llm_reply_to_text_v2, user_message, user_phone,None,None)
|
|
elif "image" in message:
|
|
media_id = message["image"]["id"]
|
|
print(media_id)
|
|
caption = message["image"].get("caption", "")
|
|
# background_tasks.add_task(handle_image_message, media_id, user_phone, caption)
|
|
background_tasks.add_task(llm_reply_to_text_v2,caption,user_phone,media_id,'image')
|
|
elif message.get("audio"):
|
|
media_id = message["audio"]["id"]
|
|
print(media_id)
|
|
path = await audio_conversion("",media_id,'audio')
|
|
# Send final audio reply
|
|
print(user_phone)
|
|
await send_audio_message(user_phone, path)
|
|
return JSONResponse(content={"status": "ok"}), 200 |