File size: 2,314 Bytes
67e02e2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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")