| # import os | |
| # from tavily import TavilyClient | |
| # from crewai.tools import tool | |
| # from modules import TRUSTED_SITES | |
| # search_tool = TavilyClient(api_key=os.environ["TAVILY_API_KEY"]) | |
| # def is_recent(result, min_year=2021): | |
| # """Validate result date is >= min_year if available.""" | |
| # pub_date = result.get("published_date") | |
| # if not pub_date: | |
| # return False # skip if no date | |
| # try: | |
| # year = int(pub_date.split("-")[0]) | |
| # return year >= min_year | |
| # except Exception: | |
| # return False | |
| # @tool | |
| # def search_engine_tool(query: str): | |
| # """Execute a focused web search for the given query. | |
| # - Prioritize **scholarly resources** (academic papers, books, journals, trusted educational sites). | |
| # - Filters results to only those published/updated >= 2021. | |
| # - Include **Arabic sources** when contextually relevant, but prioritize **English academic sources**. | |
| # - Retrieve only **diverse and high-quality** results (avoid spam, low-quality blogs, or purely commercial pages). | |
| # - For each result, ensure useful metadata is returned: | |
| # * url | |
| # * title | |
| # * short content/summary | |
| # * relevance score | |
| # - Use a maximum of 5 results per query to keep output precise and useful. | |
| # """ | |
| # # Step 1: Normal Tavily search | |
| # # tavily_results = search_tool.search(query) | |
| # site_query = f"{query} after:2020" | |
| # tavily_results = search_tool.search(query=site_query, max_results=10) | |
| # # Step 2: Force search inside trusted domains | |
| # trusted_results = [] | |
| # for site in TRUSTED_SITES: | |
| # site_query = f"site:{site} {query}" | |
| # try: | |
| # res = search_tool.search(site_query) | |
| # if res and "results" in res: | |
| # trusted_results.extend(res["results"]) | |
| # except Exception as e: | |
| # print(f"Skipping {site}: {e}") | |
| # # Step 3: Merge + deduplicate | |
| # all_results = tavily_results.get("results", []) + trusted_results | |
| # seen = set() | |
| # filtered = [] | |
| # for r in all_results: | |
| # if r["url"] not in seen: | |
| # seen.add(r["url"]) | |
| # filtered.append(r) | |
| # # Step 4: Limit to 5 best results | |
| # final_results = sorted(filtered, key=lambda x: x.get("score", 0), reverse=True)[:5] | |
| # return {"results": final_results} | |