Spaces:
Running
Running
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() |