import os import time import requests from fastapi import FastAPI, Request from fastapi.responses import PlainTextResponse # Initialize FastAPI (used by Gradio Spaces under the hood) app = FastAPI() # Load credentials from environment variables OPENAI_API_KEY = os.environ["OPENAI_API_KEY"] ASSISTANT_ID = "asst_5gQR21fOsmHil11FGBzEArA7" TWILIO_SID = os.environ["TWILIO_SID"] TWILIO_AUTH_TOKEN = os.environ["TWILIO_AUTH_TOKEN"] TWILIO_NUMBER = "whatsapp:+14155238886" # Twilio sandbox number @app.post("/webhook") async def receive_message(request: Request): form_data = await request.form() user_input = form_data.get("Body") user_number = form_data.get("From") # 1. Create a new assistant thread thread = requests.post( "https://api.openai.com/v1/threads", headers={"Authorization": f"Bearer {OPENAI_API_KEY}"} ).json() thread_id = thread["id"] # 2. Send user message requests.post( f"https://api.openai.com/v1/threads/{thread_id}/messages", headers={"Authorization": f"Bearer {OPENAI_API_KEY}"}, json={"role": "user", "content": user_input} ) # 3. Run assistant run = requests.post( f"https://api.openai.com/v1/threads/{thread_id}/runs", headers={"Authorization": f"Bearer {OPENAI_API_KEY}"}, json={"assistant_id": ASSISTANT_ID} ).json() # 4. Wait for run to complete while True: run_status = requests.get( f"https://api.openai.com/v1/threads/{thread_id}/runs/{run['id']}", headers={"Authorization": f"Bearer {OPENAI_API_KEY}"} ).json() if run_status["status"] == "completed": break time.sleep(2) # 5. Fetch response messages = requests.get( f"https://api.openai.com/v1/threads/{thread_id}/messages", headers={"Authorization": f"Bearer {OPENAI_API_KEY}"} ).json() reply = messages["data"][0]["content"][0]["text"]["value"] # 6. Send reply via Twilio back to WhatsApp requests.post( f"https://api.twilio.com/2010-04-01/Accounts/{TWILIO_SID}/Messages.json", auth=(TWILIO_SID, TWILIO_AUTH_TOKEN), data={ "From": TWILIO_NUMBER, "To": user_number, "Body": reply } ) return PlainTextResponse("OK")