46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
from typing import Union
|
|
|
|
import gradio as gr
|
|
import yaml
|
|
from theflow.utils.modules import import_dotted_string
|
|
|
|
from ..themes import John
|
|
from .chat import build_chat_ui
|
|
from .pipeline import build_pipeline_ui
|
|
|
|
|
|
def build_from_dict(config: Union[str, dict]):
|
|
"""Build a full UI from YAML config file"""
|
|
|
|
if isinstance(config, str):
|
|
with open(config) as f:
|
|
config_dict: dict = yaml.safe_load(f)
|
|
elif isinstance(config, dict):
|
|
config_dict = config
|
|
else:
|
|
raise ValueError(
|
|
f"config must be either a yaml path or a dict, got {type(config)}"
|
|
)
|
|
|
|
demos = []
|
|
for key, value in config_dict.items():
|
|
pipeline_def = import_dotted_string(key, safe=False)
|
|
if value["ui-type"] == "chat":
|
|
demos.append(build_chat_ui(value, pipeline_def).queue())
|
|
else:
|
|
demos.append(build_pipeline_ui(value, pipeline_def).queue())
|
|
if len(demos) == 1:
|
|
demo = demos[0]
|
|
else:
|
|
demo = gr.TabbedInterface(
|
|
demos,
|
|
tab_names=list(config_dict.keys()),
|
|
title="PromptUI from kotaemon",
|
|
analytics_enabled=False,
|
|
theme=John(),
|
|
)
|
|
|
|
demo.queue()
|
|
|
|
return demo
|