IAMTFRMZA's picture
Rename app.py to main.py
b56a5d3 verified
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")