| |
|
|
| from typing import Dict, Any, List, Optional |
| from .base_tool import BaseTool |
|
|
| class CitationTool(BaseTool): |
| """Tool for finding and formatting scientific citations. |
| |
| This tool helps agents find appropriate citations for claims and format them |
| according to standard scientific citation styles. |
| """ |
| |
| def __init__(self): |
| """Initialize the citation tool.""" |
| super().__init__( |
| name="citation", |
| description="Find and format scientific citations" |
| ) |
| |
| def execute( |
| self, |
| query: str, |
| citation_style: str = "apa", |
| max_results: int = 5, |
| min_year: Optional[int] = None |
| ) -> List[Dict[str, Any]]: |
| """Find and format citations for a given query. |
| |
| Args: |
| query: The search query for finding relevant citations |
| citation_style: Citation style to use (apa, mla, chicago, etc.) |
| max_results: Maximum number of citation results to return |
| min_year: Optional minimum publication year to filter results |
| |
| Returns: |
| A list of formatted citations and their metadata |
| """ |
| self.logger.info(f"Finding citations for: {query} (style: {citation_style}, max: {max_results})") |
| |
| |
| |
| |
| |
| current_year = 2023 |
| start_year = min_year or (current_year - 10) |
| |
| mock_citations = [ |
| { |
| "authors": ["Smith, J.", "Johnson, K."], |
| "year": start_year + i, |
| "title": f"Research on {query}: A Comprehensive Analysis", |
| "journal": "Journal of Scientific Research", |
| "volume": "42", |
| "issue": "3", |
| "pages": f"{100 + i*10}-{110 + i*10}", |
| "doi": f"10.1234/jsr.{2023}.{1000 + i}", |
| "relevance_score": 0.95 - (i * 0.1), |
| "formatted_citation": f"Smith, J., & Johnson, K. ({start_year + i}). Research on {query}: A Comprehensive Analysis. Journal of Scientific Research, 42(3), {100 + i*10}-{110 + i*10}. https://doi.org/10.1234/jsr.{2023}.{1000 + i}" |
| } |
| for i in range(min(max_results, 10)) |
| ] |
| |
| return mock_citations |
| |
| def format_citation(self, citation_data: Dict[str, Any], style: str) -> str: |
| """Format citation data according to a specific style. |
| |
| Args: |
| citation_data: Dictionary with citation data |
| style: Citation style to use |
| |
| Returns: |
| Formatted citation string |
| """ |
| |
| |
| |
| |
| if style.lower() == "apa": |
| |
| authors = ", ".join(citation_data.get("authors", [])) |
| year = citation_data.get("year", "n.d.") |
| title = citation_data.get("title", "") |
| journal = citation_data.get("journal", "") |
| volume = citation_data.get("volume", "") |
| issue = citation_data.get("issue", "") |
| pages = citation_data.get("pages", "") |
| doi = citation_data.get("doi", "") |
| |
| return f"{authors} ({year}). {title}. {journal}, {volume}({issue}), {pages}. https://doi.org/{doi}" |
| |
| elif style.lower() == "mla": |
| |
| authors = ", ".join(citation_data.get("authors", [])) |
| title = citation_data.get("title", "") |
| journal = citation_data.get("journal", "") |
| volume = citation_data.get("volume", "") |
| issue = citation_data.get("issue", "") |
| year = citation_data.get("year", "n.d.") |
| pages = citation_data.get("pages", "") |
| |
| return f"{authors}. \"{title}.\" {journal}, vol. {volume}, no. {issue}, {year}, pp. {pages}." |
| |
| else: |
| |
| authors = ", ".join(citation_data.get("authors", [])) |
| year = citation_data.get("year", "n.d.") |
| title = citation_data.get("title", "") |
| journal = citation_data.get("journal", "") |
| |
| return f"{authors} ({year}). {title}. {journal}." |
| |
| def get_parameters_schema(self) -> Dict[str, Any]: |
| """Get the JSON schema for the tool's parameters. |
| |
| Returns: |
| A dictionary containing the JSON schema |
| """ |
| return { |
| "type": "object", |
| "properties": { |
| "query": { |
| "type": "string", |
| "description": "The search query for finding relevant citations" |
| }, |
| "citation_style": { |
| "type": "string", |
| "description": "Citation style to use", |
| "enum": ["apa", "mla", "chicago", "harvard", "ieee"], |
| "default": "apa" |
| }, |
| "max_results": { |
| "type": "integer", |
| "description": "Maximum number of citation results to return", |
| "default": 5 |
| }, |
| "min_year": { |
| "type": "integer", |
| "description": "Optional minimum publication year to filter results" |
| } |
| }, |
| "required": ["query"] |
| } |
|
|