|
|
import os |
|
|
import re |
|
|
import langchain |
|
|
from paperqa import Docs, Settings |
|
|
import asyncio |
|
|
|
|
|
|
|
|
from langchain_community.utilities import SerpAPIWrapper |
|
|
from langchain.base_language import BaseLanguageModel |
|
|
from langchain.tools import BaseTool |
|
|
from langchain_openai import OpenAIEmbeddings |
|
|
from pypdf.errors import PdfReadError |
|
|
from rdkit import Chem, DataStructs |
|
|
from rdkit.Chem import AllChem |
|
|
from langchain_openai import ChatOpenAI |
|
|
|
|
|
def is_smiles(text): |
|
|
try: |
|
|
m = Chem.MolFromSmiles(text, sanitize=False) |
|
|
if m is None: |
|
|
return False |
|
|
return True |
|
|
except: |
|
|
return False |
|
|
|
|
|
|
|
|
|
|
|
def is_multiple_smiles(text): |
|
|
if is_smiles(text): |
|
|
return "." in text |
|
|
return False |
|
|
|
|
|
|
|
|
def split_smiles(text): |
|
|
return text.split(".") |
|
|
import os |
|
|
import re |
|
|
|
|
|
import langchain |
|
|
from paperqa import Docs, Settings |
|
|
import asyncio |
|
|
|
|
|
|
|
|
from langchain_community.utilities import SerpAPIWrapper |
|
|
from langchain.base_language import BaseLanguageModel |
|
|
from langchain.tools import BaseTool |
|
|
from langchain_openai import OpenAIEmbeddings |
|
|
from pypdf.errors import PdfReadError |
|
|
from rdkit import Chem, DataStructs |
|
|
from rdkit.Chem import AllChem |
|
|
import nest_asyncio |
|
|
from langchain_openai import ChatOpenAI |
|
|
nest_asyncio.apply() |
|
|
def is_smiles(text): |
|
|
try: |
|
|
m = Chem.MolFromSmiles(text, sanitize=False) |
|
|
if m is None: |
|
|
return False |
|
|
return True |
|
|
except: |
|
|
return False |
|
|
|
|
|
|
|
|
|
|
|
def is_multiple_smiles(text): |
|
|
if is_smiles(text): |
|
|
return "." in text |
|
|
return False |
|
|
|
|
|
|
|
|
def split_smiles(text): |
|
|
return text.split(".") |
|
|
|
|
|
def paper_scraper(search: str, pdir: str = "query", semantic_scholar_api_key: str = None) -> dict: |
|
|
try: |
|
|
return paperscraper.search_papers( |
|
|
search, |
|
|
pdir=pdir, |
|
|
semantic_scholar_api_key=semantic_scholar_api_key, |
|
|
) |
|
|
except KeyError: |
|
|
return {} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def web_search(keywords, search_engine="google"): |
|
|
try: |
|
|
return SerpAPIWrapper( |
|
|
serpapi_api_key=os.getenv("SERP_API_KEY"), search_engine=search_engine |
|
|
).run(keywords) |
|
|
except: |
|
|
return "No results, try another search" |
|
|
|
|
|
|
|
|
class WebSearch(BaseTool): |
|
|
name: str = "WebSearch" |
|
|
description: str = ( |
|
|
"Input a specific question, returns an answer from web search. " |
|
|
"Give more detailed information and use more general features to formulate your questions." |
|
|
) |
|
|
serp_api_key: str = None |
|
|
|
|
|
def __init__(self, serp_api_key: str = None): |
|
|
super().__init__() |
|
|
self.serp_api_key = serp_api_key |
|
|
|
|
|
def _run(self, query: str) -> str: |
|
|
if not self.serp_api_key: |
|
|
return ( |
|
|
"No SerpAPI key found. This tool may not be used without a SerpAPI key." |
|
|
) |
|
|
return web_search(query) |
|
|
|
|
|
async def _arun(self, query: str) -> str: |
|
|
raise NotImplementedError("Async not implemented") |
|
|
|
|
|
|
|
|
def web_search(keywords, search_engine="google"): |
|
|
try: |
|
|
return SerpAPIWrapper( |
|
|
serpapi_api_key=os.getenv("SERP_API_KEY"), search_engine=search_engine |
|
|
).run(keywords) |
|
|
except: |
|
|
return "No results, try another search" |
|
|
|
|
|
|
|
|
class WebSearch(BaseTool): |
|
|
name: str = "WebSearch" |
|
|
description: str = ( |
|
|
"Input a specific question, returns an answer from web search. " |
|
|
"Give more detailed information and use more general features to formulate your questions." |
|
|
) |
|
|
serp_api_key: str = None |
|
|
|
|
|
def __init__(self, serp_api_key: str = None): |
|
|
super().__init__() |
|
|
self.serp_api_key = serp_api_key |
|
|
|
|
|
def _run(self, query: str) -> str: |
|
|
if not self.serp_api_key: |
|
|
return ( |
|
|
"No SerpAPI key found. This tool may not be used without a SerpAPI key." |
|
|
) |
|
|
return web_search(query) |
|
|
|
|
|
async def _arun(self, query: str) -> str: |
|
|
raise NotImplementedError("Async not implemented") |