CoolFace
Apppublic

sagarnildass/Deep_Research_Assistant_Agent

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
deep_research.py139 linesDownload Raw Back to root
1# deep_research.py2 3import gradio as gr4from dotenv import load_dotenv5from clarifier_agent import clarifier_agent6from research_manager import ResearchManagerAgent7from agents import Runner8from collections import defaultdict9from datetime import datetime10import time11import logging12 13load_dotenv(override=True)14 15# --- Rate Limiter ---16class RateLimiter:17    # Rate limit to 2 requests per minute, 10 requests per day18    def __init__(self, max_requests=2, time_window=60, daily_quota=10):19        self.max_requests = max_requests20        self.time_window = time_window  # seconds21        self.request_history = defaultdict(list)22        self.daily_quota = daily_quota23        self.daily_counts = defaultdict(lambda: {'date': self._today(), 'count': 0})24 25    def _today(self):26        return datetime.utcnow().strftime('%Y-%m-%d')27 28    def is_rate_limited(self, user_id):29        now = time.time()30        self.request_history[user_id] = [31            t for t in self.request_history[user_id] if now - t < self.time_window32        ]33        if len(self.request_history[user_id]) >= self.max_requests:34            return True35        self.request_history[user_id].append(now)36        return False37 38    def is_quota_exceeded(self, user_id):39        today = self._today()40        user_quota = self.daily_counts[user_id]41        if user_quota['date'] != today:42            user_quota['date'] = today43            user_quota['count'] = 044        if user_quota['count'] >= self.daily_quota:45            return True46        user_quota['count'] += 147        self.daily_counts[user_id] = user_quota48        return False49 50rate_limiter = RateLimiter()51logger = logging.getLogger(__name__)52logger.setLevel(logging.DEBUG)53 54async def get_user_id(request: gr.Request = None):55    user_id = "default_user"56    if request is not None:57        try:58            forwarded = request.headers.get("X-Forwarded-For")59            if forwarded:60                user_id = forwarded.split(",")[0].strip()61            else:62                user_id = getattr(request.client, 'host', 'default_user')63        except Exception:64            pass65    logger.debug(f"[RateLimiter] user_id={user_id}")66    return user_id67 68# Step 1 — Generate clarifying questions69async def get_clarifying_questions(query, request: gr.Request = None):70    user_id = await get_user_id(request)71    if rate_limiter.is_rate_limited(user_id):72        return ["Rate limit exceeded. Please wait a minute."], "", "", ""73    if rate_limiter.is_quota_exceeded(user_id):74        return ["Daily quota exceeded. Try again tomorrow."], "", "", ""75 76    result = await Runner.run(clarifier_agent, input=query)77    return result.final_output.questions78 79# Step 2 — Run full research pipeline via coordinator agent (handoff style)80async def run_with_handoff(query, q1, q2, q3, a1, a2, a3, send_email_flag, recipient_email, request: gr.Request = None):81    user_id = await get_user_id(request)82    if rate_limiter.is_rate_limited(user_id):83        yield "Rate limit exceeded. Please wait a minute."84        return85    if rate_limiter.is_quota_exceeded(user_id):86        yield "You have reached your daily quota. Try again tomorrow."87        return88 89    questions = [q1, q2, q3]90    answers = [a1, a2, a3]91    async for chunk in ResearchManagerAgent().run(92        query,93        questions,94        answers,95        send_email_flag=send_email_flag,96        recipient_email=recipient_email,97    ):98        yield chunk99 100with gr.Blocks(theme=gr.themes.Default(primary_hue="sky")) as ui:101    gr.Markdown("# 🔍 Deep Research Agent (Clarify ➡️ Research ➡️ Email)")102 103    query = gr.Textbox(label="🔎 What would you like to research?")104 105    get_questions_btn = gr.Button("Generate Clarifying Questions", variant="primary")106 107    clar_q1 = gr.Textbox(label="Clarifying Question 1", interactive=False)108    clar_q2 = gr.Textbox(label="Clarifying Question 2", interactive=False)109    clar_q3 = gr.Textbox(label="Clarifying Question 3", interactive=False)110 111    answer_1 = gr.Textbox(label="Your Answer to Q1")112    answer_2 = gr.Textbox(label="Your Answer to Q2")113    answer_3 = gr.Textbox(label="Your Answer to Q3")114 115    send_email_checkbox = gr.Checkbox(label="📧 Send Report via Email?")116    email_box = gr.Textbox(label="Recipient Email", visible=False)117 118    # Show/hide email textbox based on checkbox119    send_email_checkbox.change(fn=lambda checked: gr.update(visible=checked), inputs=send_email_checkbox, outputs=email_box)120 121    submit_answers_btn = gr.Button("✅ Submit & Run Full Research")122    report = gr.Markdown(label="📄 Research Report")123 124    # Step 1125    get_questions_btn.click(126        fn=get_clarifying_questions,127        inputs=query,128        outputs=[clar_q1, clar_q2, clar_q3]129    ).then(lambda *_: "", outputs=report)130 131    # Step 2132    submit_answers_btn.click(133        fn=run_with_handoff,134        inputs=[query, clar_q1, clar_q2, clar_q3, answer_1, answer_2, answer_3, send_email_checkbox, email_box],135        outputs=report136    )137 138ui.launch(inbrowser=True)139