| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | import osimport base64import asyncioimport requestsimport httpxfrom PIL import Imagefrom dotenv import load_dotenvfrom io import BytesIOload_dotenv()META_ACCESS_TOKEN = os.getenv("META_ACCESS_TOKEN")WHATSAPP_API_URL = os.getenv("WHATSAPP_API_URL")TOGETHER_API_KEY = os.getenv("TOGETHER_API_KEY")MEDIA_URL = "https://graph.facebook.com/v20.0/{media_id}"BASE_URL = os.getenv("BASE_URL")PHONE_NUMBER_ID = os.getenv("PHONE_NUMBER_ID")GROQ_API_KEY = os.getenv("GROQ_API_KEY")def send_message(to: str, text: str):    if not text:        print("Error: Message text is empty.")        return    payload = {        "messaging_product": "whatsapp",        "to": to,        "type": "text",        "text": {"body": text}    }    headers = {        "Authorization": f"Bearer {META_ACCESS_TOKEN}",        "Content-Type": "application/json"    }    response = requests.post(WHATSAPP_API_URL, headers=headers, json=payload)    if response.status_code == 200:        print("Message sent")    else:        print(f"Send failed: {response.text}")async def send_message_async(user_phone: str, message: str):    loop = asyncio.get_running_loop()    await loop.run_in_executor(None, send_message, user_phone, message)        async def send_audio_message(to: str, file_path: str):    url = f"https://graph.facebook.com/v20.0/{PHONE_NUMBER_ID}/media"    with open(file_path, "rb") as f:        files = { "file": ("reply.mp3", open(file_path, "rb"), "audio/mpeg")}        params = {            "messaging_product": "whatsapp",            "type": "audio",            "access_token": ACCESS_TOKEN        }        response = requests.post(url, params=params, files=files)    if response.status_code == 200:        media_id = response.json().get("id")        payload = {            "messaging_product": "whatsapp",            "to": to,            "type": "audio",            "audio": {"id": media_id}        }        headers = {            "Authorization": f"Bearer {ACCESS_TOKEN}",            "Content-Type": "application/json"        }        requests.post(WHATSAPP_API_URL, headers=headers, json=payload)    else:        print("Audio upload failed:", response.text)async def llm_reply_to_text_v2(user_input: str, user_phone: str, media_id: str = None,kind: str = None):    try:        # print("inside this function")        headers = {        'accept': 'application/json',        'Content-Type': 'application/json',    }        json_data = {            'user_input': user_input,            'media_id': media_id,            'kind': kind        }                async with httpx.AsyncClient() as client:          response = await client.post("https://df00-171-60-176-142.ngrok-free.app/llm-response", json=json_data, headers=headers,timeout=60)          response_data = response.json()          # print(response_data)          if response.status_code == 200 and response_data['error'] == None:              message_content = response_data['response']              if message_content:                  loop = asyncio.get_running_loop()                  await loop.run_in_executor(None, send_message, user_phone, message_content)              else:                  print("Error: Empty message content from LLM API")                  await send_message_async(user_phone, "Received empty response from LLM API.")          else:              print("Error: Invalid LLM API response", response_data)              await send_message_async(user_phone, "Failed to process image due to an internal server error.")    except Exception as e:        print("LLM error:", e)        await send_message_async(user_phone, "Sorry, something went wrong while generating a response.")
 |