File size: 14,082 Bytes
ceef703
 
 
 
04f2e53
ceef703
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
04f2e53
ceef703
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
04f2e53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ceef703
 
04f2e53
ceef703
ccde8dd
 
04f2e53
 
ceef703
04f2e53
ceef703
04f2e53
ceef703
 
 
 
 
 
04f2e53
ceef703
 
04f2e53
20e4d5b
 
04f2e53
 
ceef703
04f2e53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ceef703
 
 
 
 
04f2e53
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
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()