Skip to content

Commit 344d42b

Browse files
authored
Merge pull request #31 from HKUDS/feat/user-requirements-analysis
feat: add user requirements analysis feature
2 parents 1a47447 + a4b5ca7 commit 344d42b

File tree

5 files changed

+533
-1
lines changed

5 files changed

+533
-1
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ __pycache__/
1111
.venv/
1212
env/
1313
venv/
14-
*.env*
14+
*.env
1515
.env_example
1616

1717

prompts/code_prompts.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
- PAPER_ALGORITHM_ANALYSIS_PROMPT: 专注算法提取,明确实现优先级
1414
- PAPER_CONCEPT_ANALYSIS_PROMPT: 专注系统架构,突出概念到代码的映射
1515
- CODE_PLANNING_PROMPT: 整合前两者输出,生成高质量复现计划
16+
17+
NEW: 用户需求分析相关提示词
18+
- REQUIREMENT_QUESTION_GENERATION_PROMPT: 基于初始需求生成引导性问题
19+
- REQUIREMENT_SUMMARY_PROMPT: 基于问答生成详细需求文档
1620
"""
1721

1822
# Paper to Code Workflow Prompts
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
"""
2+
User requirement analysis related prompt templates
3+
4+
Contains prompt templates for requirement analysis Agent, supporting question generation and requirement summarization functions.
5+
"""
6+
7+
# ========================================
8+
# User requirement analysis related prompt templates
9+
# ========================================
10+
11+
REQUIREMENT_QUESTION_GENERATION_PROMPT = """You are a professional requirement analysis expert, skilled at helping users refine project requirements through precise questions.
12+
13+
Please generate 1-3 precise guiding questions based on user's initial requirement description to help users provide more detailed information.
14+
15+
User Initial Requirements:
16+
{user_input}
17+
18+
Please generate a JSON format question list, each question contains the following fields:
19+
- category: Question category (such as "Functional Requirements", "Technology Selection", "Performance Requirements", "User Interface", "Deployment Environment", etc.)
20+
- question: Specific question content
21+
- importance: Importance level ("High", "Medium", "Low")
22+
- hint: Question hint or example (optional)
23+
24+
Requirements:
25+
1. Questions should be highly targeted, based on user's specific requirement scenarios
26+
2. Cover key decision points for project implementation
27+
3. Avoid overly technical questions, maintain user-friendliness
28+
4. Questions should have logical correlation
29+
5. Ensure questions help users think about important details they might have missed
30+
31+
Please return JSON format results directly, without including other text descriptions."""
32+
33+
REQUIREMENT_SUMMARY_PROMPT = """You are a professional technical requirement analyst, skilled at converting user requirement descriptions into detailed technical specification documents.
34+
35+
Please generate a detailed project requirement document based on user's initial requirements and supplementary responses.
36+
37+
User Initial Requirements:
38+
{initial_input}
39+
40+
User Supplementary Responses:
41+
{answers_text}
42+
43+
Please generate a concise requirement document focusing on the following core sections:
44+
45+
## Project Overview
46+
Brief description of project's core goals and value proposition
47+
48+
## Functional Requirements
49+
Detailed list of required features and functional modules:
50+
- Core functionalities
51+
- User interactions and workflows
52+
- Data processing requirements
53+
- Integration needs
54+
55+
## Technical Architecture
56+
Recommended technical design including:
57+
- Technology stack and frameworks
58+
- System architecture design
59+
- Database and data storage solutions
60+
- API design considerations
61+
- Security requirements
62+
63+
## Performance & Scalability
64+
- Expected user scale and performance requirements
65+
- Scalability considerations and constraints
66+
67+
Requirements:
68+
1. Focus on what needs to be built and how to build it technically
69+
2. Be concise but comprehensive - avoid unnecessary implementation details
70+
3. Provide clear functional specifications and technical architecture guidance
71+
4. Consider project feasibility and technical complexity"""

ui/handlers.py

Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,199 @@ def background_progress_callback(progress: int, message: str):
882882
}
883883

884884

885+
async def handle_requirement_analysis_workflow(
886+
user_input: str,
887+
analysis_mode: str,
888+
user_answers: Dict[str, str] = None
889+
) -> Dict[str, Any]:
890+
"""
891+
Handle requirement analysis workflow
892+
893+
Args:
894+
user_input: User initial requirements
895+
analysis_mode: Analysis mode ("generate_questions" or "summarize_requirements")
896+
user_answers: User answer dictionary
897+
898+
Returns:
899+
Processing result dictionary
900+
"""
901+
try:
902+
# Import required modules
903+
from workflows.agent_orchestration_engine import execute_requirement_analysis_workflow
904+
905+
# Create progress callback function
906+
def update_progress(progress: int, message: str):
907+
# Display progress in Streamlit
908+
st.session_state.current_progress = progress
909+
st.session_state.current_message = message
910+
911+
# Execute requirement analysis workflow
912+
result = await execute_requirement_analysis_workflow(
913+
user_input=user_input,
914+
analysis_mode=analysis_mode,
915+
user_answers=user_answers,
916+
logger=None, # Can pass in logger
917+
progress_callback=update_progress
918+
)
919+
920+
return result
921+
922+
except Exception as e:
923+
return {
924+
"status": "error",
925+
"error": str(e),
926+
"message": f"Requirement analysis workflow execution failed: {str(e)}"
927+
}
928+
929+
930+
async def handle_requirement_modification_workflow(
931+
current_requirements: str,
932+
modification_feedback: str
933+
) -> Dict[str, Any]:
934+
"""
935+
Handle requirement modification workflow
936+
937+
Args:
938+
current_requirements: Current requirement document content
939+
modification_feedback: User's modification requests and feedback
940+
941+
Returns:
942+
Processing result dictionary
943+
"""
944+
try:
945+
# Import required modules
946+
from workflows.agents.requirement_analysis_agent import RequirementAnalysisAgent
947+
from utils.llm_utils import get_preferred_llm_class
948+
949+
# Create progress callback function
950+
def update_progress(progress: int, message: str):
951+
# Display progress in Streamlit
952+
st.session_state.current_progress = progress
953+
st.session_state.current_message = message
954+
955+
update_progress(10, "🔧 Initializing requirement modification agent...")
956+
957+
# Initialize RequirementAnalysisAgent
958+
agent = RequirementAnalysisAgent()
959+
960+
# Initialize agent (LLM is initialized internally)
961+
await agent.initialize()
962+
963+
update_progress(50, "✏️ Modifying requirements based on your feedback...")
964+
965+
# Modify requirements
966+
result = await agent.modify_requirements(
967+
current_requirements=current_requirements,
968+
modification_feedback=modification_feedback
969+
)
970+
971+
# Cleanup
972+
await agent.cleanup()
973+
974+
update_progress(100, "✅ Requirements modification completed!")
975+
976+
return {
977+
"status": "success",
978+
"result": result,
979+
"message": "Requirements modification completed successfully"
980+
}
981+
982+
except Exception as e:
983+
return {
984+
"status": "error",
985+
"error": str(e),
986+
"message": f"Requirements modification workflow execution failed: {str(e)}"
987+
}
988+
989+
990+
def handle_guided_mode_processing():
991+
"""Handle asynchronous processing for guided mode"""
992+
# Check if questions need to be generated
993+
if st.session_state.get("questions_generating", False):
994+
st.session_state.questions_generating = False
995+
996+
# Asynchronously generate questions
997+
initial_req = st.session_state.get("initial_requirement", "")
998+
if initial_req:
999+
try:
1000+
# Use asynchronous processing to generate questions
1001+
result = run_async_task_simple(
1002+
handle_requirement_analysis_workflow(
1003+
user_input=initial_req,
1004+
analysis_mode="generate_questions"
1005+
)
1006+
)
1007+
1008+
if result["status"] == "success":
1009+
# Parse JSON result
1010+
import json
1011+
questions = json.loads(result["result"])
1012+
st.session_state.generated_questions = questions
1013+
else:
1014+
st.error(f"Question generation failed: {result.get('error', 'Unknown error')}")
1015+
1016+
except Exception as e:
1017+
st.error(f"Question generation exception: {str(e)}")
1018+
1019+
# Check if detailed requirements need to be generated
1020+
if st.session_state.get("requirements_generating", False):
1021+
st.session_state.requirements_generating = False
1022+
1023+
# Asynchronously generate detailed requirements
1024+
initial_req = st.session_state.get("initial_requirement", "")
1025+
user_answers = st.session_state.get("user_answers", {})
1026+
1027+
if initial_req:
1028+
try:
1029+
# Use asynchronous processing to generate requirement summary
1030+
result = run_async_task_simple(
1031+
handle_requirement_analysis_workflow(
1032+
user_input=initial_req,
1033+
analysis_mode="summarize_requirements",
1034+
user_answers=user_answers
1035+
)
1036+
)
1037+
1038+
if result["status"] == "success":
1039+
st.session_state.detailed_requirements = result["result"]
1040+
else:
1041+
st.error(f"Requirement summary generation failed: {result.get('error', 'Unknown error')}")
1042+
1043+
except Exception as e:
1044+
st.error(f"Requirement summary generation exception: {str(e)}")
1045+
1046+
# Check if requirements need to be edited
1047+
if st.session_state.get("requirements_editing", False):
1048+
st.session_state.requirements_editing = False
1049+
st.info("🔧 Starting requirement modification process...")
1050+
1051+
# Asynchronously modify requirements based on user feedback
1052+
current_requirements = st.session_state.get("detailed_requirements", "")
1053+
edit_feedback = st.session_state.get("edit_feedback", "")
1054+
1055+
if current_requirements and edit_feedback:
1056+
try:
1057+
# Use asynchronous processing to modify requirements
1058+
result = run_async_task_simple(
1059+
handle_requirement_modification_workflow(
1060+
current_requirements=current_requirements,
1061+
modification_feedback=edit_feedback
1062+
)
1063+
)
1064+
1065+
if result["status"] == "success":
1066+
st.session_state.detailed_requirements = result["result"]
1067+
st.session_state.requirement_analysis_step = "summary"
1068+
st.session_state.edit_feedback = ""
1069+
st.success("✅ Requirements updated successfully!")
1070+
st.rerun()
1071+
else:
1072+
st.error(f"Requirements modification failed: {result.get('error', 'Unknown error')}")
1073+
1074+
except Exception as e:
1075+
st.error(f"Requirements modification exception: {str(e)}")
1076+
1077+
8851078
def handle_start_processing_button(input_source: str, input_type: str):
8861079
"""
8871080
Handle start processing button click - synchronous execution
@@ -1034,6 +1227,30 @@ def initialize_session_state():
10341227
st.session_state.enable_indexing = (
10351228
False # Default enable indexing functionality
10361229
)
1230+
1231+
# Requirement analysis related states
1232+
if "requirement_analysis_mode" not in st.session_state:
1233+
st.session_state.requirement_analysis_mode = "direct" # direct/guided
1234+
if "requirement_analysis_step" not in st.session_state:
1235+
st.session_state.requirement_analysis_step = "input" # input/questions/summary
1236+
if "generated_questions" not in st.session_state:
1237+
st.session_state.generated_questions = []
1238+
if "user_answers" not in st.session_state:
1239+
st.session_state.user_answers = {}
1240+
if "detailed_requirements" not in st.session_state:
1241+
st.session_state.detailed_requirements = ""
1242+
if "initial_requirement" not in st.session_state:
1243+
st.session_state.initial_requirement = ""
1244+
if "questions_generating" not in st.session_state:
1245+
st.session_state.questions_generating = False
1246+
if "requirements_generating" not in st.session_state:
1247+
st.session_state.requirements_generating = False
1248+
if "requirements_confirmed" not in st.session_state:
1249+
st.session_state.requirements_confirmed = False
1250+
if "edit_feedback" not in st.session_state:
1251+
st.session_state.edit_feedback = ""
1252+
if "requirements_editing" not in st.session_state:
1253+
st.session_state.requirements_editing = False
10371254

10381255
# Requirement analysis related states
10391256
if "requirement_analysis_mode" not in st.session_state:

0 commit comments

Comments
 (0)