| from typing import Dict, Any, List |
|
|
| def normalize(text: str) -> str: |
| return str(text).strip().lower() |
|
|
| def merge_lists(old: List[str], new: List[str]) -> List[str]: |
|
|
| seen = set() |
|
|
| result = [] |
|
|
| for item in (old or []) + (new or []): |
|
|
| if not item: |
| continue |
|
|
| key = normalize(item) |
|
|
| if key not in seen: |
|
|
| seen.add(key) |
|
|
| result.append(str(item).strip()) |
|
|
| return result |
|
|
| def update_state( |
| state: Dict[str, Any], |
| new_data: Dict[str, Any], |
| mode: str = "merge" |
| ) -> Dict[str, Any]: |
|
|
| for key, value in new_data.items(): |
|
|
| if key in ["user_input", "intent"]: |
| continue |
|
|
| if value is None or value == "": |
| continue |
|
|
| |
| |
| |
| if key in [ |
| "ideas", |
| "project_title", |
| "description", |
| "abstract", |
| "category", |
| "problem_statement", |
| "proposed_solution", |
| "methodology", |
| "ai_summary" |
| ]: |
|
|
| state[key] = value |
| continue |
|
|
| |
| |
| |
| if key == "features": |
|
|
| if mode == "replace": |
| state[key] = value |
| else: |
| state[key] = merge_lists( |
| state.get(key, []), |
| value |
| ) |
|
|
| continue |
|
|
| |
| |
| |
| if isinstance(value, list): |
|
|
| if mode == "replace": |
|
|
| state[key] = value |
|
|
| else: |
|
|
| state[key] = merge_lists( |
| state.get(key, []), |
| value |
| ) |
|
|
| continue |
|
|
| |
| |
| |
| if isinstance(value, str): |
|
|
| clean_val = value.strip() |
|
|
| old_val = str( |
| state.get(key, "") |
| ).strip() |
|
|
| if ( |
| mode == "replace" |
| or clean_val not in old_val |
| ): |
| state[key] = ( |
| f"{old_val}\n{clean_val}" |
| ).strip() |
|
|
| continue |
|
|
| |
| |
| |
| state[key] = value |
|
|
| return state |
|
|
| def reset_for_new_idea( |
| state: Dict[str, Any] |
| ) -> Dict[str, Any]: |
|
|
| return { |
|
|
| "domain": state.get("domain"), |
|
|
| "ideas": [], |
|
|
| "project_title": "", |
|
|
| "features": [], |
|
|
| "description": "", |
|
|
| "abstract": "", |
|
|
| "technologies": [], |
|
|
| "keywords": [], |
|
|
| "category": "", |
|
|
| "problem_statement": "", |
|
|
| "proposed_solution": "", |
|
|
| "objectives": [], |
|
|
| "future_work": [], |
|
|
| "methodology": "", |
|
|
| "ai_summary": "", |
|
|
| "originality_score": None, |
|
|
| "context_strength": None |
| } |
|
|
| def reset_features_only( |
| state: Dict[str, Any] |
| ) -> Dict[str, Any]: |
|
|
| state["features"] = [] |
|
|
| state["description"] = "" |
|
|
| return state |
|
|