Graduation_Project-v1.2 / src /recommendation_engine /full_project_generator.py
bat-6's picture
feat: implement full project generation engine and LLM router for conversational state management
c2a8167
Raw
History Blame Contribute Delete
5.88 kB
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 ""
}