Spaces:
Runtime error
Runtime error
import os.path | |
import shutil | |
import sys | |
import traceback | |
import gradio as gr | |
import json | |
import random | |
import time | |
import uuid | |
import pandas as pd | |
from conversation import Conversation | |
from cache.oss import init_dir, init_oss, upload_oss_file, get_download_link | |
from cache.cache import data_cache | |
from prompt_engineering.prompts import * | |
from kernel import CodeKernel | |
import yaml | |
# from config import conv_model, streaming | |
import atexit | |
import signal | |
class app(): | |
def __init__(self, config_path='config.yaml'): | |
print("Load config: ", config_path) | |
self.config = yaml.load(open(config_path, 'r'), Loader=yaml.FullLoader) | |
self.conv = Conversation(self.config) | |
self.conv.programmer.messages = [ | |
{ | |
"role": "system", | |
"content": SYSTEM_PROMPT | |
} | |
] | |
def open_board(self): | |
return self.conv.show_data() | |
def cache_file(self,file): | |
try: | |
self.oss_file_dir, self.local_cache_dir = init_dir(self.config['cache_dir']) | |
init_oss(self.config['oss_endpoint'], self.config['oss_access_key_id'], self.config['oss_access_secret'], self.config['oss_bucket_name'], self.config['expired_time']) | |
self.conv.oss_dir, self.conv.local_cache_dir = self.oss_file_dir, self.local_cache_dir | |
file_info = upload_oss_file(self.oss_file_dir, file) | |
local_file_path = os.path.join(self.local_cache_dir, file_info['file_name']) | |
shutil.copy2(file, local_file_path) | |
self.conv.add_data(file) | |
gen_info = self.conv.my_data_cache.get_description() | |
self.conv.programmer.messages[0]["content"] = (PROGRAMMER_PROMPT.format(working_path=self.local_cache_dir) + | |
f"\nNow, user uploads the datasets in {local_file_path}\n, and here is the general information of the dataset:\n {gen_info}") | |
if self.conv.retrieval: | |
self.conv.programmer.messages[0]["content"] += KNOWLEDGE_INTEGRATION_SYSTEM | |
print(self.conv.programmer.messages[0]["content"]) | |
# self.conv.run(function_lib) | |
# self.conv.messages.append({"role": "assistant", "content": response}) | |
# chat_history.append((message, response)) | |
except Exception as e: | |
traceback.print_exc() | |
print(f"Uploaded file error: {e}") | |
# def show_data(self): | |
# return self.conv.show_data() | |
def rendering_code(self): | |
return self.conv.rendering_code() | |
# def report_test(self): | |
# with open("/Users/stephensun/Desktop/pypro/dsagent_ci/cache/conv_cache/2c23cf4b-31a8-4aeb-8689-13b9fbdfb7fc-2024-04-29/programmer_msg.json", "r") as f: | |
# msg = json.load(f) | |
# print(msg) | |
# self.conv.programmer.messages = msg | |
# down_path = self.conv.document_generation() | |
# return [gr.Button(visible=False), gr.DownloadButton(label=f"Download Report", value=down_path, visible=True)] | |
def generate_report(self): | |
down_path = self.conv.document_generation() | |
return [gr.Button(visible=False), gr.DownloadButton(label=f"Download Report", value=down_path, visible=True)] | |
def export_code(self): | |
down_path = self.conv.export_code() | |
return [gr.Button(visible=False), gr.DownloadButton(label=f"Download Notebook", value=down_path, visible=True)] | |
def down_report(self): | |
return [gr.Button(visible=True), gr.DownloadButton(visible=False)] | |
def down_notebook(self): | |
return [gr.Button(visible=True), gr.DownloadButton(visible=False)] | |
# def human_loop(self, code): | |
# result = self.conv.run_workflow(code) | |
# self.conv.programmer.messages.append({"role": "assistant", "content": response}) | |
# return response | |
def call_llm(self, message, chat_history, code=None): | |
''' | |
:param message: input of user | |
:param chat_history: the history of whole dialogue. But this variable was only used to show in the UI (not record in LLM) | |
:return: chat_history in the Chatbot component | |
''' | |
if not code: | |
self.conv.programmer.messages.append({"role": "user", "content": message}) | |
else: | |
message = code | |
response = self.conv.run_workflow(function_lib=None,code=code) | |
chat_history.append((message, response)) | |
self.conv.chat_history = chat_history | |
# chat_history = self.conv.messages | |
# print(chat_history) | |
return "", chat_history # return "" to let msg box be clear | |
# def load_chat_history(self): | |
# # filtered_messages = [msg for msg in self.conv.programmer.messages if isinstance(msg, dict) and msg.get("role") in ["user", "assistant"]] | |
# # # [{"role": "user", "content": "qqq"},{"role": "assistant", "content": "aaa"}] | |
# # chat_history = [(filtered_messages[i].get('content'), filtered_messages[i + 1].get('content')) for i in range(0, len(filtered_messages), 2)] | |
# return self.conv.chat_history | |
def save_dialogue(self, chat_history): | |
self.conv.save_conv() | |
with open(os.path.join(self.local_cache_dir,'system_dialogue.json'), 'w') as f: | |
json.dump(chat_history, f, indent=4) | |
f.close() | |
print(f"Dialogue saved in {os.path.join(self.local_cache_dir,'system_dialogue.json')}.") | |
def load_dialogue(self, json_file): | |
with open(json_file, 'r') as f: | |
chat_history = json.load(f) | |
f.close() | |
self.conv.chat_history = chat_history | |
return chat_history | |
def clear_all(self, message, chat_history): | |
self.conv.clear() | |
return "", [] | |
my_app = app() | |
with gr.Blocks(theme=gr.themes.Soft(), css='front_end/css.css', js='front_end/javascript.js') as demo: | |
# get history for chatbot. | |
#history = my_app.load_dialogue("system_dialogue.json") # load history in previous conversation by indicate system_dialogue.json | |
chatbot = gr.Chatbot(value=my_app.conv.chat_history, height=600, label="LAMBDA", avatar_images=["front_end/user.jpg", "front_end/lambda.jpg"], show_copy_button=True) | |
with gr.Group(): | |
with gr.Row(): | |
upload_btn = gr.UploadButton(label="Upload Data", file_types=["csv", "xlsx"], scale=1) | |
# datasets = gr.File(file_types=["csv", "xlsx"], elem_id="file_upload",height=80) | |
msg = gr.Textbox(show_label=False, placeholder="Sent message to LLM", scale=6) | |
submit = gr.Button("Submit", scale=1) | |
with gr.Row(): | |
board = gr.Button(value="Show/Update DataFrame", elem_id="df_btn", elem_classes="df_btn") | |
export_notebook = gr.Button(value="Notebook") | |
down_notebook = gr.DownloadButton("Download Notebook", visible=False) | |
generate_report = gr.Button(value="Generate Report") | |
down_report = gr.DownloadButton("Download Report",visible=False) | |
edit = gr.Button(value="Edit Code",elem_id="ed_btn", elem_classes="ed_btn") | |
save = gr.Button(value="Save Dialogue") | |
clear = gr.ClearButton(value="Clear All") | |
with gr.Group(): | |
with gr.Row(visible=False, elem_id="ed",elem_classes="ed"): | |
code = gr.Code(label="Code",scale=6) | |
code_btn = gr.Button("Submit Code",scale=1) | |
code_btn.click(fn=my_app.call_llm, inputs=[msg, chatbot, code], outputs=[msg, chatbot]) | |
df = gr.Dataframe(visible=False,elem_id="df",elem_classes="df") | |
upload_btn.upload(fn=my_app.cache_file, inputs=upload_btn) | |
if my_app.config['streaming']: | |
def chat_streaming(message, chat_history, code=None): | |
if not code: | |
my_app.conv.programmer.messages.append({"role": "user", "content": message}) | |
else: | |
message = code | |
#my_app.conv.stream_workflow(function_lib=None, code=code) | |
return "", chat_history + [[message, None]] | |
msg.submit(chat_streaming, [msg, chatbot], [msg, chatbot], queue=False).then( | |
my_app.conv.stream_workflow, chatbot, chatbot | |
) | |
submit.click(chat_streaming, [msg, chatbot], [msg, chatbot], queue=False).then( | |
my_app.conv.stream_workflow, chatbot, chatbot | |
) | |
else: | |
msg.submit(my_app.call_llm, [msg, chatbot], [msg, chatbot]) | |
submit.click(my_app.call_llm, [msg, chatbot], [msg, chatbot]) | |
board.click(my_app.open_board, inputs=[], outputs=df) | |
edit.click(my_app.rendering_code, inputs=None, outputs=code) | |
export_notebook.click(my_app.export_code, inputs=None, outputs=[export_notebook, down_notebook]) | |
down_notebook.click(my_app.down_notebook, inputs=None, outputs=[export_notebook, down_notebook]) | |
generate_report.click(my_app.generate_report,inputs=None,outputs=[generate_report,down_report]) | |
down_report.click(my_app.down_report,inputs=None,outputs=[generate_report,down_report]) | |
save.click(my_app.save_dialogue, inputs=chatbot) | |
clear.click(fn=my_app.clear_all, inputs=[msg, chatbot], outputs=[msg, chatbot]) | |
#demo.load(fn=my_app.load_chat_history, inputs=None, outputs=chatbot) | |
if __name__ == '__main__': | |
demo.launch(server_name="0.0.0.0",server_port=8000, debug=True, share=True) | |