okr/proposer.py

121 lines
4.9 KiB
Python

import streamlit as st
from api import fetch_okrs
from config import SYSTEM_PROMPT, INPUT_TEMPLATE, PROMPT_TEMPLATE
from utils import construct_prompt, extract_llm_response
def proposer_page():
# Streamlit App Layout
st.title("AO/PM OKR Proposer")
# Input Section and Buttons Row
st.subheader("Enter your idea or goal:")
user_input = st.text_area(
"Input your idea here:",
value=st.session_state.get("user_input", INPUT_TEMPLATE.strip()),
height=300,
)
print("user_input:", user_input)
generate_okrs_clicked = st.button("Generate OKR Proposal")
#col1, col2 = st.columns([1, 1])
#with col1:
# if st.button("Reset All"):
# st.session_state.clear()
#with col2:
if generate_okrs_clicked:
if not user_input.strip():
st.warning("Please provide some input before generating OKRs.")
else:
#user_input = st.session_state.get("user_input")
with st.spinner("Generating OKRs..."):
# Construct prompt and call API
#prompt = construct_prompt(prompt_template=PROMPT_TEMPLATE, user_input=user_input)
response = fetch_okrs(user_input=user_input)
#print("user_input:", user_input)
if response:
# Extract Objective and Key Results from response
print(response)
objective, key_results, hint = extract_llm_response(response)
st.session_state["objective"] = objective
st.session_state["key_results"] = key_results
st.session_state["hint"] = hint
#st.subheader("Hint to improve the OKR proposal")
#st.text(hint)
# Display Results Only if an OKR Has Been Generated
if "objective" in st.session_state and "key_results" in st.session_state:
# Display Objective Field with Responsibles Input Below It
st.subheader("Proposal Objective:")
objective_text = st.text_area(
"Proposal Objective:",
value=st.session_state.get("objective", ""),
height=100,
)
responsible_for_objective = st.text_input(
"Responsibles for Objective (comma-separated):",
value="",
placeholder="e.g., Khanh Dinh, John Doe",
key="responsibles_objective"
)
# Display Key Results with Responsibles Below Each One
st.subheader("Proposal Key Results:")
key_result_boxes = []
responsibles_for_key_results = []
for i, kr in enumerate(st.session_state["key_results"], start=1):
kr_text = st.text_area(f"Key Result {i}:", value=kr, key=f"kr_{i}")
responsible_for_kr = st.text_input(
f"Responsibles for Key Result {i} (comma-separated):",
value="",
placeholder="e.g., Khanh Dinh",
key=f"responsibles_kr_{i}"
)
key_result_boxes.append(kr_text)
responsibles_for_key_results.append(responsible_for_kr)
# Finalize Button Center-Aligned
#finalize_col = st.columns([3, 2, 3])[1]
#with finalize_col:
if st.button("Finalize"):
finalized_objective = objective_text.strip()
finalized_key_results = [st.session_state[f"kr_{i+1}"].strip() for i in range(len(key_result_boxes))]
# Append initials of responsibles to Objective and Key Results
responsibles_list_objective = [name.strip() for name in responsible_for_objective.split(",") if name.strip()]
initials_objective = [f"[{''.join([part[0] for part in name.split()]).upper()}]" for name in responsibles_list_objective]
initials_str_objective = ", ".join(initials_objective)
finalized_objective = f"{initials_str_objective} {finalized_objective}"
finalized_key_results_with_initials = []
for i, kr in enumerate(finalized_key_results):
responsibles_list_kr = [name.strip() for name in responsibles_for_key_results[i].split(",") if name.strip()]
initials_kr = [f"{''.join([part[0] for part in name.split()]).upper()}" for name in responsibles_list_kr]
initials_str_kr = ", ".join(initials_kr)
finalized_key_results_with_initials.append(f"KR{i+1}: [{initials_str_kr}] {kr}")
# Display finalized data in non-editable format (full width)
st.subheader("Finalized Objective:")
st.code(
body=finalized_objective,
language=None,
wrap_lines=True
)
st.subheader("Finalized Key Results:")
for kr in finalized_key_results_with_initials:
st.code(
body=kr,
language=None,
wrap_lines=True
)