from smolagents import CodeAgent, HfApiModel, load_tool, tool import datetime import requests import pytz import yaml from tools.final_answer import FinalAnswerTool from scholarly import scholarly import gradio as gr @tool def fetch_latest_research_papers(keywords: list, num_results: int = 1) -> list: """Fetches the latest research papers from Google Scholar based on provided keywords.""" try: print(f"DEBUG: Searching papers with keywords: {keywords}") # Debug input query = " ".join(keywords) search_results = scholarly.search_pubs(query) papers = [] for i in range(num_results): paper = next(search_results, None) if paper: print(f"DEBUG: Found paper - {paper['bib'].get('title', 'No Title')}") # Debug result papers.append({ "title": paper['bib'].get('title', 'No Title'), "authors": paper['bib'].get('author', 'Unknown Authors'), "year": paper['bib'].get('pub_year', 'Unknown Year'), "abstract": paper['bib'].get('abstract', 'No Abstract Available'), "link": paper.get('pub_url', 'No Link Available') }) if not papers: print("DEBUG: No papers found.") return papers except Exception as e: print(f"ERROR: {str(e)}") # Debug errors return [f"Error fetching research papers: {str(e)}"] final_answer = FinalAnswerTool() model = HfApiModel( max_tokens=2096, temperature=0.5, model_id='Qwen/Qwen2.5-Coder-32B-Instruct', custom_role_conversions=None, ) with open("prompts.yaml", 'r') as stream: prompt_templates = yaml.safe_load(stream) agent = CodeAgent( model=model, tools=[final_answer, fetch_latest_research_papers], max_steps=6, verbosity_level=1, grammar=None, planning_interval=None, name="ScholarAgent", description="An AI agent that fetches the latest research papers from Google Scholar based on user-defined keywords and filters.", prompt_templates=prompt_templates ) def search_papers(user_input): keywords = user_input.split(",") # Split input by commas for multiple keywords print(f"DEBUG: Received input keywords - {keywords}") # Debug user input results = fetch_latest_research_papers(keywords, num_results=1) print(f"DEBUG: Results received - {results}") # Debug function output if isinstance(results, list) and results: return "\n\n".join([f"**Title:** {paper['title']}\n**Authors:** {paper['authors']}\n**Year:** {paper['year']}\n**Abstract:** {paper['abstract']}\n[Read More]({paper['link']})" for paper in results]) print("DEBUG: No results found.") return "No results found. Try different keywords." # Create a simple Gradio interface with gr.Blocks() as demo: gr.Markdown("# Google Scholar Research Paper Fetcher") keyword_input = gr.Textbox(label="Enter keywords (comma-separated)", placeholder="e.g., deep learning, reinforcement learning") output_display = gr.Markdown() search_button = gr.Button("Search") search_button.click(search_papers, inputs=[keyword_input], outputs=[output_display]) print("DEBUG: Gradio UI is running. Waiting for user input...") demo.launch()