Files
2026-07-13 12:42:37 +08:00

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