Minstrel / showcases /generate.py
sci-m-wang's picture
Upload 15 files
74cb225 verified
import sys
import os
abs_path = os.getcwd()
sys.path.append(abs_path) # Adds higher directory to python modules path.
import streamlit as st
from modules.get_modules import get_modules
from modules.background import gen_background
from modules.command import gen_command
from modules.constraints import gen_constraints
from modules.goal import gen_goal
from modules.initialization import gen_initialization
from modules.output_format import gen_output_format
from modules.skills import gen_skills
from modules.suggestion import gen_suggestion
from modules.workflow import gen_workflow
module_name_dict = {
"background": "背景",
"command": "命令",
"suggesstion": "建议",
"goal": "目标",
"examples": "任务样例",
"constraints": "约束",
"workflow": "工作流程",
"output_format": "输出格式",
"skills": "技能",
"style": "风格",
"initialization": "初始化"
}
module_func_dict = {
"background": gen_background,
"command": gen_command,
"suggesstion": gen_suggestion,
"goal": gen_goal,
"examples": None,
"constraints": gen_constraints,
"workflow": gen_workflow,
"output_format": gen_output_format,
"skills": gen_skills,
"style": None,
"initialization": gen_initialization
}
## The page to generate the LangGPT prompt
def generate():
state = st.session_state
## A text input for the user to input the basic description of the task
col1, col2 = st.columns([8, 2])
with col1:
task = st.text_input("任务描述","撰写科幻小说",label_visibility="collapsed")
pass
## A button to analyze the task and generate the modules
with col2:
if st.button("分析任务",type="primary"):
## Get the modules
state.module_messages = [{"role": "user", "content": f"我希望LLM帮我执行的任务是:{task}"}]
state.modules = get_modules(state.generator, state.module_messages)
pass
with st.sidebar:
st.subheader("基本信息")
state.role_name = st.text_input("助手名称","",help="例如:大模型、助手等")
state.author = st.text_input("作者","LangGPT")
state.version = st.number_input("版本",min_value=0.1,value=0.1,step=0.1)
state.description = st.text_area("描述","这是一个LangGPT生成的助手",height=100)
st.subheader("模块控制")
if "modules" not in state:
state.modules = {
"background": False,
"command": False,
"suggesstion": False,
"goal": False,
"examples": False,
"constraints": False,
"workflow": False,
"output_format": False,
"skills": False,
"style": False,
"initialization": False
}
## Some toggles to show the modules
if "on_modules" not in state:
state.on_modules = {}
pass
for key in state.modules.keys():
if key in module_name_dict:
state.on_modules[key] = st.toggle(module_name_dict[key],state.modules[key])
pass
pass
pass
if "modules" in state:
if state.on_modules["examples"]:
st.subheader("请提供任务样例:")
input_area, output_area = st.columns(2)
with input_area:
input_example = st.text_area("样例输入","")
pass
with output_area:
output_example = st.text_area("样例输出","")
pass
state.examples = {
"input": input_example,
"output": output_example
}
pass
if state.on_modules["style"]:
st.subheader("请指定回复的风格:")
style = st.text_input("风格","",help="例如:正式、幽默、严肃等",label_visibility="collapsed")
state.style = style
pass
## A button to control the generation of the modules
for key in state.modules.keys():
if key in state:
if state.on_modules[key]:
with st.expander(module_name_dict[key]):
st.text_area(module_name_dict[key],state[key],label_visibility="collapsed")
pass
pass
g,c = st.columns([1,1])
with g:
generate_button = st.button("生成模块")
pass
with c:
compose_button = st.button("合成提示")
pass
if generate_button:
for key in state.modules.keys():
if key == "examples" or key == "style":
continue
else:
if state.on_modules[key]:
if key not in state:
state[key] = module_func_dict[key](state.generator,state.module_messages)
pass
pass
st.rerun()
pass
if compose_button:
if "prompt" not in state:
state.prompt = ""
pass
if state.role_name:
state.prompt += f"# Role: {state.role_name}\n"
pass
state.prompt += f"## profile\n"
if state.author:
state.prompt += f"- Author: {state.author}\n"
pass
if state.version:
state.prompt += f"- Version: {state.version}\n"
pass
if state.description:
state.prompt += f"- Description: {state.description}\n"
pass
## Check if all the checked modules are generated
for key in state.modules.keys():
if state.on_modules[key]:
if key not in state:
st.error(f"请先生成{module_name_dict[key]}")
return
else:
if key == "examples":
state.prompt += f"## {module_name_dict[key]}\n"
state.prompt += f"### 输入\n"
state.prompt += state.examples["input"]
state.prompt += "\n"
state.prompt += f"### 输出\n"
state.prompt += state.examples["output"]
state.prompt += "\n\n"
state.prompt += f"## {key}\n"
state.prompt += state[key]
state.prompt += "\n\n"
state.page = "test"
pass
st.rerun()