Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| from shared import path_manager | |
| import modules.async_worker as worker | |
| from pathlib import Path | |
| import json | |
| def create_chat(): | |
| def llama_get_assistants(): | |
| names = [] | |
| folder_path = Path("chatbots") | |
| for path in folder_path.rglob("*"): | |
| if path.is_dir(): | |
| try: | |
| with open(path / "info.json" , "r", encoding='utf-8') as f: | |
| info = json.load(f) | |
| names.append((info["name"], str(path))) | |
| except Exception as e: | |
| print(f"ERROR: in {path}: {e}") | |
| pass | |
| names.sort(key=lambda x: x[0].casefold()) | |
| return names | |
| def gr_llama_get_assistants(): | |
| return { | |
| llama_assistants: gr.update( | |
| choices=llama_get_assistants(), | |
| ) | |
| } | |
| def _llama_select_assistant(dropdown): | |
| folder = Path(dropdown) | |
| try: | |
| with open(folder / "info.json", "r", encoding='utf-8') as f: | |
| info = json.load(f) | |
| if "avatar" not in info: | |
| info["avatar"] = folder / "avatar.png" | |
| if "embed" in info: | |
| info["embed"] = json.dumps(info["embed"]) | |
| else: | |
| info["embed"] = json.dumps([]) | |
| except Exception as e: | |
| print(f"ERROR: {dropdown}: {e}") | |
| info = { | |
| "name": "Error", | |
| "greeting": "Error!", | |
| "avatar": "html/error.png", | |
| "system": "Everything is broken.", | |
| "embed": json.dumps([]), | |
| } | |
| pass | |
| info["chatstart"] = [{"role": "assistant", "content": info["greeting"]}] | |
| return info | |
| def llama_select_assistant(dropdown): | |
| info = _llama_select_assistant(dropdown) | |
| return { | |
| llama_chat: gr.update(value=info["chatstart"]), | |
| llama_msg: gr.update(value=""), | |
| llama_avatar: gr.update( | |
| value=info["avatar"], | |
| label=info["name"], | |
| ), | |
| llama_system: gr.update(value=info["system"]), | |
| llama_embed: gr.update(value=info["embed"]) | |
| } | |
| with gr.Blocks() as app_llama_chat: | |
| with gr.Row(): | |
| with gr.Column(scale=3), gr.Group(): | |
| # FIXME!!! start value should be read from some info.json | |
| default_bot = "chatbots/rf_support_troll" | |
| llama_chat = gr.Chatbot( | |
| label="", | |
| show_label=False, | |
| height=600, | |
| type="messages", | |
| allow_tags=["think", "thinking"], | |
| value=_llama_select_assistant(default_bot)["chatstart"], | |
| ) | |
| llama_msg = gr.Textbox( | |
| show_label=False, | |
| ) | |
| llama_sent = gr.Textbox(visible=False) | |
| with gr.Column(scale=2), gr.Group(): | |
| llama_avatar = gr.Image( | |
| value=_llama_select_assistant(default_bot)["avatar"], | |
| label=_llama_select_assistant(default_bot)["name"], | |
| height=400, | |
| width=400, | |
| show_label=True, | |
| ) | |
| with gr.Row(): | |
| llama_assistants = gr.Dropdown( | |
| choices=llama_get_assistants(), | |
| value=_llama_select_assistant(default_bot)["name"], | |
| show_label=False, | |
| interactive=True, | |
| scale=7, | |
| ) | |
| llama_reload = gr.Button( | |
| value="↻", | |
| scale=1, | |
| ) | |
| llama_system = gr.Textbox( | |
| visible=False, | |
| value=_llama_select_assistant(default_bot)["system"], | |
| ) | |
| llama_embed = gr.Textbox( | |
| visible=False, | |
| value=_llama_select_assistant(default_bot)["embed"], | |
| ) | |
| def llama_get_text(message): | |
| return "", message | |
| def llama_respond(message, system, embed, chat_history): | |
| chat_history.append({"role": "user", "content": message}) | |
| gen_data = { | |
| "task_type": "llama", | |
| "system": system, | |
| "embed": embed, | |
| "history": chat_history, | |
| } | |
| # Add work | |
| task_id = worker.add_task(gen_data.copy()) | |
| # Wait for result | |
| finished = False | |
| while not finished: | |
| flag, product = worker.task_result(task_id) | |
| if flag == "preview": | |
| yield product | |
| elif flag == "results": | |
| finished = True | |
| chat_history.append({"role": "assistant", "content": product}) | |
| yield chat_history | |
| llama_msg.submit( | |
| llama_get_text, | |
| [llama_msg], | |
| [llama_msg, llama_sent] | |
| ).then( | |
| llama_respond, | |
| [llama_sent, llama_system, llama_embed, llama_chat], | |
| [llama_chat] | |
| ) | |
| llama_assistants.select(llama_select_assistant, [llama_assistants], [llama_chat, llama_msg, llama_avatar, llama_system, llama_embed]) | |
| llama_reload.click(gr_llama_get_assistants, None, [llama_assistants]) | |
| return app_llama_chat | |