import shutil import gradio as gr import json import time from conversation import Conversation from prompt_engineering.prompts import * import yaml from utils.utils import * import sys import os class LAMBDA: def __init__(self, config_path='config.yaml'): ensure_config_file("config.yaml") print("Try to load config: ", config_path) if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'): bundle_dir = os.path.dirname(sys.executable) else: bundle_dir = os.path.dirname(os.path.abspath(__file__)) config_path = os.path.join(bundle_dir, config_path) with open(config_path, 'r') as f: self.config = yaml.load(f, Loader=yaml.FullLoader) if self.config["load_chat"] == True: self.load_dialogue(self.config["chat_history_path"]) else: self.session_cache_path = self.init_local_cache_path(to_absolute_path(self.config["project_cache_path"])) self.config["session_cache_path"] = self.session_cache_path print("Session cache path: ", self.session_cache_path) self.conv = Conversation(self.config) self.conv.programmer.messages = [ { "role": "system", "content": PROGRAMMER_PROMPT.format(working_path=self.session_cache_path) } ] if self.conv.retrieval: self.conv.programmer.messages[0]["content"] += KNOWLEDGE_INTEGRATION_SYSTEM def init_local_cache_path(self, project_cache_path): current_fold = time.strftime('%Y-%m-%d', time.localtime()) hsid = str(hash(id(self))) # new_uuid = str(uuid.uuid4()) session_cache_path = os.path.join(project_cache_path, current_fold + '-' + hsid) if not os.path.exists(session_cache_path): os.makedirs(session_cache_path) return session_cache_path def open_board(self): return self.conv.show_data() def add_file(self, files): file_path = files.name shutil.copy(file_path, self.session_cache_path) filename = os.path.basename(file_path) file_extension = os.path.splitext(file_path)[1].lower() self.conv.file_list.append(filename) local_cache_path = os.path.join(self.session_cache_path, filename) if file_extension in ['.xlsx', '.xls']: self.conv.add_data(file_path) gen_info = self.conv.my_data_cache.get_description() self.conv.programmer.messages[0][ "content"] += f"\nNow, user uploads the data in {local_cache_path}\n, and here is the general information of the dataset:\n {gen_info}. \nYou should care about the missing values and type of each column in your later processing." else: self.conv.programmer.messages[0][ "content"] += f"\nNow, user uploads the files in {local_cache_path}." print(f"Upload file in gradio path: {file_path}, local cache path: {local_cache_path}") def rendering_code(self): return self.conv.rendering_code() def generate_report(self, chat_history): down_path = self.conv.document_generation(chat_history) 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 chat_streaming(self, message, chat_history, code=None): if not code: self.conv.programmer.messages.append({"role": "user", "content": message}) else: message = code return "", chat_history + [[message, None]] def save_dialogue(self, chat_history): self.conv.save_conv() with open(os.path.join(self.session_cache_path, 'system_dialogue.json'), 'w') as f: json.dump(chat_history, f, indent=4) print(f"Dialogue saved in {os.path.join(self.session_cache_path, 'system_dialogue.json')}.") def load_dialogue(self, dialogue_path): try: system_dialogue_path = os.path.join(dialogue_path, 'system_dialogue.json') system_config_path = os.path.join(dialogue_path, 'config.json') with open(system_dialogue_path, 'r') as f: chat_history = json.load(f) with open(system_config_path, 'r') as f: sys_config = json.load(f) self.session_cache_path = sys_config["session_cache_path"] self.config["session_cache_path"] = self.session_cache_path self.config["chat_history_display"] = chat_history self.config["figure_list"] = sys_config["figure_list"] return chat_history except Exception as e: print(f"Failed to load the chat history: {e}") return [] def clear_all(self, message, chat_history): self.conv.clear() return "", [] def update_config(self, conv_model, programmer_model, inspector_model, api_key, base_url_conv_model, base_url_programmer, base_url_inspector, max_attempts, max_exe_time, load_chat, chat_history_path): self.conv.update_config(conv_model=conv_model, programmer_model=programmer_model, inspector_model=inspector_model, api_key=api_key, base_url_conv_model=base_url_conv_model, base_url_programmer=base_url_programmer, base_url_inspector=base_url_inspector, max_attempts=max_attempts, max_exe_time=max_exe_time) if load_chat == True: self.config['chat_history_path'] = chat_history_path chat_history = self.load_dialogue(chat_history_path) self.config['load_chat'] = load_chat return ["### Config Updated!", chat_history] return "### Config Updated!", []