File size: 5,214 Bytes
aa7d8c4
5eae7c2
cfa124c
 
 
5eae7c2
 
cfa124c
 
78a42dd
9064b67
8b11efa
 
a31fc9a
2a3fc7b
9064b67
206dbd0
8b11efa
 
 
 
 
e7c3210
5befa9c
50ddfc1
 
 
536b36d
e04bd50
5da2b8f
872c848
73899aa
872c848
42c9326
e893203
73899aa
9064b67
73899aa
9064b67
73899aa
9064b67
73899aa
 
7bf3f3d
536b36d
e7c3210
55b9732
c066ca5
a31fc9a
686539e
 
 
 
 
 
 
 
 
 
 
 
 
73899aa
a31fc9a
 
686539e
a31fc9a
 
73899aa
 
1b1181f
536b36d
3216382
c066ca5
536b36d
686539e
 
 
 
 
 
 
 
 
 
 
 
 
73899aa
536b36d
 
686539e
536b36d
 
73899aa
 
0150bec
9064b67
73899aa
9064b67
29d58d0
29028c0
7ddca6e
 
a2df0ee
19bfc9a
2de5e80
21ce7f1
1057e6a
5e0acb9
c40c2ce
d92a321
edd99e4
70bf8f7
10d6c27
aa7d8c4
 
536b36d
70bf8f7
4be439f
872c848
10d6c27
7fe3430
 
 
3f12f24
1292850
 
9247b68
1292850
da3afee
73899aa
70bf8f7
3f12f24
aa7d8c4
952a213
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
# TODO: Gradio session / multi-user thread

# Reference:
#
# https://vimeo.com/990334325/56b552bc7a
# https://platform.openai.com/playground/assistants
# https://cookbook.openai.com/examples/assistants_api_overview_python
# https://platform.openai.com/docs/api-reference/assistants/createAssistant
# https://platform.openai.com/docs/assistants/tools

import gradio as gr
#import pandas as pd
#import yfinance as yf

import json, openai, os, time

from assistants import openai_client, assistant, thread, create_assistant, load_assistant
#from datetime import date
#from openai import OpenAI
#from tavily import TavilyClient
#from typing import List
#from utils import function_to_schema, show_json

def chat(message, history):
    if not message:
        raise gr.Error("Message is required.")
    
    global assistant, thread     
    
    if assistant == None:
        #assistant = create_assistant(openai_client) # on first run, create assistant and update assistant_id
                                                     # see https://platform.openai.com/playground/assistants
        assistant = load_assistant(openai_client) # on subsequent runs, load assistant
    
    if thread == None or len(history) == 0:
        thread = create_thread(openai_client)
        
    create_message(openai_client, thread, message)

    run = create_run(openai_client, assistant, thread)

    run = wait_on_run(openai_client, thread, run)
    run_steps = get_run_steps(openai_client, thread, run)

    ### TODO
    tool_call_ids, tool_call_results = execute_tool_calls(run_steps)
    
    if len(tool_call_ids) > 0:
        # https://platform.openai.com/docs/api-reference/runs/submitToolOutputs
        tool_output = {}
        
        try:
            tool_output = {
                "tool_call_id": tool_call_ids[0],
                "output": tool_call_results[0].to_json()
            }
        except AttributeError:
            tool_output = {
                "tool_call_id": tool_call_ids[0],
                "output": tool_call_results[0]
            }
        
        run = openai_client.beta.threads.runs.submit_tool_outputs(
            thread_id=thread.id,
            run_id=run.id,
            tool_outputs=[tool_output]
        )
    
        run = wait_on_run(openai_client, thread, run)
        run_steps = get_run_steps(openai_client, thread, run)
    ###
        tool_call_ids, tool_call_results = execute_tool_calls(run_steps)
            
        if len(tool_call_ids) > 1:
            # https://platform.openai.com/docs/api-reference/runs/submitToolOutputs
            tool_output = {}
            
            try:
                tool_output = {
                    "tool_call_id": tool_call_ids[1],
                    "output": tool_call_results[1].to_json()
                }
            except AttributeError:
                tool_output = {
                    "tool_call_id": tool_call_ids[1],
                    "output": tool_call_results[1]
                }
            
            run = openai_client.beta.threads.runs.submit_tool_outputs(
                thread_id=thread.id,
                run_id=run.id,
                tool_outputs=[tool_output]
            )
        
            run = wait_on_run(openai_client, thread, run)
            run_steps = get_run_steps(openai_client, thread, run)    
    ###
    
    messages = get_messages(openai_client, thread)

    text_values, image_values = extract_content_values(messages)

    download_link = ""
    
    if len(image_values) > 0:
        download_link = f"<p>Download: https://platform.openai.com/storage/files/{image_values[0]}</p>"
    
    return f"{'<hr>'.join(list(reversed(text_values))[1:])}{download_link}"

gr.ChatInterface(
        fn=chat,
        chatbot=gr.Chatbot(height=350),
        textbox=gr.Textbox(placeholder="Ask anything", container=False, scale=7),
        title="Python Coding Assistant",
        description=(
            "The assistant can **generate, explain, fix, optimize,** and **document Python code, "
            "create unit test cases,** and **answer general coding-related questions.** "
            "It can also **execute code**. "
            "The assistant has access to a <b>today tool</b> (get current date), to a "
            "**yfinance download tool** (get stock data), and to a "
            "**tavily search tool** (web search)."
        ),
        clear_btn="Clear",
        retry_btn=None,
        undo_btn=None,
        examples=[
                  ["Generate: Python code to fine-tune model meta-llama/Meta-Llama-3.1-8B on dataset gretelai/synthetic_text_to_sql using QLoRA"],
                  ["Explain: r\"^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[\\W]).{8,}$\""],
                  ["Fix: x = [5, 2, 1, 3, 4]; print(x.sort())"],
                  ["Optimize: x = []; for i in range(0, 10000): x.append(i)"],
                  ["Execute: First 25 Fibbonaci numbers"],
                  ["Execute with tools: Create a plot showing stock gain QTD for NVDA and AMD, x-axis is \"Day\" and y-axis is \"Gain %\""],
                  ["Execute with tools: Get key announcements from the latest OpenAI Dev Day"]
                 ],
        cache_examples=False,
    ).launch()