import ast import streamlit as st from .locale import _ from .sidebar_components import get_sidebar_header, get_sidebar_supported_fields, get_help_us_improve, get_language_select def generate_sidebar(): get_language_select() get_sidebar_header() st.sidebar.markdown( _("SciPIP will generate ideas step by step. The generation pipeline is the same as " "one-click generation, while you can improve each part manually after SciPIP providing the manuscript.") ) DONE_COLOR = "black" UNDONE_COLOR = "gray" # INPROGRESS_COLOR = "#4d9ee6" INPROGRESS_COLOR = "black" color_list = [] pipeline_list = [_("1. Input Background"), _("2. Brainstorming"), _("3. Extracting Entities"), _("4. Retrieving Related Works"), _("5. Generating Initial Ideas"), _("6. Generating Final Ideas")] for i in range(1, 8): if st.session_state["global_state_step"] < i: color_list.append(UNDONE_COLOR) elif st.session_state["global_state_step"] == i: color_list.append(INPROGRESS_COLOR) elif st.session_state["global_state_step"] > i: color_list.append(DONE_COLOR) st.sidebar.header(_("Pipeline"), divider="red") for i in range(6): st.sidebar.markdown(f"{pipeline_list[i]}", unsafe_allow_html=True) # if st.session_state["global_state_step"] == i + 1: # st.sidebar.progress(50, text=None) get_sidebar_supported_fields() get_help_us_improve() def get_textarea_height(text_content): if text_content is None: return 100 lines = text_content.split("\n") count = len(lines) for line in lines: count += len(line) // 96 return max(count * 23 + 20, 100) # 23 is a magic number def generate_mainpage(backend): st.title(_("Step-by-step Generation")) st.header(_("Background")) with st.form('background_form') as bg_form: background = st.session_state.get("background", "") background = st.text_area("Input your field background", background, placeholder="Input your field background", height=200, label_visibility="collapsed") cols = st.columns(4) def click_demo_i(i): st.session_state["background"] = backend.get_demo_i(i) for i, col in enumerate(cols): col.form_submit_button(_("Example") + f" {i+1}", use_container_width=True, on_click=click_demo_i, args=(i,)) col1, col2 = st.columns([2, 20]) submitted = col1.form_submit_button(_("Submit"), type="primary") if submitted: st.session_state["global_state_step"] = 2.0 with st.spinner(text="Let me first brainstorm some ideas..."): st.session_state["entities_bg"] = backend.background2entities_callback(background) st.session_state["expanded_background"] = backend.background2expandedbackground_callback( background, st.session_state["entities_bg"] ) st.session_state["brainstorms"] = backend.background2brainstorm_callback( st.session_state["expanded_background"] ) # st.session_state["brainstorms"] = "Test text" st.session_state["brainstorms_expand"] = True st.session_state["global_state_step"] = 2.5 ## Brainstorms if st.session_state["global_state_step"] >= 2.5: st.header(_("Brainstorms")) with st.expander("", expanded=st.session_state.get("brainstorms_expand", False)): # st.write("
") col1, col2 = st.columns(2) widget_height = get_textarea_height(st.session_state.get("brainstorms", "")) brainstorms = col1.text_area(label="brainstorms", value=st.session_state.get("brainstorms", ""), label_visibility="collapsed", height=widget_height) st.session_state["brainstorms"] = brainstorms if brainstorms: col2.markdown(f"{brainstorms}") else: col2.markdown(_("Please input the brainstorms on the left.")) # st.write("
") col1, col2 = st.columns([2, 20]) submitted = col1.button(_("Submit"), type="primary") if submitted: st.session_state["global_state_step"] = 3.0 with st.spinner(text="I'am extracting keywords in the background and brainstorming ideas"): st.session_state["entities"] = backend.brainstorm2entities_callback(brainstorms, st.session_state["entities_bg"]) # st.session_state["entities"] = "entities" st.session_state["global_state_step"] = 3.5 st.session_state["entities_expand"] = True ## Entities if st.session_state["global_state_step"] >= 3.5: st.header(_("Extracted Entities")) with st.expander("", expanded=st.session_state.get("entities_expand", False)): ## pills def update_entities(): return ori_entities = st.session_state.get("entities", []) entities_updated = st.session_state.get("entities_updated", ori_entities) entities_updated = st.pills(label="entities", options=ori_entities, selection_mode="multi", default=ori_entities, label_visibility="collapsed", on_change=update_entities) st.session_state["entities_updated"] = entities_updated submitted = st.button(_("Submit"), key="entities_button", type="primary") if submitted: st.session_state["global_state_step"] = 4.0 with st.spinner(text="I am retrieving related works for more ideas..."): st.session_state["related_works"], st.session_state["related_works_intact"] = \ backend.entities2literature_callback(st.session_state["expanded_background"], entities_updated) st.session_state["related_works_use_state"] = [True] * len(st.session_state["related_works"]) st.session_state["global_state_step"] = 4.5 st.session_state["related_works_expand"] = True ## Retrieved related works if st.session_state["global_state_step"] >= 4.5: st.header(_("Retrieved Related Works")) with st.expander("", expanded=st.session_state.get("related_works_expand", False)): related_works = st.session_state.get("related_works", []) for i, rw in enumerate(related_works): checked = st.checkbox(rw, value=st.session_state.get("related_works_use_state")[i]) st.session_state.get("related_works_use_state")[i] = checked submitted = st.button(_("Submit"), key="related_works_button", type="primary") if submitted: st.session_state["global_state_step"] = 5.0 with st.spinner(text="I am generating final ideas..."): st.session_state["selected_related_works_intact"] = [] for s, p in zip(st.session_state.get("related_works_use_state"), st.session_state["related_works_intact"]): if s: st.session_state["selected_related_works_intact"].append(p) res = backend.literature2initial_ideas_callback(background, brainstorms, st.session_state["selected_related_works_intact"]) st.session_state["initial_ideas"] = res[0] st.session_state["final_ideas"] = res[1] # st.session_state["initial_ideas"] = "initial ideas" st.session_state["global_state_step"] = 5.5 st.session_state["initial_ideas_expand"] = True ## Initial ideas if st.session_state["global_state_step"] >= 5.5: st.header(_("Generated Ideas")) with st.expander("", expanded=st.session_state.get("initial_ideas_expand", False)): for initial_idea, final_idea in zip(st.session_state.get("initial_ideas", ""), st.session_state.get("final_ideas", "")): st.divider() st.markdown("### Concise Idea") st.markdown(initial_idea) st.markdown("### Idea in Detail") st.markdown(final_idea) st.divider() def step_by_step_generation(backend): ## Pipeline global state # 1.0: Input background is in progress # 2.0: Brainstorming is in progress # 2.5 Brainstorming is finished # 3.0: Extracting entities is in progress # 3.5 Extracting entities is finished # 4.0: Retrieving literature is in progress # 4.5 Retrieving ideas is finished # 5.0: Generating initial ideas is in progress # 5.5 Generating initial ideas is finished # 6.0: Generating final ideas is in progress # 6.5 Generating final ideas is finished if "global_state_step" not in st.session_state: st.session_state["global_state_step"] = 1.0 # backend = button_interface.Backend() generate_mainpage(backend) generate_sidebar()