import os from crewai import Crew, Process import json from typing import Dict, Any from fastapi import APIRouter, HTTPException, Depends from fastapi.responses import HTMLResponse from agents.content_phase import ( query_agent, query_task, course_writer_agent, course_writer_task, ) import app from core import generate_course_content from core.content_converter_service import convert_dict_to_html from modules import ( llm, inputs, ) from tools import scrape_course, SerperExhaustedError,CURRENT_SERPER_INDEX from schemas import ( CourseWithQueries, CourseContent, ) router = APIRouter(prefix="/content", tags=["Content Generation"]) # ------------------------------------ # === Agent 7:Training Generator === # ------------------------------------ @router.post("/keyword_generation") def run_keywords(outlines: CourseContent): agent = query_agent() task = query_task(agent) keywords_crew = Crew( agents=[agent], tasks=[task], process=Process.sequential, ) result = keywords_crew.kickoff(inputs={"course": outlines.dict()}) print(result.json_dict) return {"message": "Keywords Generated Well 🚀", "result": result} # @router.post("/scrape") # def scrape_endpoint(course:CourseWithQueries): # try: # # نحول Pydantic model لـ dict بنفس الشكل اللي الفانكشن مستنياها # course_dict = course.dict() # summary, raw = scrape_course(course_dict) # return { # "message": "Queries Searched and Scraped Well 🚀", # "summary": summary, # "raw": raw, # } # return {"message": "Queries Searched and Scraped Well 🚀", "summary": summary, "raw": raw} # except Exception as e: # # في البروداكشن خليه logging و متطلعش الرسالة الخام للعميل # raise HTTPException(status_code=500, detail=str(e)) @router.post("/scrape") def scrape_endpoint(course: CourseWithQueries): try: course_dict = course.dict() summary, raw = scrape_course(course_dict) return { "message": "Queries Searched and Scraped Well 🚀", "serper_api_used_index": CURRENT_SERPER_INDEX, "summary": summary, "raw": raw, } except SerperExhaustedError as e: raise HTTPException(status_code=500, detail=f"{str(e)}") except Exception as e: raise HTTPException(status_code=500, detail=f"Unexpected error: {str(e)}") @router.post("/content_generation") def run_content_generation(course_data: Dict): # نحول لـ dict ونبعتها للـ service course_dict = course_data result = generate_course_content(course_dict) return {"message": "Content Generated Well 🚀", "result": result} @router.post("/convert_course", response_class=HTMLResponse) def convert_to_html(course_data: Dict[str, Any]): """ تحويل بيانات المقرر الدراسي من Dictionary إلى HTML Args: course_data: Dictionary يحتوي على بيانات المقرر الدراسي - course_name: اسم المقرر - course_audience: الجمهور المستهدف - results: قائمة الوحدات Returns: HTML string كامل جاهز للعرض """ try: # التحقق من وجود البيانات الأساسية if not course_data: raise HTTPException(status_code=400, detail="لا توجد بيانات مرسلة") # تحويل Dictionary إلى HTML html_content = convert_dict_to_html(course_data) return HTMLResponse(content=html_content) except Exception as e: raise HTTPException(status_code=500, detail=f"خطأ في التحويل: {str(e)}")