File size: 2,929 Bytes
aa0eed8
12338d7
031211a
aa0eed8
12c2b66
 
 
ee66ad7
d06678c
12c2b66
d06678c
5295650
12c2b66
273f79a
12c2b66
5295650
bd96781
12c2b66
 
a6aeefa
12c2b66
5295650
c2a459e
5295650
df144ba
 
 
453ee12
bd96781
df144ba
9ea93d2
453ee12
d06678c
df144ba
453ee12
 
12c2b66
24755bb
df144ba
38dfd80
 
 
 
df144ba
24755bb
3017744
719f157
df144ba
7fd13ba
a6aeefa
244f050
a6aeefa
 
 
719f157
a6aeefa
1ec4b78
0231016
 
273f79a
5bb778f
9ea93d2
 
244f050
a6aeefa
 
 
06d9591
bd96781
06d9591
12c2b66
4117a83
06d9591
 
4514b12
06cc452
bd96781
12c2b66
 
06d9591
 
df144ba
06d9591
4514b12
453ee12
bd96781
453ee12
4514b12
24755bb
12c2b66
aa0eed8
19797f3
 
 
976e692
8fae4d3
a985e86
19797f3
9ea93d2
976e692
19797f3
8fae4d3
19797f3
5d6c0c0
 
 
 
19797f3
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
import gradio as gr
import json, openai, os, time
from openai import OpenAI

_client = None
_assistant = None
_thread = None

def show_json(str, obj):
    print(f"===> {str}\n{json.loads(obj.model_dump_json())}")

def init_assistant():
    global _client, _assistant, _thread
    
    _client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
    
    _assistant = _client.beta.assistants.create(
        name="Math Tutor",
        instructions="You are a personal math tutor. Answer questions briefly, in a sentence or less.",
        model="gpt-4o-mini",
    )
    
    _thread = _client.beta.threads.create()

def wait_on_run(run):
    global _client, _thread
    
    while run.status == "queued" or run.status == "in_progress":
        run = _client.beta.threads.runs.retrieve(
            thread_id=_thread.id,
            run_id=run.id,
        )
        time.sleep(0.25)
    
    return run

def extract_content_values(data):
    content_values = []
    
    for item in data.data:
        for content in item.content:
            if content.type == 'text':
                content_values.append(content.text.value)
    
    return content_values

def chat(message, history):
    global _client, _assistant, _thread     
       
    #history_openai_format = []
    
    #for human, assistant in history:
    #    history_openai_format.append({"role": "user", "content": human})
    #    history_openai_format.append({"role": "assistant", "content":assistant})

    #history_openai_format.append({"role": "user", "content": message})

    #if len(history_openai_format) == 1:
    if _client == None:
        init_assistant()
    
    #show_json("assistant", _assistant)
    #show_json("thread", _thread)
    
    #print("### history")
    #print(len(history_openai_format))
    #print(history_openai_format)
    
    message = _client.beta.threads.messages.create(
        role="user",
        thread_id=_thread.id,
        content=message,
    )
    
    #show_json("message", message)
    
    run = _client.beta.threads.runs.create(
        assistant_id=_assistant.id,
        thread_id=_thread.id,
    )
    
    run = wait_on_run(run)
    
    show_json("run", run)

    messages = _client.beta.threads.messages.list(thread_id=_thread.id)
    
    show_json("messages", messages)

    return extract_content_values(messages)[0]

gr.ChatInterface(
    chat,
    chatbot=gr.Chatbot(height=300),
    textbox=gr.Textbox(placeholder="Ask Math Tutor any question", container=False, scale=7),
    title="Math Tutor",
    description="Question",
    theme="soft",
    examples=["I need to solve the equation '3x + 13 = 11'. Can you help me?"],
    cache_examples=False,
    retry_btn=None,
    undo_btn=None,
    clear_btn="Clear",
    #multimodal=True,
    #additional_inputs=[
    #    gr.Textbox("You are a personal math tutor. Answer questions briefly, in a sentence or less.", label="System Prompt"),
    #],
).launch()