File size: 3,719 Bytes
26bc264
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13c2a05
26bc264
 
 
13c2a05
 
 
 
 
 
26bc264
 
 
 
 
 
 
22f6e93
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
from prompts import *
from langchain.agents.initialize import initialize_agent
from langchain.chains.conversation.memory import ConversationBufferMemory
from langchain.llms.openai import OpenAI
import gradio as gr
import re
from tools import bar_tool, line_tool, pie_tool, scatter_tool
import os


class ConversationBot:
    def __init__(self):
        self.tools = [line_tool, bar_tool, pie_tool, scatter_tool]
        print(f"All the Available Tools: {self.tools}")
        self.memory = ConversationBufferMemory(memory_key="chat_history", output_key='output')

    def init_agent(self, lang, openai_api_key):
        self.memory.clear()  # clear previous history
        if lang == 'English':
            PREFIX, FORMAT_INSTRUCTIONS, SUFFIX = CHARTGPT_PREFIX, CHARTGPT_FORMAT_INSTRUCTIONS, CHARTGPT_SUFFIX
            place = "Enter text and press enter"
            label_clear = "Clear"
        else:
            PREFIX, FORMAT_INSTRUCTIONS, SUFFIX = CHARTGPT_PREFIX_CN, CHARTGPT_FORMAT_INSTRUCTIONS_CN, CHARTGPT_SUFFIX_CN
            place = "输入文字并回车"
            label_clear = "清除"
        os.environ["OPENAI_API_KEY"] = openai_api_key
        self.llm = OpenAI()
        self.agent = initialize_agent(
            self.tools,
            self.llm,
            agent="conversational-react-description",
            verbose=True,
            memory=self.memory,
            return_intermediate_steps=True,
            agent_kwargs={'prefix': PREFIX, 'format_instructions': FORMAT_INSTRUCTIONS,
                          'suffix': SUFFIX}, )
        print("init bot finished!")
        return gr.update(visible=True), gr.update(visible=False), gr.update(placeholder=place), gr.update(
            value=label_clear)

    def run_text(self, text, state):
        print(self.agent.memory)
        res = self.agent({"input": text.strip()})
        print("res:", res)
        res['output'] = res['output'].replace("\\", "/")
        response = re.sub('(image/[-\w]*.png)', lambda m: f'![](file={m.group(0)})*{m.group(0)}*', res['output'])
        state = state + [(text, response)]
        print(f"\nProcessed run_text, Input text: {text}\nCurrent state: {state}\n")
        return state, state


if __name__ == '__main__':
    bot = ConversationBot()
    with gr.Blocks(css="#chatbot .overflow-y-auto{height:500px}") as demo:
        openai_api_key = gr.Text(label="OPENAI_API_KEY")
        lang = gr.Radio(choices=['Chinese', 'English'], value=None, label='Language')
        chatbot = gr.Chatbot(elem_id="chatbot", label="ChartGPT")
        state = gr.State([])
        with gr.Row(visible=False) as input_raws:
            with gr.Column(scale=0.7):
                txt = gr.Textbox(show_label=False, placeholder="Enter text and press enter").style(
                    container=False)
            with gr.Column(scale=0.15, min_width=0):
                clear = gr.Button("Clear")
            gr.Examples(
                ['Visualize [2,4,5,6,10,100,120,200,135,50,10] as a line chart',
                 '将[2,4,5,6,10,20,100]可视化为柱状图',
                 '将[2,4,5,6,10,100,120,200,135,50,10]可视化为折线图',
                 '''将下面的数据可视化为饼图['A', 'B', 'C', 'D', 'E'][25, 20, 15, 10, 30]''',
                 '''将下面的数据可视化为散点图x = [1, 2, 3, 4, 5]y = [5, 4, 3, 2, 1]'''], txt)

        lang.change(bot.init_agent, [lang, openai_api_key], [input_raws, lang, txt, clear])
        txt.submit(bot.run_text, [txt, state], [chatbot, state])
        txt.submit(lambda: "", None, txt)
        clear.click(bot.memory.clear)
        clear.click(lambda: [], None, chatbot)
        clear.click(lambda: [], None, state)
    demo.launch()