Spaces:
Running
Running
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 | |
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. | |
""" | |
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) | |