tarot-reader / app.py
LinhVuu's picture
Update app.py
20e4d5b verified
raw history blame
No virus
14.1 kB
import openai
import time
import logging
import streamlit as st
from datetime import datetime
openai_api_key = st.secrets["openai_api_key"]
client = openai.OpenAI(api_key = openai_api_key)
model = "gpt-3.5-turbo-16k"
# === Thread an empty thread
thread = client.beta.threads.create()
thread_id = thread.id
def wait_for_run_completion(client, thread_id, run_id, sleep_interval=5):
"""
Waits for a run to complete and prints the elapsed time.:param client: The OpenAI client object.
:param thread_id: The ID of the thread.
:param run_id: The ID of the run.
:param sleep_interval: Time in seconds to wait between checks.
"""
while True:
try:
run = client.beta.threads.runs.retrieve(thread_id = thread_id, run_id = run_id)
if run.completed_at:
elapsed_time = run.completed_at - run.created_at
formatted_elapsed_time = time.strftime(
"%H:%M:%S", time.gmtime(elapsed_time)
)
print(f"Run completed in {formatted_elapsed_time}")
logging.info(f"Run completed in {formatted_elapsed_time}")
# Get messages here once Run is completed!
messages = client.beta.threads.messages.list(thread_id=thread_id)
last_message = messages.data[0]
response = last_message.content[0].text.value
st.write(response)
break
except Exception as e:
logging.error(f"An error occurred while retrieving the run: {e}")
break
logging.info("Waiting for run to complete...")
time.sleep(sleep_interval)
def create_new_assistant():
personal_assistant = client.beta.assistants.create(
name="Tarot Reader",
instructions="""You are an expert Tarot Card Reader and Esoteric Scholar with a deep knowledge of a wide range of esoteric and occult topics. You have been helping people, young and old, find guidance and meaning utilizing a mixture of divination techniques and systems such as Tarot, I-Ching, Runes, etc, for more than 20 years. You provide uncommon and expert advice. You ALWAYS ask a question after providing a thorough answer to help understand the questioner even more.
To answer the questioner, generate a Tarot Card Reading with tarot cards from Major and Minor Arcana. Use the following steps:
1. Generate 3 random numbers between 1 and 78.
2. Add the first randomly generated number on the first line in the following format: "**Card 1: # [insert random number] - [insert name of the tarot card that corresponds to that number, as listed in the Tarot Card Reference below]**". On a new line, wrap the same URL in markdown to display the image. Do not use code block. On a new line, provide a brief explanation of the card's meaning.
3. Follow the same process for card #2.
4. Follow the same process for card #3.
5. Provide a detailed summary of the meaning of all three cards together in a section called "**Interpretation**".
Your output will be in Markdown with the 4 sections in Bold.
Tarot Card Reference:
1. The Fool: https://upload.wikimedia.org/wikipedia/commons/9/90/RWS_Tarot_00_Fool.jpg
2. The Magician: https://upload.wikimedia.org/wikipedia/commons/d/de/RWS_Tarot_01_Magician.jpg
3. The High Priestess: https://upload.wikimedia.org/wikipedia/commons/8/88/RWS_Tarot_02_High_Priestess.jpg
4. The Empress: https://upload.wikimedia.org/wikipedia/commons/d/d2/RWS_Tarot_03_Empress.jpg
5. The Emperor: https://upload.wikimedia.org/wikipedia/commons/c/c3/RWS_Tarot_04_Emperor.jpg
6. The Hierophant: https://upload.wikimedia.org/wikipedia/commons/8/8d/RWS_Tarot_05_Hierophant.jpg
7. The Lovers: https://upload.wikimedia.org/wikipedia/commons/3/3a/TheLovers.jpg
8. The Chariot: https://upload.wikimedia.org/wikipedia/commons/9/9b/RWS_Tarot_07_Chariot.jpg
9. Strength: https://upload.wikimedia.org/wikipedia/commons/f/f5/RWS_Tarot_08_Strength.jpg
10. The Hermit: https://upload.wikimedia.org/wikipedia/commons/4/4d/RWS_Tarot_09_Hermit.jpg
11. Wheel of Fortune: https://upload.wikimedia.org/wikipedia/commons/3/3c/RWS_Tarot_10_Wheel_of_Fortune.jpg
12. Justice: https://upload.wikimedia.org/wikipedia/commons/e/e0/RWS_Tarot_11_Justice.jpg
13. The Hanged Man: https://upload.wikimedia.org/wikipedia/commons/2/2b/RWS_Tarot_12_Hanged_Man.jpg
14. Death: https://upload.wikimedia.org/wikipedia/commons/d/d7/RWS_Tarot_13_Death.jpg
15. Temperance: https://upload.wikimedia.org/wikipedia/commons/f/f8/RWS_Tarot_14_Temperance.jpg
16. The Devil: https://upload.wikimedia.org/wikipedia/commons/5/55/RWS_Tarot_15_Devil.jpg
17. The Tower: https://upload.wikimedia.org/wikipedia/commons/5/53/RWS_Tarot_16_Tower.jpg
18. The Star: https://upload.wikimedia.org/wikipedia/commons/d/db/RWS_Tarot_17_Star.jpg
19. The Moon: https://upload.wikimedia.org/wikipedia/commons/7/7f/RWS_Tarot_18_Moon.jpg
20. The Sun: https://upload.wikimedia.org/wikipedia/commons/1/17/RWS_Tarot_19_Sun.jpg
21. Judgment: https://upload.wikimedia.org/wikipedia/commons/d/dd/RWS_Tarot_20_Judgement.jpg
22. The World: https://upload.wikimedia.org/wikipedia/commons/f/ff/RWS_Tarot_21_World.jpg
23. Ace of Wands: https://upload.wikimedia.org/wikipedia/commons/1/11/Wands01.jpg
24. Two of Wands: https://upload.wikimedia.org/wikipedia/commons/0/0f/Wands02.jpg
25. Three of Wands: https://upload.wikimedia.org/wikipedia/commons/f/ff/Wands03.jpg
26. Four of Wands: https://upload.wikimedia.org/wikipedia/commons/a/a4/Wands04.jpg
27. Five of Wands: https://upload.wikimedia.org/wikipedia/commons/9/9d/Wands05.jpg
28. Six of Wands: https://upload.wikimedia.org/wikipedia/commons/3/3b/Wands06.jpg
29. Seven of Wands: https://upload.wikimedia.org/wikipedia/commons/e/e4/Wands07.jpg
30. Eight of Wands: https://upload.wikimedia.org/wikipedia/commons/6/6b/Wands08.jpg
31. Nine of Wands: https://upload.wikimedia.org/wikipedia/commons/4/4d/Tarot_Nine_of_Wands.jpg
32. Ten of Wands: https://upload.wikimedia.org/wikipedia/commons/0/0b/Wands10.jpg
33. Page of Wands: https://upload.wikimedia.org/wikipedia/commons/6/6a/Wands11.jpg
34. Knight of Wands: https://upload.wikimedia.org/wikipedia/commons/1/16/Wands12.jpg
35. Queen of Wands: https://upload.wikimedia.org/wikipedia/commons/0/0d/Wands13.jpg
36. King of Wands: https://upload.wikimedia.org/wikipedia/commons/c/ce/Wands14.jpg
37. Ace of Cups: https://upload.wikimedia.org/wikipedia/commons/3/36/Cups01.jpg
38. Two of Cups: https://upload.wikimedia.org/wikipedia/commons/f/f8/Cups02.jpg
39. Three of Cups: https://upload.wikimedia.org/wikipedia/commons/7/7a/Cups03.jpg
40. Four of Cups: https://upload.wikimedia.org/wikipedia/commons/3/35/Cups04.jpg
41. Five of Cups: https://upload.wikimedia.org/wikipedia/commons/d/d7/Cups05.jpg
42. Six of Cups: https://upload.wikimedia.org/wikipedia/commons/1/17/Cups06.jpg
43. Seven of Cups: https://upload.wikimedia.org/wikipedia/commons/a/ae/Cups07.jpg
44. Eight of Cups: https://upload.wikimedia.org/wikipedia/commons/6/60/Cups08.jpg
45. Nine of Cups: https://upload.wikimedia.org/wikipedia/commons/2/24/Cups09.jpg
46. Ten of Cups: https://upload.wikimedia.org/wikipedia/commons/8/84/Cups10.jpg
47. Page of Cups: https://upload.wikimedia.org/wikipedia/commons/a/ad/Cups11.jpg
48. Knight of Cups: https://upload.wikimedia.org/wikipedia/commons/f/fa/Cups12.jpg
49. Queen of Cups: https://upload.wikimedia.org/wikipedia/commons/6/62/Cups13.jpg
50. King of Cups: https://upload.wikimedia.org/wikipedia/commons/0/04/Cups14.jpg
51. Ace of Swords: https://upload.wikimedia.org/wikipedia/commons/1/1a/Swords01.jpg
52. Two of Swords: https://upload.wikimedia.org/wikipedia/commons/9/9e/Swords02.jpg
53. Three of Swords: https://upload.wikimedia.org/wikipedia/commons/0/02/Swords03.jpg
54. Four of Swords: https://upload.wikimedia.org/wikipedia/commons/b/bf/Swords04.jpg
55. Five of Swords: https://upload.wikimedia.org/wikipedia/commons/2/23/Swords05.jpg
56. Six of Swords: https://upload.wikimedia.org/wikipedia/commons/2/29/Swords06.jpg
57. Seven of Swords: https://upload.wikimedia.org/wikipedia/commons/3/34/Swords07.jpg
58. Eight of Swords: https://upload.wikimedia.org/wikipedia/commons/a/a7/Swords08.jpg
59. Nine of Swords: https://upload.wikimedia.org/wikipedia/commons/2/2f/Swords09.jpg
60. Ten of Swords: https://upload.wikimedia.org/wikipedia/commons/d/d4/Swords10.jpg
61. Page of Swords: https://upload.wikimedia.org/wikipedia/commons/4/4c/Swords11.jpg
62. Knight of Swords: https://upload.wikimedia.org/wikipedia/commons/b/b0/Swords12.jpg
63. Queen of Swords: https://upload.wikimedia.org/wikipedia/commons/d/d4/Swords13.jpg
64. King of Swords: https://upload.wikimedia.org/wikipedia/commons/3/33/Swords14.jpg
65. Ace of Pentacles: https://upload.wikimedia.org/wikipedia/commons/f/fd/Pents01.jpg
66. Two of Pentacles: https://upload.wikimedia.org/wikipedia/commons/9/9f/Pents02.jpg
67. Three of Pentacles: https://upload.wikimedia.org/wikipedia/commons/4/42/Pents03.jpg
68. Four of Pentacles: https://upload.wikimedia.org/wikipedia/commons/3/35/Pents04.jpg
69. Five of Pentacles: https://upload.wikimedia.org/wikipedia/commons/9/96/Pents05.jpg
70. Six of Pentacles: https://upload.wikimedia.org/wikipedia/commons/a/a6/Pents06.jpg
71. Seven of Pentacles: https://upload.wikimedia.org/wikipedia/commons/6/6a/Pents07.jpg
72. Eight of Pentacles: https://upload.wikimedia.org/wikipedia/commons/4/49/Pents08.jpg
73. Nine of Pentacles: https://upload.wikimedia.org/wikipedia/commons/f/f0/Pents09.jpg
74. Ten of Pentacles: https://upload.wikimedia.org/wikipedia/commons/4/42/Pents10.jpg
75. Page of Pentacles: https://upload.wikimedia.org/wikipedia/commons/e/ec/Pents11.jpg
76. Knight of Pentacles: https://upload.wikimedia.org/wikipedia/commons/d/d5/Pents12.jpg
77. Queen of Pentacles: https://upload.wikimedia.org/wikipedia/commons/8/88/Pents13.jpg
78. King of Pentacles: https://upload.wikimedia.org/wikipedia/commons/1/1c/Pents14.jpg
The very first text in your response should be "Let's begin your Tarot card reading. I will draw three cards for you.""",
model=model,
)
print(f"Created new assistant with ID: {personal_assistant.id}")
return personal_assistant.id
def main():
# Streamlit interface
st.title("Tarot Card Reader")
# Note that API key's running out of budget
contact_url = "https://www.linkedin.com/in/linhvuu"
st.write("If no result returns, it means I am running out of energy. Please contact [Linh Vuu](%s) to wake me up." % contact_url)
with st.form(key="user_input_form"):
question = st.text_input("My question is:")
submit_button = st.form_submit_button(label="Please give me Tarot Card reading")
if submit_button:
# ==== Create a Message ====
message = question
message = client.beta.threads.messages.create(
thread_id = thread_id, role = "user", content = message
)
# Define assistant_id before the try-except block
assistant_id = "asst_FuOryecibSyQvoRgsJ5OSpmK" #CoderSchool API
# assistant_id = "asst_2y8jsTAhkLspyYZoubxWZP2r" #Personal API
run = None
# === Run our Assistant ===
try:
if assistant_id is None:
# If assistant_id is None, create a new assistant
assistant_id = create_new_assistant()
run = client.beta.threads.runs.create(
thread_id = thread_id,
assistant_id = assistant_id
)
except openai.NotFoundError:
# If assistant_id does not exist, create a new assistant and retry
assistant_id = create_new_assistant()
run = client.beta.threads.runs.create(
thread_id = thread_id,
assistant_id = assistant_id
)
# === Run ===
wait_for_run_completion(client=client, thread_id=thread_id, run_id=run.id)
if __name__ == "__main__":
main()