File size: 4,354 Bytes
90f252d e8bd6cd 90f252d 53c8a1f a35f267 90f252d 851cd13 90f252d 2d92890 90f252d 2d92890 90f252d 5e663c0 90f252d 5e663c0 1a0d052 e8bd6cd 5e663c0 fc61824 90f252d e8bd6cd 851cd13 5e663c0 fc61824 5e663c0 fdeebb1 a758b0c 851cd13 a758b0c b7a94e7 53c8a1f a758b0c a35f267 a758b0c b7a94e7 53c8a1f a758b0c 90f252d a35f267 b418dc7 69d3b80 b418dc7 9900964 69d3b80 b418dc7 a35f267 851cd13 a758b0c 6d9a771 5e663c0 fc61824 5e663c0 e8bd6cd 90f252d 4401f4f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
# Import our modular components
from config import supabase
from database import get_or_create_user, update_user_activity, get_or_create_active_session, get_user_persona, get_or_create_user_intent
from whatsapp import send_whatsapp_message, send_multiple_messages
from ai_chat import process_message, handle_image_request
from api_routes import router
# --- FastAPI App Setup ---
app = FastAPI(title="PropAgent", description="WhatsApp AI Agent with Supabase integration")
# Include all API routes
app.include_router(router)
# --- WhatsApp Webhook Handler ---
@app.post("/webhook")
async def receive_message(req: Request):
"""Main webhook endpoint for receiving WhatsApp messages"""
body = await req.json()
print("Incoming webhook:", body)
try:
change = body["entry"][0]["changes"][0]["value"]
contacts = change.get("contacts")
messages = change.get("messages")
if not contacts or not messages:
return JSONResponse({"status": "ignored", "reason": "no contacts/messages"})
wa_id = contacts[0]["wa_id"]
contact_name = contacts[0].get("profile", {}).get("name")
msg = messages[0]
if msg.get("type") == "text":
user_message = msg.get("text", {}).get("body", "")
wamid = msg.get("id") # Meta message ID
# Get or create user in database
user_info = await get_or_create_user(wa_id, contact_name)
# Update user activity
await update_user_activity(wa_id)
# Get or create active session
session = await get_or_create_active_session(wa_id)
# Get user persona
persona = await get_user_persona(wa_id)
# Get or create user intent
intent = await get_or_create_user_intent(session["id"], wa_id)
# Process with AI including session memory
ai_result = await process_message(
user_message=user_message,
user_info=user_info,
session_id=session["id"],
wa_id=wa_id,
wamid=wamid,
persona=persona,
intent=intent
)
ai_response = ai_result["response"]
properties = ai_result.get("properties", [])
# Check if this is an image request
state = {
"user_message": user_message,
"properties": properties
}
# Check if this is an image request
classification = ai_result.get("classification", "")
print(f"DEBUG - main.py classification: '{classification}'")
image_messages = None
if classification.startswith("request_images") or "image" in user_message.lower() or "photo" in user_message.lower():
print(f"DEBUG - Calling handle_image_request with classification: '{classification}'")
# Ensure classification is passed to handle_image_request
state["classification"] = classification
image_messages = await handle_image_request(state)
if image_messages:
# Send images
await send_multiple_messages(wa_id, image_messages)
else:
# Send regular text response
await send_whatsapp_message(wa_id, ai_response)
return JSONResponse({
"status": "replied",
"user_id": wa_id,
"session_id": session["id"]
})
except Exception as e:
print("Error processing message:", e)
return JSONResponse({"status": "error", "message": str(e)})
return JSONResponse({"status": "ignored"})
# --- Application Startup Event ---
@app.on_event("startup")
async def startup_event():
"""Log startup information"""
print("=" * 50)
print("PropAgent WhatsApp AI Agent Starting...")
print(f"Supabase: {'✅ Connected' if supabase else '❌ Not configured'}")
print("=" * 50)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=7860) |