File size: 1,638 Bytes
325b94c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 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 "", []