|
import base64 |
|
import requests |
|
import os |
|
import logging |
|
from dotenv import load_dotenv |
|
|
|
|
|
load_dotenv() |
|
|
|
|
|
logging.basicConfig( |
|
level=logging.INFO, |
|
format="%(asctime)s - %(levelname)s - %(message)s", |
|
handlers=[ |
|
logging.StreamHandler(), |
|
logging.FileHandler("api_request_logs.log") |
|
] |
|
) |
|
|
|
|
|
GROQ_API_KEY = os.getenv("GROQ_API_KEY2") |
|
if not GROQ_API_KEY: |
|
raise ValueError("GROQ_API_KEY is not set in the .env file") |
|
|
|
def process_image_and_get_description(image_path, model="llama-3.2-90b-vision-preview", retries=3): |
|
""" |
|
Process the image using the Groq API and get a description. |
|
Retries in case of failure. |
|
|
|
Args: |
|
image_path (str): Path to the image. |
|
model (str): Model to use for processing. |
|
retries (int): Number of retries before giving up. |
|
|
|
Returns: |
|
str: Description of the image or an error message. |
|
""" |
|
encoded_image = image_path |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
messages = [ |
|
{ |
|
"role": "user", |
|
"content": [ |
|
{"type": "text", "text": "Analyze the image to identify what is happening, describe the overall context, and perform OCR to extract any visible text. Additionally, specify whether the subject is a human, animal, or object, and provide a detailed description of any object the human is holding or their specific actions."}, |
|
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{encoded_image}"}} |
|
] |
|
} |
|
] |
|
|
|
for attempt in range(1, retries + 1): |
|
try: |
|
logging.info(f"Attempt {attempt} to process the image with Groq API.") |
|
|
|
|
|
response = requests.post( |
|
"https://api.groq.com/openai/v1/chat/completions", |
|
json={ |
|
"model": model, |
|
"messages": messages, |
|
"max_tokens": 4096, |
|
"stop": None, |
|
"stream": False |
|
}, |
|
headers={ |
|
"Authorization": f"Bearer {GROQ_API_KEY}", |
|
"Content-Type": "application/json" |
|
}, |
|
timeout=30 |
|
) |
|
|
|
|
|
if response.status_code == 200: |
|
result = response.json() |
|
answer = result["choices"][0]["message"]["content"] |
|
logging.info("Successfully processed the image and received a response.") |
|
return answer |
|
else: |
|
logging.warning(f"Received error response: {response.status_code} - {response.text}") |
|
except requests.RequestException as e: |
|
logging.error(f"RequestException on attempt {attempt}: {e}") |
|
|
|
logging.error("All attempts to process the image failed.") |
|
return "Error: Unable to process the image after multiple attempts." |
|
|
|
|
|
|
|
|
|
|
|
|