Lagent / lagent /actions /arxiv_search.py
Superkingjcj's picture
Upload 111 files
e679d69 verified
raw
history blame
2.91 kB
from typing import Optional, Type
from asyncer import asyncify
from lagent.actions.base_action import AsyncActionMixin, BaseAction, tool_api
from lagent.actions.parser import BaseParser, JsonParser
from lagent.schema import ActionReturn, ActionStatusCode
class ArxivSearch(BaseAction):
"""Search information from Arxiv.org. \
Useful for when you need to answer questions about Physics, Mathematics, \
Computer Science, Quantitative Biology, Quantitative Finance, Statistics, \
Electrical Engineering, and Economics from scientific articles on arxiv.org.
"""
def __init__(
self,
top_k_results: int = 3,
max_query_len: int = 300,
doc_content_chars_max: int = 1500,
description: Optional[dict] = None,
parser: Type[BaseParser] = JsonParser,
):
super().__init__(description, parser)
self.top_k_results = top_k_results
self.max_query_len = max_query_len
self.doc_content_chars_max = doc_content_chars_max
@tool_api(explode_return=True)
def get_arxiv_article_information(self, query: str) -> dict:
"""Run Arxiv search and get the article meta information.
Args:
query (:class:`str`): the content of search query
Returns:
:class:`dict`: article information
* content (str): a list of 3 arxiv search papers
"""
import arxiv
try:
results = arxiv.Search( # type: ignore
query[: self.max_query_len], max_results=self.top_k_results
).results()
except Exception as exc:
return ActionReturn(errmsg=f'Arxiv exception: {exc}', state=ActionStatusCode.HTTP_ERROR)
docs = [
f'Published: {result.updated.date()}\nTitle: {result.title}\n'
f'Authors: {", ".join(a.name for a in result.authors)}\n'
f'Summary: {result.summary[:self.doc_content_chars_max]}'
for result in results
]
if docs:
return {'content': '\n\n'.join(docs)}
return {'content': 'No good Arxiv Result was found'}
class AsyncArxivSearch(AsyncActionMixin, ArxivSearch):
"""Search information from Arxiv.org. \
Useful for when you need to answer questions about Physics, Mathematics, \
Computer Science, Quantitative Biology, Quantitative Finance, Statistics, \
Electrical Engineering, and Economics from scientific articles on arxiv.org.
"""
@tool_api(explode_return=True)
@asyncify
def get_arxiv_article_information(self, query: str) -> dict:
"""Run Arxiv search and get the article meta information.
Args:
query (:class:`str`): the content of search query
Returns:
:class:`dict`: article information
* content (str): a list of 3 arxiv search papers
"""
return super().get_arxiv_article_information(query)