from src.recommendation_engine.llm_client import generate_text from src.recommendation_engine.prompt_builder import ( build_full_project_prompt ) import re def extract_section(text, section_name): text = text.strip() marker = section_name + ":" if marker not in text: return "" start = text.find(marker) + len(marker) sections = [ "CATEGORY:", "ABSTRACT:", "DESCRIPTION:", "TECHNOLOGIES:", "KEYWORDS:", "PROBLEM_STATEMENT:", "PROPOSED_SOLUTION:", "OBJECTIVES:", "AI_SUMMARY:", "FUTURE_WORK:", "METHODOLOGY:" ] end = len(text) for s in sections: if s == marker: continue pos = text.find(s, start) if pos != -1 and pos < end: end = pos return text[start:end].strip() def parse_bullets(text): lines = text.splitlines() final = [] for line in lines: line = line.strip() if not line: continue line = re.sub( r"^[-•*0-9.\)\s]+", "", line ) if line: final.append(line) return final def generate_full_project( title, features, description="", abstract="", custom_description=False, custom_abstract=False ): context = { "project_title": title, "features": features, "description": description, "abstract": abstract } prompt = build_full_project_prompt(context) raw = generate_text( prompt, task="full_project" ) result = { "project_title": title, "category": extract_section(raw, "CATEGORY"), "abstract": abstract if custom_abstract else extract_section(raw, "ABSTRACT"), "description": description if custom_description else extract_section(raw, "DESCRIPTION"), "technologies": parse_bullets( extract_section(raw, "TECHNOLOGIES") ), "keywords": parse_bullets( extract_section(raw, "KEYWORDS") ), "objectives": parse_bullets( extract_section(raw, "OBJECTIVES") ), "future_work": parse_bullets( extract_section(raw, "FUTURE_WORK") ), "problem_statement": extract_section( raw, "PROBLEM_STATEMENT" ), "proposed_solution": extract_section( raw, "PROPOSED_SOLUTION" ), "methodology": extract_section( raw, "METHODOLOGY" ), "ai_summary": extract_section( raw, "AI_SUMMARY" ) } if not result.get("category"): result["category"] = "General AI System" if not result.get("keywords"): result["keywords"] = [ "Artificial Intelligence", "Automation", "Smart System" ] if not result.get("problem_statement"): result["problem_statement"] = ( "Current traditional systems suffer from " "limited automation, inefficiency, and " "lack of intelligent decision-making." ) if not result.get("proposed_solution"): result["proposed_solution"] = ( "The proposed system uses AI-driven " "automation and intelligent analytics " "to improve operational efficiency." ) if not result.get("objectives"): result["objectives"] = [ "Improve automation efficiency", "Enhance system accuracy", "Reduce operational costs" ] if not result.get("methodology"): result["methodology"] = ( "The system will be developed using " "data collection, preprocessing, " "AI model training, testing, and deployment." ) if not result.get("future_work"): result["future_work"] = [ "Cloud integration", "Mobile application support", "Advanced AI optimization" ] if not result.get("ai_summary"): result["ai_summary"] = ( f"{title} is an intelligent AI-powered " f"graduation project designed to provide " f"automation, monitoring, and predictive analysis." ) return result def rewrite_custom_sections(features, abstract="", description=""): features_text = "\n".join(f"- {f}" for f in features) prompt = f""" The user provided custom text for their project's abstract and/or description. Your task is to update their custom text to incorporate the following NEW FEATURES. CRITICAL RULES: 1. You MUST preserve the exact tone, style, and core phrasing of the user's original text! 2. Just weave the new features in naturally. 3. EXPAND the content significantly to ensure it is highly detailed. 4. The rewritten ABSTRACT MUST contain a minimum of 130 words. 5. The rewritten DESCRIPTION MUST contain a minimum of 160 words. NEW FEATURES: {features_text} CUSTOM ABSTRACT: {abstract if abstract else "N/A"} CUSTOM DESCRIPTION: {description if description else "N/A"} OUTPUT FORMAT: ABSTRACT: (your rewritten abstract here, or leave empty if N/A) DESCRIPTION: (your rewritten description here, or leave empty if N/A) """.strip() raw = generate_text(prompt, task="chat") return { "abstract": extract_section(raw, "ABSTRACT") if abstract else "", "description": extract_section(raw, "DESCRIPTION") if description else "" }