Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| from fastapi import HTTPException | |
| from src.similarity_model import find_similar_projects | |
| from src.similarity_model import extract_features | |
| def analyze_project( | |
| title: str, | |
| description: str, | |
| abstract: str = "", | |
| features=None, | |
| top_k: int = 5 | |
| ): | |
| if features is None: | |
| features = [] | |
| full_text = f"{title}. {abstract}. {description}" | |
| auto_features = extract_features(full_text) | |
| merged = [] | |
| seen = set() | |
| for item in features + auto_features: | |
| val = str(item).strip().lower() | |
| if val and val not in seen: | |
| seen.add(val) | |
| merged.append(val) | |
| results = find_similar_projects( | |
| title=title, | |
| description=f"{abstract} {description}", | |
| features=merged, | |
| top_k=top_k | |
| ) | |
| if not isinstance(results, pd.DataFrame) or len(results) == 0: | |
| return { | |
| "message": "No similar projects found", | |
| "extracted_features": merged, | |
| "overall_originality_score": 100.0 | |
| } | |
| # ----------------------------------- | |
| # رجع Top K كله | |
| # ----------------------------------- | |
| top_projects = [] | |
| for _, row in results.iterrows(): | |
| orig_score = round(float(row.get("originality_score", 0)), 2) | |
| sim_percent = round(float(row.get("hybrid_score", 0)) * 100, 2) | |
| top_projects.append({ | |
| "project_title": row.get("project_title", ""), | |
| "project_features": row.get("candidate_features", []), | |
| "matched_features": row.get("matched_features", []), | |
| "unique_features": row.get("unique_candidate_features", []), | |
| "similarity_score": sim_percent, | |
| "final_originality_score": orig_score | |
| }) | |
| # Overall = worst-case originality (against the most similar project) | |
| overall_originality_score = top_projects[0]["final_originality_score"] | |
| return { | |
| "extracted_features": merged, | |
| "overall_originality_score": overall_originality_score, | |
| "top_similar_projects": top_projects | |
| } | |
| def chat_with_llm(user_id: str, message: str): | |
| try: | |
| from src.recommendation_engine.chatbot_engine import chatbot | |
| from src.recommendation_engine.llm_client import LLMProviderError | |
| except Exception as exc: | |
| raise HTTPException( | |
| status_code=503, | |
| detail=f"LLM service could not start: {exc}" | |
| ) | |
| try: | |
| response = chatbot( | |
| user_id=user_id, | |
| user_input=message | |
| ) | |
| except LLMProviderError as exc: | |
| raise HTTPException( | |
| status_code=exc.status_code, | |
| detail=exc.message | |
| ) | |
| return { | |
| "user_id": user_id, | |
| "response": response | |
| } | |