from smolagents import Tool from semanticscholar import SemanticScholar class AcademicPaperSearchTool(Tool): name = "academic_paper_search" description = "Searches academic papers via Semantic Scholar and returns the most relevant titles and abstracts." inputs = { "query": {"type": "string", "description": "Search query for academic papers (title, keywords, etc.)"} } output_type = "string" def forward(self, query: str) -> str: sch = SemanticScholar() try: # Use query=query to avoid potential keyword issues with the SemanticScholar method papers = sch.search_paper(query, limit=3) # get top-3 matching papers except Exception as e: return f"An error occurred during search: {e}" if not papers: return "No papers found." # Format results concisely lines = [] for p in papers: # --- THE FIX IS HERE --- # Access attributes directly using dot notation (p.title, p.year, p.abstract) # instead of the dictionary method p.get(...) title = p.title year = p.year abstract = p.abstract if p.abstract else "" # Check if abstract exists # Only take the first sentence or two of the abstract abstract_snip = abstract.split(". ")[0] if abstract else "" # Ensure 'year' is handled gracefully (it can sometimes be None) year_str = str(year) if year else "N/A" lines.append(f"**{title}** ({year_str}): {abstract_snip}...") return "\n".join(lines)