webhook_main.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from fastapi import FastAPI, Request, BackgroundTasks
  2. from fastapi.responses import JSONResponse
  3. from pydantic import BaseModel
  4. 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
  5. import os
  6. import requests
  7. import httpx
  8. from dotenv import load_dotenv
  9. #from utils import handle_image_message
  10. load_dotenv()
  11. app = FastAPI()
  12. ACCESS_TOKEN = os.getenv("ACCESS_TOKEN")
  13. AGENT_URL = os.getenv("AGENT_URL")
  14. GROQ_API_KEY = os.getenv("GROQ_API_KEY")
  15. class WhatsAppMessage(BaseModel):
  16. object: str
  17. entry: list
  18. # @app.get("/webhook")
  19. # async def verify_webhook(request: Request):
  20. # mode = request.query_params.get("hub.mode")
  21. # token = request.query_params.get("hub.verify_token")
  22. # challenge = request.query_params.get("hub.challenge")
  23. # print(mode)
  24. # print(token)
  25. # print(challenge)
  26. # # if mode and token and mode == "subscribe" and token == "1234":
  27. # # return {"hub_verfiy_mode":mode,"hub_verify_token":token, "hub_verify_challange":challenge }
  28. # # return token
  29. # return int(challenge)
  30. # # return {"error": "Invalid verification token"}
  31. @app.post("/webhook")
  32. async def webhook_handler(request: Request, background_tasks: BackgroundTasks):
  33. data = await request.json()
  34. message_data = WhatsAppMessage(**data)
  35. change = message_data.entry[0]["changes"][0]["value"]
  36. print(change)
  37. if 'messages' in change:
  38. message = change["messages"][-1]
  39. user_phone = message["from"]
  40. print(message)
  41. if "text" in message:
  42. user_message = message["text"]["body"].lower()
  43. print(user_message)
  44. background_tasks.add_task(llm_reply_to_text_v2, user_message, user_phone,None,None)
  45. elif "image" in message:
  46. media_id = message["image"]["id"]
  47. print(media_id)
  48. caption = message["image"].get("caption", "")
  49. # background_tasks.add_task(handle_image_message, media_id, user_phone, caption)
  50. background_tasks.add_task(llm_reply_to_text_v2,caption,user_phone,media_id,'image')
  51. elif message.get("audio"):
  52. media_id = message["audio"]["id"]
  53. print(media_id)
  54. path = await audio_conversion("",media_id,'audio')
  55. # Send final audio reply
  56. print(user_phone)
  57. await send_audio_message(user_phone, path)
  58. return JSONResponse(content={"status": "ok"}), 200