Spaces:
Sleeping
Sleeping
| import os | |
| import base64 | |
| import re | |
| from dotenv import load_dotenv | |
| from openai import OpenAI | |
| # Load environment variables from .env file | |
| load_dotenv() | |
| # Initialize OpenAI client | |
| client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) | |
| def prompt_llm(user_text): | |
| """ | |
| Basic function to send user text to GPT-4 mini and return the response. | |
| Args: | |
| user_text (str): The input text from the user | |
| Returns: | |
| str: The response text from GPT-4 mini | |
| """ | |
| try: | |
| response = client.chat.completions.create( | |
| model="gpt-4o-mini", # Using GPT-4 mini model | |
| messages=[{"role": "user", "content": user_text}], | |
| max_tokens=1000, | |
| temperature=0.7, | |
| ) | |
| return response.choices[0].message.content | |
| except Exception as e: | |
| return f"Error: {str(e)}" | |
| def prompt_llm_image(image_path, prompt_text): | |
| """ | |
| Function to send an image and text prompt to GPT-4 Vision and return the response. | |
| Args: | |
| image_path (str): Path to the image file | |
| prompt_text (str): The text prompt to ask about the image | |
| Returns: | |
| str: The response text from GPT-4 Vision | |
| """ | |
| try: | |
| # Check if image file exists | |
| if not os.path.exists(image_path): | |
| return f"Error: Image file not found at {image_path}" | |
| # Read and encode the image | |
| with open(image_path, "rb") as image_file: | |
| base64_image = base64.b64encode(image_file.read()).decode("utf-8") | |
| # Determine the image format | |
| image_extension = os.path.splitext(image_path)[1].lower() | |
| if image_extension in [".jpg", ".jpeg"]: | |
| image_format = "jpeg" | |
| elif image_extension == ".png": | |
| image_format = "png" | |
| elif image_extension == ".gif": | |
| image_format = "gif" | |
| elif image_extension == ".webp": | |
| image_format = "webp" | |
| else: | |
| return f"Error: Unsupported image format {image_extension}. Supported formats: jpg, jpeg, png, gif, webp" | |
| response = client.chat.completions.create( | |
| model="gpt-4o", # Using GPT-4 with vision capabilities | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": [ | |
| {"type": "text", "text": prompt_text}, | |
| { | |
| "type": "image_url", | |
| "image_url": { | |
| "url": f"data:image/{image_format};base64,{base64_image}" | |
| }, | |
| }, | |
| ], | |
| } | |
| ], | |
| max_tokens=1000, | |
| temperature=0.7, | |
| ) | |
| return response.choices[0].message.content | |
| except Exception as e: | |
| return f"Error: {str(e)}" | |
| def parse_bullet_points(llm_output): | |
| """ | |
| Parse LLM output and extract bullet points into a list of individual items. | |
| Args: | |
| llm_output (str): The output text from the LLM containing bullet points | |
| Returns: | |
| list: A list of individual bullet point items (up to 5 items) | |
| """ | |
| if ( | |
| not llm_output | |
| or isinstance(llm_output, str) | |
| and llm_output.startswith("Error:") | |
| ): | |
| return [] | |
| # Split by lines and process each line | |
| lines = llm_output.strip().split("\n") | |
| bullet_points = [] | |
| for line in lines: | |
| line = line.strip() | |
| # Skip empty lines | |
| if not line: | |
| continue | |
| # Look for bullet points with various formats: | |
| # - Traditional bullets: -, *, • | |
| # - Numbered lists: 1., 2., etc. | |
| # - Unicode bullets: ◦, ▪, ▫, etc. | |
| bullet_patterns = [ | |
| r"^[-*•◦▪▫]\s*(.+)", # - * • ◦ ▪ ▫ bullets | |
| r"^\d+\.\s*(.+)", # 1. 2. 3. numbered | |
| r"^[a-zA-Z]\.\s*(.+)", # a. b. c. lettered | |
| r"^\d+\)\s*(.+)", # 1) 2) 3) numbered with parenthesis | |
| ] | |
| # Try each pattern | |
| for pattern in bullet_patterns: | |
| match = re.match(pattern, line) | |
| if match: | |
| bullet_text = match.group(1).strip() | |
| # Remove any trailing punctuation and clean up | |
| bullet_text = bullet_text.rstrip(".,;:!?") | |
| if bullet_text: # Only add non-empty items | |
| bullet_points.append(bullet_text) | |
| break | |
| # Return up to 5 items as requested | |
| return bullet_points[:5] | |
| # Example usage | |
| if __name__ == "__main__": | |
| # # Test the text function | |
| # print("=== Testing Text Function ===") | |
| # user_input = "Hello! Can you explain what machine learning is in simple terms?" | |
| # response = prompt_llm(user_input) | |
| # print(f"User: {user_input}") | |
| # print(f"AI: {response}") | |
| print("\n=== Testing Image Function ===") | |
| # Test the image function (assuming there's an image.jpg in the project) | |
| image_path = "image.jpg" | |
| if os.path.exists(image_path): | |
| # =============================== | |
| # First LLM ImageSummLLM | |
| # =============================== | |
| image_prompt = """ | |
| You are helpful museum guide who can explain the history of different items | |
| What do you see in this image? | |
| * instructions: | |
| - give me a bullet point list of the 5 most interesting items | |
| - each bullet point should be 8 words max | |
| - there should be 5 bullet points max | |
| """ | |
| image_response = prompt_llm_image(image_path, image_prompt) | |
| print(f"Image: {image_path}") | |
| print(f"Prompt: {image_prompt}") | |
| print(f"AI Response:\n{image_response}") | |
| # Parse the bullet points into a list | |
| bullet_list = parse_bullet_points(image_response) | |
| print(f"\nParsed Bullet Points ({len(bullet_list)} items):") | |
| for i, item in enumerate(bullet_list, 1): | |
| print(f"{i}. {item}") | |
| # =============================== | |
| # Second LLM HistoryLLM | |
| # =============================== | |
| item_number = input("Choose item number to explain: ") | |
| item = bullet_list[int(item_number) - 1] | |
| history_prompt = f"""\n | |
| explain the item: {item} | |
| * instructions: | |
| - a short quick history time period of the item | |
| - make your response structured as follows: | |
| # History of the item | |
| - Circa 1890 | |
| # Where is it popular | |
| - United States | |
| # What is it made of | |
| - Gold | |
| # What is it used for | |
| - Jewelry | |
| # Who made it | |
| - Tiffany & Co. | |
| # Who owned it | |
| - John D. Rockefeller | |
| """ | |
| item_response = prompt_llm(history_prompt) | |
| print(f"Item Response:\n{item_response}") | |
| else: | |
| print( | |
| f"No test image found at {image_path}. To test image functionality, add an image file and update the path." | |
| ) | |