Spaces:
No application file
No application file
| 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 | |
| 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") | |