AIHoroscope / app.py
AIsubDragon's picture
Upload 2 files
d698941 verified
# 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()