# app/core/crew_config.py import litellm from crewai import Crew, Process # ====== LITELLM GLOBAL CONFIG ====== litellm.num_retries = 4 litellm.retry_policy = { "TimeoutError": 4, "APIError": 3, "OpenRouterException": 3, "Exception": 2, } litellm.request_timeout = 120 litellm.drop_params = True # # ====== IMPORT AGENT + TASK ====== # from agents.content_phase import ( # course_writer_agent, # course_writer_task, # ) # انت عندك دول جاهزين # # ====== CACHED CREW (يُستخدم في أي مكان) ====== # agent = course_writer_agent() # task = course_writer_task(agent) # cached_crew = Crew( # agents=[agent], # tasks=[task], # process=Process.sequential, # memory=False, # verbose=False, # ) # ====== SAFE RUN WRAPPER ====== import json import time def safe_run_cached(inputs, cached_crew, retries: int = 4): """ يلف حوالين cached_crew.kickoff ويحاول يعمل JSON parsing كذا مرة ويرجع (generated_content, sources) """ for attempt in range(1, retries + 1): result = cached_crew.kickoff(inputs=inputs) try: # لو result.raw موجود بنفس الشكل اللي كنت بتستخدمه raw = json.loads(result.raw) return raw.get("generated_content", ""), raw.get("sources", []) except Exception: print(f"❌ JSON Error attempt {attempt}") # تطبع أول جزء من الرد عشان الديبج print(str(result)[:300]) time.sleep(0.7) return "", []