# prompt: create a function with documentation for connect to GPT4o and ask for the weather # Note: the above uses the old API, so I look up the current API update the code. # Manual: Update to horoscopes templates # prompt: print out the zodiac signs import datetime import openai import os from openai import OpenAI client = OpenAI() # # Set your OpenAI API key # openai.api_key = os.getenv("OPENAI_API_KEY") # OpenAI API key: https://platform.openai.com/api-keys # # For convience to access to the Zodiac signs # zodiac_signs = [ "Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces" ] # now = datetime.datetime.now() today = f"{now.strftime('%A')}, {now.strftime('%B')} {now.strftime('%d')}, {now.strftime('%Y')}" # # Define the horoscope function # def fetch_horoscope(zodiac_sign=zodiac_signs[3], name="Hanna", person="teen girl", focus="in school", nationality="American", model="gpt-4o"): """Connects to GPT-4 and asks for the Horoscope. Args: zodiac_sign: (string) one of the 12 zodiac signs. name: (string) the name of the person. person: (string) the person's description. focus: (string) the person's focus. model: (string) the model to use. Raises: Exception: If the OpenAI API call fails. Returns: A string containing the horoscope and if errors return an error message. """ # # model choice, "gpt-4o", "gpt-4o-mini" # more choice at: https://platform.openai.com/docs/models/gpt-4o-mini # model = "gpt-4o" # # create prompt templates (Prompt Engineering) # msg1 = {"role": "system", "content": "You are a helpful assistant."} # _input = f"Generate a daily horoscope for {zodiac_sign} for {today} with a focus on career and relationships. Include {zodiac_sign}'s traits, and mention any relevant celestial events or planetary alignments. Provide practical advice that aligns with the day’s energy. Incorporate lucky elements such as a color, number, or time of day to enhance personalization. Ensure the tone is witty, positive, uplifting, and inspiring." # _output = f"The output is a story with age appropiate tone to {name}, a {person}, {focus}, and nationality is {nationality}. No bullet points, no heading." # msg2 = {"role": "user", "content": f"{_input} {_output}"} # prompt_template = [msg1, msg2] # # Ask GPT4 # try: completion = client.chat.completions.create( model=model, messages=prompt_template ) # print(completion.choices[0].message) horoscope_info = completion.choices[0].message return horoscope_info.content # except Exception as e: return f"An error occurred: {e}" # # Example usage: # horoscope_reading = fetch_horoscope(zodiac_signs[0]) # print(f"Your horoscopes for today is:\n\n {horoscope_reading.content}") # prompt: write a function with documentation to use GPT4 to generate an image # Note: add in prompt template (prompt engineer) import os import openai from openai import OpenAI def fetch_image(prompt, n=1, size="1024x1024", model_image="dall-e-3"): """Generates an image using OpenAI's DALL-E 2 API based on a given text prompt. Args: prompt: (string) A text description of the desired image. n: (int) The number of images to generate (default is 1). size: (string) The size of the generated images (default is 1024x1024). Other options include "256x256" and "512x512" and more. model: (string) The model to use for image generation (default is "dall-e-3") or dall-e-2. Raises: Exception: If the OpenAI API call fails. Returns: A list of image URLs, or an error message if the API call fails. """ # # Define the prompt template # prompt_template = f"Draw a realism beautiful watercolor image in pastel tone with no text, no writing, and no wording for the person in the following horoscope: {prompt}" # # Request to generate image # try: client = OpenAI() response = client.images.generate( model=model_image, prompt=prompt_template, n=n, size=size ) image_urls = [image.url for image in response.data] return image_urls except Exception as e: return f"An unexpected error occurred: {e}" # prompt: write a python function to take the output of OpenAI client.images.generate() function url and using PIL to create an image from it. # prompt: have error: Error downloading image: No connection adapters were found for "['https://oaidalleapiprodscus.blob.core.windows.net/private/org-A0exPbLvAU5v7R8klVyjjESv/user-N17uY5bUcWfRy95Xxs6huBmQ/img-QF2y2rPhSjGoJO25XeUdLqLD.png?st=2024-11-08T05%3A59%3A14Z&se=2024-11-08T07%3A59%3A14Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=d505667d-d6c1-4a0a-bac7-5c84a87759f8&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2024-11-07T10%3A09%3A58Z&ske=2024-11-08T10%3A09%3A58Z&sks=b&skv=2024-08-04&sig=bJziZ5sNTiIyl77YfNoFMfc/KB/NL9zHBHSsv2SnlGY%3D']" import requests from PIL import Image from io import BytesIO def generate_image_from_url(image_url): """ Downloads an image from a URL and creates a PIL Image object. Args: image_url (str): The URL of the image. Returns: PIL.Image.Image: A PIL Image object created from the downloaded image. """ try: # Ensure the URL is a string and strip any extraneous characters if isinstance(image_url, list) and len(image_url) == 1: image_url = image_url[0] # Extract URL if it's in a list if not isinstance(image_url, str): raise ValueError("The image_url must be a string.") # Fetch the image data from the URL response = requests.get(image_url) response.raise_for_status() # Ensure the request was successful # Load the image into a PIL Image object image = Image.open(BytesIO(response.content)) return image except requests.exceptions.RequestException as e: print(f"Error fetching the image from URL: {e}") return None except Exception as e: print(f"Error processing the image: {e}") return None # prompt: write tell_me function with inline documentation using *args, **kwargs calling fetch_horoscope and use the output to call fetch_image function return both horoscope text and image link # Note: minor manual debug from logging import error # def tell_me(*args, **kwargs): """Fetches a horoscope and generates an image based on it. This function combines the functionality of fetch_horoscope and fetch_image. It takes the same arguments as fetch_horoscope, fetches the horoscope, and then uses the horoscope text as a prompt for fetch_image to generate an image. Args: *args: Variable length argument list. Passed to fetch_horoscope. **kwargs: Arbitrary keyword arguments. Passed to fetch_horoscope. Returns: A dictionary containing the horoscope_text and image_url. Returns an error message if either API call fails. """ try: horoscope_text = fetch_horoscope( zodiac_sign=kwargs.get('zodiac_sign', 'Aquarius'), name=kwargs.get('name', "Hanna"), person=kwargs.get('person', "teen girl"), focus=kwargs.get('focus', "in school"), model=kwargs.get('model', "gpt-4o")) image_url = fetch_image( prompt=kwargs.get('prompt', horoscope_text), n=kwargs.get('n', 1), size=kwargs.get('size', "1024x1024"), model_image=kwargs.get('model_image', "dall-e-3") ) return {"horoscope_text":horoscope_text, "image_url":image_url} except Exception as e: error_message = f"An unexpected error occurred in tell_me(): {e}" return {"horoscope_text":error_message, "image_url":"no_url"} # # Example usage # json_output = tell_me(zodiac_sign="Taurus") # print(f"Horoscopes:\n{json_output.horoscope_text}:\n\nImage URL:\n{json_output.image_url}") # prompt: create a gradio code for input 5 item, person_name, horoscope_sign, job, focus, and nationality, and output has text and image import gradio # ... (rest of your existing code) ... def gradio_tell_me(person_name, horoscope_sign, job, focus, nationality): # HARD-CODE to test # horoscope_text = dragon_flying # image_url = dragon_img_url data=tell_me(zodiac_sign=horoscope_sign, name=person_name,person=job,focus=focus,nationality=nationality) horoscope_text=data['horoscope_text'] image_url=data['image_url'] try: image = generate_image_from_url(image_url) except Exception as e: print(f"Error generating image: {e}") image = None # Return None if error happens return horoscope_text, image iface = gradio.Interface( fn=gradio_tell_me, inputs=[ gradio.Textbox(label="Person Name"), gradio.Dropdown(choices=zodiac_signs, label="Horoscope Sign"), gradio.Textbox(label="Job"), gradio.Textbox(label="Focus"), gradio.Textbox(label="Nationality"), ], outputs=[ gradio.Textbox(label="Horoscope"), gradio.Image(label="Horoscope Image") ], title="Horoscope Generator", description="Generate a personalized horoscope and image." ) iface.launch()