Add SearchApi tools (#4648)

This commit is contained in:
SebastjanPrachovskij 2024-05-30 06:11:17 +03:00 committed by GitHub
parent d41c077fac
commit b10e67be3b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 1890 additions and 0 deletions

View File

@ -1,6 +1,7 @@
- google
- bing
- duckduckgo
- searchapi
- searxng
- dalle
- azuredalle

View File

@ -0,0 +1 @@
<svg height="112.906975" viewBox="0 0 112.90697479 112.90697479" width="112.906975" xmlns="http://www.w3.org/2000/svg"><path d="m0 0h112.906975v112.906975h-112.906975z" fill="#6986eb"/><path d="m97.24234 109.8245a2.57759 2.57759 0 0 1 -2.57778 2.57778 9.80672 9.80672 0 0 1 -9.79558-9.79557v-11.02305a2.57779 2.57779 0 0 1 5.15557 0v11.02305a4.64509 4.64509 0 0 0 4.64 4.64 2.57759 2.57759 0 0 1 2.57779 2.57779zm14.95114-16.6015a2.57759 2.57759 0 0 0 -2.57778 2.57779 4.64 4.64 0 1 1 -9.28 0v-22.06525a23.2 23.2 0 1 0 -46.40009 0v22.06522a4.64 4.64 0 1 1 -9.28 0 2.57779 2.57779 0 1 0 -5.15557 0 9.79558 9.79558 0 0 0 19.59115 0v-22.06522a18.04449 18.04449 0 0 1 36.089 0v22.06522a9.79558 9.79558 0 0 0 19.59115 0 2.57759 2.57759 0 0 0 -2.57786-2.57776zm-35.05785-1.443a2.57759 2.57759 0 0 0 -2.57778 2.57778v17.52893a2.57779 2.57779 0 0 0 5.15557 0v-17.52891a2.57759 2.57759 0 0 0 -2.57779-2.5778zm-10.31113-2.77412a2.57759 2.57759 0 0 0 -2.57778 2.57778v11.02305a4.64509 4.64509 0 0 1 -4.64 4.64 2.57778 2.57778 0 1 0 0 5.15556 9.80671 9.80671 0 0 0 9.79557-9.79557v-11.02304a2.57759 2.57759 0 0 0 -2.57779-2.57778zm3.0935-18.87949a3.6089 3.6089 0 1 0 3.6089 3.6089 3.60891 3.60891 0 0 0 -3.6089-3.6089zm18.04448 3.6089a3.6089 3.6089 0 1 0 -3.60889 3.60889 3.60891 3.60891 0 0 0 3.60892-3.60889z" fill="#00001b" transform="translate(-20.682205 -26.043993)"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,23 @@
from typing import Any
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.searchapi.tools.google import GoogleTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
class SearchAPIProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
GoogleTool().fork_tool_runtime(
runtime={
"credentials": credentials,
}
).invoke(
user_id='',
tool_parameters={
"query": "SearchApi dify",
"result_type": "link"
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))

View File

@ -0,0 +1,34 @@
identity:
author: SearchApi
name: searchapi
label:
en_US: SearchApi
zh_Hans: SearchApi
pt_BR: SearchApi
description:
en_US: SearchApi is a robust real-time SERP API delivering structured data from a collection of search engines including Google Search, Google Jobs, YouTube, Google News, and many more.
zh_Hans: SearchApi 是一个强大的实时 SERP API可提供来自 Google 搜索、Google 招聘、YouTube、Google 新闻等搜索引擎集合的结构化数据。
pt_BR: SearchApi is a robust real-time SERP API delivering structured data from a collection of search engines including Google Search, Google Jobs, YouTube, Google News, and many more.
icon: icon.svg
tags:
- search
- business
- news
- productivity
credentials_for_provider:
searchapi_api_key:
type: secret-input
required: true
label:
en_US: SearchApi API key
zh_Hans: SearchApi API key
pt_BR: SearchApi API key
placeholder:
en_US: Please input your SearchApi API key
zh_Hans: 请输入你的 SearchApi API key
pt_BR: Please input your SearchApi API key
help:
en_US: Get your SearchApi API key from SearchApi
zh_Hans: 从 SearchApi 获取您的 SearchApi API key
pt_BR: Get your SearchApi API key from SearchApi
url: https://www.searchapi.io/

View File

@ -0,0 +1,104 @@
from typing import Any, Union
import requests
from core.tools.entities.tool_entities import ToolInvokeMessage
from core.tools.tool.builtin_tool import BuiltinTool
SEARCH_API_URL = "https://www.searchapi.io/api/v1/search"
class SearchAPI:
"""
SearchAPI tool provider.
"""
def __init__(self, api_key: str) -> None:
"""Initialize SearchAPI tool provider."""
self.searchapi_api_key = api_key
def run(self, query: str, **kwargs: Any) -> str:
"""Run query through SearchAPI and parse result."""
type = kwargs.get("result_type", "text")
return self._process_response(self.results(query, **kwargs), type=type)
def results(self, query: str, **kwargs: Any) -> dict:
"""Run query through SearchAPI and return the raw result."""
params = self.get_params(query, **kwargs)
response = requests.get(
url=SEARCH_API_URL,
params=params,
headers={"Authorization": f"Bearer {self.searchapi_api_key}"},
)
response.raise_for_status()
return response.json()
def get_params(self, query: str, **kwargs: Any) -> dict[str, str]:
"""Get parameters for SearchAPI."""
return {
"engine": "google",
"q": query,
**{key: value for key, value in kwargs.items() if value not in [None, ""]},
}
@staticmethod
def _process_response(res: dict, type: str) -> str:
"""Process response from SearchAPI."""
if "error" in res.keys():
raise ValueError(f"Got error from SearchApi: {res['error']}")
toret = ""
if type == "text":
if "answer_box" in res.keys() and "answer" in res["answer_box"].keys():
toret += res["answer_box"]["answer"] + "\n"
if "answer_box" in res.keys() and "snippet" in res["answer_box"].keys():
toret += res["answer_box"]["snippet"] + "\n"
if "knowledge_graph" in res.keys() and "description" in res["knowledge_graph"].keys():
toret += res["knowledge_graph"]["description"] + "\n"
if "organic_results" in res.keys() and "snippet" in res["organic_results"][0].keys():
for item in res["organic_results"]:
toret += "content: " + item["snippet"] + "\n" + "link: " + item["link"] + "\n"
if toret == "":
toret = "No good search result found"
elif type == "link":
if "answer_box" in res.keys() and "organic_result" in res["answer_box"].keys():
if "title" in res["answer_box"]["organic_result"].keys():
toret = f"[{res['answer_box']['organic_result']['title']}]({res['answer_box']['organic_result']['link']})\n"
elif "organic_results" in res.keys() and "link" in res["organic_results"][0].keys():
toret = ""
for item in res["organic_results"]:
toret += f"[{item['title']}]({item['link']})\n"
elif "related_questions" in res.keys() and "link" in res["related_questions"][0].keys():
toret = ""
for item in res["related_questions"]:
toret += f"[{item['title']}]({item['link']})\n"
elif "related_searches" in res.keys() and "link" in res["related_searches"][0].keys():
toret = ""
for item in res["related_searches"]:
toret += f"[{item['title']}]({item['link']})\n"
else:
toret = "No good search result found"
return toret
class GoogleTool(BuiltinTool):
def _invoke(self,
user_id: str,
tool_parameters: dict[str, Any],
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
"""
Invoke the SearchApi tool.
"""
query = tool_parameters['query']
result_type = tool_parameters['result_type']
num = tool_parameters.get("num", 10)
google_domain = tool_parameters.get("google_domain", "google.com")
gl = tool_parameters.get("gl", "us")
hl = tool_parameters.get("hl", "en")
location = tool_parameters.get("location", None)
api_key = self.runtime.credentials['searchapi_api_key']
result = SearchAPI(api_key).run(query, result_type=result_type, num=num, google_domain=google_domain, gl=gl, hl=hl, location=location)
if result_type == 'text':
return self.create_text_message(text=result)
return self.create_link_message(link=result)

View File

@ -0,0 +1,481 @@
identity:
name: google_search_api
author: SearchApi
label:
en_US: Google Search API
zh_Hans: Google Search API
description:
human:
en_US: A tool to retrieve answer boxes, knowledge graphs, snippets, and webpages from Google Search engine.
zh_Hans: 一种从 Google 搜索引擎检索答案框、知识图、片段和网页的工具。
llm: A tool to retrieve answer boxes, knowledge graphs, snippets, and webpages from Google Search engine.
parameters:
- name: query
type: string
required: true
label:
en_US: Query
zh_Hans: 询问
human_description:
en_US: Defines the query you want to search.
zh_Hans: 定义您要搜索的查询。
llm_description: Defines the search query you want to search.
form: llm
- name: result_type
type: select
required: true
options:
- value: text
label:
en_US: text
zh_Hans: 文本
- value: link
label:
en_US: link
zh_Hans: 链接
default: text
label:
en_US: Result type
zh_Hans: 结果类型
human_description:
en_US: used for selecting the result type, text or link
zh_Hans: 用于选择结果类型,使用文本还是链接进行展示
form: form
- name: location
type: string
required: false
label:
en_US: Location
zh_Hans: 询问
human_description:
en_US: Defines from where you want the search to originate. (For example - New York)
zh_Hans: 定义您想要搜索的起始位置。 (例如 - 纽约)
llm_description: Defines from where you want the search to originate. (For example - New York)
form: llm
- name: gl
type: select
label:
en_US: Country
zh_Hans: 国家
required: false
human_description:
en_US: Defines the country of the search. Default is "US".
zh_Hans: 定义搜索的国家/地区。默认为“美国”。
llm_description: Defines the gl parameter of the Google search.
form: form
default: US
options:
- value: AR
label:
en_US: Argentina
zh_Hans: 阿根廷
pt_BR: Argentina
- value: AU
label:
en_US: Australia
zh_Hans: 澳大利亚
pt_BR: Australia
- value: AT
label:
en_US: Austria
zh_Hans: 奥地利
pt_BR: Austria
- value: BE
label:
en_US: Belgium
zh_Hans: 比利时
pt_BR: Belgium
- value: BR
label:
en_US: Brazil
zh_Hans: 巴西
pt_BR: Brazil
- value: CA
label:
en_US: Canada
zh_Hans: 加拿大
pt_BR: Canada
- value: CL
label:
en_US: Chile
zh_Hans: 智利
pt_BR: Chile
- value: CO
label:
en_US: Colombia
zh_Hans: 哥伦比亚
pt_BR: Colombia
- value: CN
label:
en_US: China
zh_Hans: 中国
pt_BR: China
- value: CZ
label:
en_US: Czech Republic
zh_Hans: 捷克共和国
pt_BR: Czech Republic
- value: DK
label:
en_US: Denmark
zh_Hans: 丹麦
pt_BR: Denmark
- value: FI
label:
en_US: Finland
zh_Hans: 芬兰
pt_BR: Finland
- value: FR
label:
en_US: France
zh_Hans: 法国
pt_BR: France
- value: DE
label:
en_US: Germany
zh_Hans: 德国
pt_BR: Germany
- value: HK
label:
en_US: Hong Kong
zh_Hans: 香港
pt_BR: Hong Kong
- value: IN
label:
en_US: India
zh_Hans: 印度
pt_BR: India
- value: ID
label:
en_US: Indonesia
zh_Hans: 印度尼西亚
pt_BR: Indonesia
- value: IT
label:
en_US: Italy
zh_Hans: 意大利
pt_BR: Italy
- value: JP
label:
en_US: Japan
zh_Hans: 日本
pt_BR: Japan
- value: KR
label:
en_US: Korea
zh_Hans: 韩国
pt_BR: Korea
- value: MY
label:
en_US: Malaysia
zh_Hans: 马来西亚
pt_BR: Malaysia
- value: MX
label:
en_US: Mexico
zh_Hans: 墨西哥
pt_BR: Mexico
- value: NL
label:
en_US: Netherlands
zh_Hans: 荷兰
pt_BR: Netherlands
- value: NZ
label:
en_US: New Zealand
zh_Hans: 新西兰
pt_BR: New Zealand
- value: NO
label:
en_US: Norway
zh_Hans: 挪威
pt_BR: Norway
- value: PH
label:
en_US: Philippines
zh_Hans: 菲律宾
pt_BR: Philippines
- value: PL
label:
en_US: Poland
zh_Hans: 波兰
pt_BR: Poland
- value: PT
label:
en_US: Portugal
zh_Hans: 葡萄牙
pt_BR: Portugal
- value: RU
label:
en_US: Russia
zh_Hans: 俄罗斯
pt_BR: Russia
- value: SA
label:
en_US: Saudi Arabia
zh_Hans: 沙特阿拉伯
pt_BR: Saudi Arabia
- value: SG
label:
en_US: Singapore
zh_Hans: 新加坡
pt_BR: Singapore
- value: ZA
label:
en_US: South Africa
zh_Hans: 南非
pt_BR: South Africa
- value: ES
label:
en_US: Spain
zh_Hans: 西班牙
pt_BR: Spain
- value: SE
label:
en_US: Sweden
zh_Hans: 瑞典
pt_BR: Sweden
- value: CH
label:
en_US: Switzerland
zh_Hans: 瑞士
pt_BR: Switzerland
- value: TW
label:
en_US: Taiwan
zh_Hans: 台湾
pt_BR: Taiwan
- value: TH
label:
en_US: Thailand
zh_Hans: 泰国
pt_BR: Thailand
- value: TR
label:
en_US: Turkey
zh_Hans: 土耳其
pt_BR: Turkey
- value: GB
label:
en_US: United Kingdom
zh_Hans: 英国
pt_BR: United Kingdom
- value: US
label:
en_US: United States
zh_Hans: 美国
pt_BR: United States
- name: hl
type: select
label:
en_US: Language
zh_Hans: 语言
human_description:
en_US: Defines the interface language of the search. Default is "en".
zh_Hans: 定义搜索的界面语言。默认为“en”。
required: false
default: en
form: form
options:
- value: ar
label:
en_US: Arabic
zh_Hans: 阿拉伯语
- value: bg
label:
en_US: Bulgarian
zh_Hans: 保加利亚语
- value: ca
label:
en_US: Catalan
zh_Hans: 加泰罗尼亚语
- value: zh-cn
label:
en_US: Chinese (Simplified)
zh_Hans: 中文(简体)
- value: zh-tw
label:
en_US: Chinese (Traditional)
zh_Hans: 中文(繁体)
- value: cs
label:
en_US: Czech
zh_Hans: 捷克语
- value: da
label:
en_US: Danish
zh_Hans: 丹麦语
- value: nl
label:
en_US: Dutch
zh_Hans: 荷兰语
- value: en
label:
en_US: English
zh_Hans: 英语
- value: et
label:
en_US: Estonian
zh_Hans: 爱沙尼亚语
- value: fi
label:
en_US: Finnish
zh_Hans: 芬兰语
- value: fr
label:
en_US: French
zh_Hans: 法语
- value: de
label:
en_US: German
zh_Hans: 德语
- value: el
label:
en_US: Greek
zh_Hans: 希腊语
- value: iw
label:
en_US: Hebrew
zh_Hans: 希伯来语
- value: hi
label:
en_US: Hindi
zh_Hans: 印地语
- value: hu
label:
en_US: Hungarian
zh_Hans: 匈牙利语
- value: id
label:
en_US: Indonesian
zh_Hans: 印尼语
- value: it
label:
en_US: Italian
zh_Hans: 意大利语
- value: jp
label:
en_US: Japanese
zh_Hans: 日语
- value: kn
label:
en_US: Kannada
zh_Hans: 卡纳达语
- value: ko
label:
en_US: Korean
zh_Hans: 韩语
- value: lv
label:
en_US: Latvian
zh_Hans: 拉脱维亚语
- value: lt
label:
en_US: Lithuanian
zh_Hans: 立陶宛语
- value: my
label:
en_US: Malay
zh_Hans: 马来语
- value: ml
label:
en_US: Malayalam
zh_Hans: 马拉雅拉姆语
- value: mr
label:
en_US: Marathi
zh_Hans: 马拉地语
- value: "no"
label:
en_US: Norwegian
zh_Hans: 挪威语
- value: pl
label:
en_US: Polish
zh_Hans: 波兰语
- value: pt-br
label:
en_US: Portuguese (Brazil)
zh_Hans: 葡萄牙语(巴西)
- value: pt-pt
label:
en_US: Portuguese (Portugal)
zh_Hans: 葡萄牙语(葡萄牙)
- value: pa
label:
en_US: Punjabi
zh_Hans: 旁遮普语
- value: ro
label:
en_US: Romanian
zh_Hans: 罗马尼亚语
- value: ru
label:
en_US: Russian
zh_Hans: 俄语
- value: sr
label:
en_US: Serbian
zh_Hans: 塞尔维亚语
- value: sk
label:
en_US: Slovak
zh_Hans: 斯洛伐克语
- value: sl
label:
en_US: Slovenian
zh_Hans: 斯洛文尼亚语
- value: es
label:
en_US: Spanish
zh_Hans: 西班牙语
- value: sv
label:
en_US: Swedish
zh_Hans: 瑞典语
- value: ta
label:
en_US: Tamil
zh_Hans: 泰米尔语
- value: te
label:
en_US: Telugu
zh_Hans: 泰卢固语
- value: th
label:
en_US: Thai
zh_Hans: 泰语
- value: tr
label:
en_US: Turkish
zh_Hans: 土耳其语
- value: uk
label:
en_US: Ukrainian
zh_Hans: 乌克兰语
- value: vi
label:
en_US: Vietnamese
zh_Hans: 越南语
- name: google_domain
type: string
required: false
label:
en_US: google_domain
zh_Hans: google_domain
human_description:
en_US: Defines the Google domain of the search. Default is "google.com".
zh_Hans: 定义搜索的 Google 域。默认为“google.com”。
llm_description: Defines Google domain in which you want to search.
form: llm
- name: num
type: number
required: false
label:
en_US: num
zh_Hans: num
human_description:
en_US: Specifies the number of results to display per page. Default is 10. Max number - 100, min - 1.
zh_Hans: 指定每页显示的结果数。默认值为 10。最大数量 - 100最小数量 - 1。
llm_description: Specifies the num of results to display per page.
form: llm

View File

@ -0,0 +1,88 @@
from typing import Any, Union
import requests
from core.tools.entities.tool_entities import ToolInvokeMessage
from core.tools.tool.builtin_tool import BuiltinTool
SEARCH_API_URL = "https://www.searchapi.io/api/v1/search"
class SearchAPI:
"""
SearchAPI tool provider.
"""
def __init__(self, api_key: str) -> None:
"""Initialize SearchAPI tool provider."""
self.searchapi_api_key = api_key
def run(self, query: str, **kwargs: Any) -> str:
"""Run query through SearchAPI and parse result."""
type = kwargs.get("result_type", "text")
return self._process_response(self.results(query, **kwargs), type=type)
def results(self, query: str, **kwargs: Any) -> dict:
"""Run query through SearchAPI and return the raw result."""
params = self.get_params(query, **kwargs)
response = requests.get(
url=SEARCH_API_URL,
params=params,
headers={"Authorization": f"Bearer {self.searchapi_api_key}"},
)
response.raise_for_status()
return response.json()
def get_params(self, query: str, **kwargs: Any) -> dict[str, str]:
"""Get parameters for SearchAPI."""
return {
"engine": "google_jobs",
"q": query,
**{key: value for key, value in kwargs.items() if value not in [None, ""]},
}
@staticmethod
def _process_response(res: dict, type: str) -> str:
"""Process response from SearchAPI."""
if "error" in res.keys():
raise ValueError(f"Got error from SearchApi: {res['error']}")
toret = ""
if type == "text":
if "jobs" in res.keys() and "title" in res["jobs"][0].keys():
for item in res["jobs"]:
toret += "title: " + item["title"] + "\n" + "company_name: " + item["company_name"] + "content: " + item["description"] + "\n"
if toret == "":
toret = "No good search result found"
elif type == "link":
if "jobs" in res.keys() and "apply_link" in res["jobs"][0].keys():
for item in res["jobs"]:
toret += f"[{item['title']} - {item['company_name']}]({item['apply_link']})\n"
else:
toret = "No good search result found"
return toret
class GoogleJobsTool(BuiltinTool):
def _invoke(self,
user_id: str,
tool_parameters: dict[str, Any],
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
"""
Invoke the SearchApi tool.
"""
query = tool_parameters['query']
result_type = tool_parameters['result_type']
is_remote = tool_parameters.get("is_remote", None)
google_domain = tool_parameters.get("google_domain", "google.com")
gl = tool_parameters.get("gl", "us")
hl = tool_parameters.get("hl", "en")
location = tool_parameters.get("location", None)
ltype = 1 if is_remote else None
api_key = self.runtime.credentials['searchapi_api_key']
result = SearchAPI(api_key).run(query, result_type=result_type, google_domain=google_domain, gl=gl, hl=hl, location=location, ltype=ltype)
if result_type == 'text':
return self.create_text_message(text=result)
return self.create_link_message(link=result)

View File

@ -0,0 +1,478 @@
identity:
name: google_jobs_api
author: SearchApi
label:
en_US: Google Jobs API
zh_Hans: Google Jobs API
description:
human:
en_US: A tool to retrieve job titles, company names and description from Google Jobs engine.
zh_Hans: 一个从 Google 招聘引擎检索职位名称、公司名称和描述的工具。
llm: A tool to retrieve job titles, company names and description from Google Jobs engine.
parameters:
- name: query
type: string
required: true
label:
en_US: Query
zh_Hans: 询问
human_description:
en_US: Defines the query you want to search.
zh_Hans: 定义您要搜索的查询。
llm_description: Defines the search query you want to search.
form: llm
- name: result_type
type: select
required: true
options:
- value: text
label:
en_US: text
zh_Hans: 文本
- value: link
label:
en_US: link
zh_Hans: 链接
default: text
label:
en_US: Result type
zh_Hans: 结果类型
human_description:
en_US: used for selecting the result type, text or link
zh_Hans: 用于选择结果类型,使用文本还是链接进行展示
form: form
- name: location
type: string
required: false
label:
en_US: Location
zh_Hans: 询问
human_description:
en_US: Defines from where you want the search to originate. (For example - New York)
zh_Hans: 定义您想要搜索的起始位置。 (例如 - 纽约)
llm_description: Defines from where you want the search to originate. (For example - New York)
form: llm
- name: gl
type: select
label:
en_US: Country
zh_Hans: 国家
required: false
human_description:
en_US: Defines the country of the search. Default is "US".
zh_Hans: 定义搜索的国家/地区。默认为“美国”。
llm_description: Defines the gl parameter of the Google search.
form: form
default: US
options:
- value: AR
label:
en_US: Argentina
zh_Hans: 阿根廷
pt_BR: Argentina
- value: AU
label:
en_US: Australia
zh_Hans: 澳大利亚
pt_BR: Australia
- value: AT
label:
en_US: Austria
zh_Hans: 奥地利
pt_BR: Austria
- value: BE
label:
en_US: Belgium
zh_Hans: 比利时
pt_BR: Belgium
- value: BR
label:
en_US: Brazil
zh_Hans: 巴西
pt_BR: Brazil
- value: CA
label:
en_US: Canada
zh_Hans: 加拿大
pt_BR: Canada
- value: CL
label:
en_US: Chile
zh_Hans: 智利
pt_BR: Chile
- value: CO
label:
en_US: Colombia
zh_Hans: 哥伦比亚
pt_BR: Colombia
- value: CN
label:
en_US: China
zh_Hans: 中国
pt_BR: China
- value: CZ
label:
en_US: Czech Republic
zh_Hans: 捷克共和国
pt_BR: Czech Republic
- value: DK
label:
en_US: Denmark
zh_Hans: 丹麦
pt_BR: Denmark
- value: FI
label:
en_US: Finland
zh_Hans: 芬兰
pt_BR: Finland
- value: FR
label:
en_US: France
zh_Hans: 法国
pt_BR: France
- value: DE
label:
en_US: Germany
zh_Hans: 德国
pt_BR: Germany
- value: HK
label:
en_US: Hong Kong
zh_Hans: 香港
pt_BR: Hong Kong
- value: IN
label:
en_US: India
zh_Hans: 印度
pt_BR: India
- value: ID
label:
en_US: Indonesia
zh_Hans: 印度尼西亚
pt_BR: Indonesia
- value: IT
label:
en_US: Italy
zh_Hans: 意大利
pt_BR: Italy
- value: JP
label:
en_US: Japan
zh_Hans: 日本
pt_BR: Japan
- value: KR
label:
en_US: Korea
zh_Hans: 韩国
pt_BR: Korea
- value: MY
label:
en_US: Malaysia
zh_Hans: 马来西亚
pt_BR: Malaysia
- value: MX
label:
en_US: Mexico
zh_Hans: 墨西哥
pt_BR: Mexico
- value: NL
label:
en_US: Netherlands
zh_Hans: 荷兰
pt_BR: Netherlands
- value: NZ
label:
en_US: New Zealand
zh_Hans: 新西兰
pt_BR: New Zealand
- value: NO
label:
en_US: Norway
zh_Hans: 挪威
pt_BR: Norway
- value: PH
label:
en_US: Philippines
zh_Hans: 菲律宾
pt_BR: Philippines
- value: PL
label:
en_US: Poland
zh_Hans: 波兰
pt_BR: Poland
- value: PT
label:
en_US: Portugal
zh_Hans: 葡萄牙
pt_BR: Portugal
- value: RU
label:
en_US: Russia
zh_Hans: 俄罗斯
pt_BR: Russia
- value: SA
label:
en_US: Saudi Arabia
zh_Hans: 沙特阿拉伯
pt_BR: Saudi Arabia
- value: SG
label:
en_US: Singapore
zh_Hans: 新加坡
pt_BR: Singapore
- value: ZA
label:
en_US: South Africa
zh_Hans: 南非
pt_BR: South Africa
- value: ES
label:
en_US: Spain
zh_Hans: 西班牙
pt_BR: Spain
- value: SE
label:
en_US: Sweden
zh_Hans: 瑞典
pt_BR: Sweden
- value: CH
label:
en_US: Switzerland
zh_Hans: 瑞士
pt_BR: Switzerland
- value: TW
label:
en_US: Taiwan
zh_Hans: 台湾
pt_BR: Taiwan
- value: TH
label:
en_US: Thailand
zh_Hans: 泰国
pt_BR: Thailand
- value: TR
label:
en_US: Turkey
zh_Hans: 土耳其
pt_BR: Turkey
- value: GB
label:
en_US: United Kingdom
zh_Hans: 英国
pt_BR: United Kingdom
- value: US
label:
en_US: United States
zh_Hans: 美国
pt_BR: United States
- name: hl
type: select
label:
en_US: Language
zh_Hans: 语言
human_description:
en_US: Defines the interface language of the search. Default is "en".
zh_Hans: 定义搜索的界面语言。默认为“en”。
required: false
default: en
form: form
options:
- value: ar
label:
en_US: Arabic
zh_Hans: 阿拉伯语
- value: bg
label:
en_US: Bulgarian
zh_Hans: 保加利亚语
- value: ca
label:
en_US: Catalan
zh_Hans: 加泰罗尼亚语
- value: zh-cn
label:
en_US: Chinese (Simplified)
zh_Hans: 中文(简体)
- value: zh-tw
label:
en_US: Chinese (Traditional)
zh_Hans: 中文(繁体)
- value: cs
label:
en_US: Czech
zh_Hans: 捷克语
- value: da
label:
en_US: Danish
zh_Hans: 丹麦语
- value: nl
label:
en_US: Dutch
zh_Hans: 荷兰语
- value: en
label:
en_US: English
zh_Hans: 英语
- value: et
label:
en_US: Estonian
zh_Hans: 爱沙尼亚语
- value: fi
label:
en_US: Finnish
zh_Hans: 芬兰语
- value: fr
label:
en_US: French
zh_Hans: 法语
- value: de
label:
en_US: German
zh_Hans: 德语
- value: el
label:
en_US: Greek
zh_Hans: 希腊语
- value: iw
label:
en_US: Hebrew
zh_Hans: 希伯来语
- value: hi
label:
en_US: Hindi
zh_Hans: 印地语
- value: hu
label:
en_US: Hungarian
zh_Hans: 匈牙利语
- value: id
label:
en_US: Indonesian
zh_Hans: 印尼语
- value: it
label:
en_US: Italian
zh_Hans: 意大利语
- value: jp
label:
en_US: Japanese
zh_Hans: 日语
- value: kn
label:
en_US: Kannada
zh_Hans: 卡纳达语
- value: ko
label:
en_US: Korean
zh_Hans: 韩语
- value: lv
label:
en_US: Latvian
zh_Hans: 拉脱维亚语
- value: lt
label:
en_US: Lithuanian
zh_Hans: 立陶宛语
- value: my
label:
en_US: Malay
zh_Hans: 马来语
- value: ml
label:
en_US: Malayalam
zh_Hans: 马拉雅拉姆语
- value: mr
label:
en_US: Marathi
zh_Hans: 马拉地语
- value: "no"
label:
en_US: Norwegian
zh_Hans: 挪威语
- value: pl
label:
en_US: Polish
zh_Hans: 波兰语
- value: pt-br
label:
en_US: Portuguese (Brazil)
zh_Hans: 葡萄牙语(巴西)
- value: pt-pt
label:
en_US: Portuguese (Portugal)
zh_Hans: 葡萄牙语(葡萄牙)
- value: pa
label:
en_US: Punjabi
zh_Hans: 旁遮普语
- value: ro
label:
en_US: Romanian
zh_Hans: 罗马尼亚语
- value: ru
label:
en_US: Russian
zh_Hans: 俄语
- value: sr
label:
en_US: Serbian
zh_Hans: 塞尔维亚语
- value: sk
label:
en_US: Slovak
zh_Hans: 斯洛伐克语
- value: sl
label:
en_US: Slovenian
zh_Hans: 斯洛文尼亚语
- value: es
label:
en_US: Spanish
zh_Hans: 西班牙语
- value: sv
label:
en_US: Swedish
zh_Hans: 瑞典语
- value: ta
label:
en_US: Tamil
zh_Hans: 泰米尔语
- value: te
label:
en_US: Telugu
zh_Hans: 泰卢固语
- value: th
label:
en_US: Thai
zh_Hans: 泰语
- value: tr
label:
en_US: Turkish
zh_Hans: 土耳其语
- value: uk
label:
en_US: Ukrainian
zh_Hans: 乌克兰语
- value: vi
label:
en_US: Vietnamese
zh_Hans: 越南语
- name: is_remote
type: select
label:
en_US: is_remote
zh_Hans: 很遥远
human_description:
en_US: Filter results based on the work arrangement. Set it to true to find jobs that offer work from home or remote work opportunities.
zh_Hans: 根据工作安排过滤结果。将其设置为 true 可查找提供在家工作或远程工作机会的工作。
required: false
form: form
options:
- value: true
label:
en_US: "true"
zh_Hans: "true"
- value: false
label:
en_US: "false"
zh_Hans: "false"

View File

@ -0,0 +1,92 @@
from typing import Any, Union
import requests
from core.tools.entities.tool_entities import ToolInvokeMessage
from core.tools.tool.builtin_tool import BuiltinTool
SEARCH_API_URL = "https://www.searchapi.io/api/v1/search"
class SearchAPI:
"""
SearchAPI tool provider.
"""
def __init__(self, api_key: str) -> None:
"""Initialize SearchAPI tool provider."""
self.searchapi_api_key = api_key
def run(self, query: str, **kwargs: Any) -> str:
"""Run query through SearchAPI and parse result."""
type = kwargs.get("result_type", "text")
return self._process_response(self.results(query, **kwargs), type=type)
def results(self, query: str, **kwargs: Any) -> dict:
"""Run query through SearchAPI and return the raw result."""
params = self.get_params(query, **kwargs)
response = requests.get(
url=SEARCH_API_URL,
params=params,
headers={"Authorization": f"Bearer {self.searchapi_api_key}"},
)
response.raise_for_status()
return response.json()
def get_params(self, query: str, **kwargs: Any) -> dict[str, str]:
"""Get parameters for SearchAPI."""
return {
"engine": "google_news",
"q": query,
**{key: value for key, value in kwargs.items() if value not in [None, ""]},
}
@staticmethod
def _process_response(res: dict, type: str) -> str:
"""Process response from SearchAPI."""
if "error" in res.keys():
raise ValueError(f"Got error from SearchApi: {res['error']}")
toret = ""
if type == "text":
if "organic_results" in res.keys() and "snippet" in res["organic_results"][0].keys():
for item in res["organic_results"]:
toret += "content: " + item["snippet"] + "\n" + "link: " + item["link"] + "\n"
if "top_stories" in res.keys() and "title" in res["top_stories"][0].keys():
for item in res["top_stories"]:
toret += "title: " + item["title"] + "\n" + "link: " + item["link"] + "\n"
if toret == "":
toret = "No good search result found"
elif type == "link":
if "organic_results" in res.keys() and "title" in res["organic_results"][0].keys():
for item in res["organic_results"]:
toret += f"[{item['title']}]({item['link']})\n"
elif "top_stories" in res.keys() and "title" in res["top_stories"][0].keys():
for item in res["top_stories"]:
toret += f"[{item['title']}]({item['link']})\n"
else:
toret = "No good search result found"
return toret
class GoogleNewsTool(BuiltinTool):
def _invoke(self,
user_id: str,
tool_parameters: dict[str, Any],
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
"""
Invoke the SearchApi tool.
"""
query = tool_parameters['query']
result_type = tool_parameters['result_type']
num = tool_parameters.get("num", 10)
google_domain = tool_parameters.get("google_domain", "google.com")
gl = tool_parameters.get("gl", "us")
hl = tool_parameters.get("hl", "en")
location = tool_parameters.get("location", None)
api_key = self.runtime.credentials['searchapi_api_key']
result = SearchAPI(api_key).run(query, result_type=result_type, num=num, google_domain=google_domain, gl=gl, hl=hl, location=location)
if result_type == 'text':
return self.create_text_message(text=result)
return self.create_link_message(link=result)

View File

@ -0,0 +1,482 @@
identity:
name: google_news_api
author: SearchApi
label:
en_US: Google News API
zh_Hans: Google News API
description:
human:
en_US: A tool to retrieve organic search results snippets and links from Google News engine.
zh_Hans: 一种从 Google 新闻引擎检索有机搜索结果片段和链接的工具。
llm: A tool to retrieve organic search results snippets and links from Google News engine.
parameters:
- name: query
type: string
required: true
label:
en_US: Query
zh_Hans: 询问
human_description:
en_US: Defines the query you want to search.
zh_Hans: 定义您要搜索的查询。
llm_description: Defines the search query you want to search.
form: llm
- name: result_type
type: select
required: true
options:
- value: text
label:
en_US: text
zh_Hans: 文本
- value: link
label:
en_US: link
zh_Hans: 链接
default: text
label:
en_US: Result type
zh_Hans: 结果类型
human_description:
en_US: used for selecting the result type, text or link.
zh_Hans: 用于选择结果类型,使用文本还是链接进行展示。
form: form
- name: location
type: string
required: false
label:
en_US: Location
zh_Hans: 询问
human_description:
en_US: Defines from where you want the search to originate. (For example - New York)
zh_Hans: 定义您想要搜索的起始位置。 (例如 - 纽约)
llm_description: Defines from where you want the search to originate. (For example - New York)
form: llm
- name: gl
type: select
label:
en_US: Country
zh_Hans: 国家
required: false
human_description:
en_US: Defines the country of the search. Default is "US".
zh_Hans: 定义搜索的国家/地区。默认为“美国”。
llm_description: Defines the gl parameter of the Google search.
form: form
default: US
options:
- value: AR
label:
en_US: Argentina
zh_Hans: 阿根廷
pt_BR: Argentina
- value: AU
label:
en_US: Australia
zh_Hans: 澳大利亚
pt_BR: Australia
- value: AT
label:
en_US: Austria
zh_Hans: 奥地利
pt_BR: Austria
- value: BE
label:
en_US: Belgium
zh_Hans: 比利时
pt_BR: Belgium
- value: BR
label:
en_US: Brazil
zh_Hans: 巴西
pt_BR: Brazil
- value: CA
label:
en_US: Canada
zh_Hans: 加拿大
pt_BR: Canada
- value: CL
label:
en_US: Chile
zh_Hans: 智利
pt_BR: Chile
- value: CO
label:
en_US: Colombia
zh_Hans: 哥伦比亚
pt_BR: Colombia
- value: CN
label:
en_US: China
zh_Hans: 中国
pt_BR: China
- value: CZ
label:
en_US: Czech Republic
zh_Hans: 捷克共和国
pt_BR: Czech Republic
- value: DK
label:
en_US: Denmark
zh_Hans: 丹麦
pt_BR: Denmark
- value: FI
label:
en_US: Finland
zh_Hans: 芬兰
pt_BR: Finland
- value: FR
label:
en_US: France
zh_Hans: 法国
pt_BR: France
- value: DE
label:
en_US: Germany
zh_Hans: 德国
pt_BR: Germany
- value: HK
label:
en_US: Hong Kong
zh_Hans: 香港
pt_BR: Hong Kong
- value: IN
label:
en_US: India
zh_Hans: 印度
pt_BR: India
- value: ID
label:
en_US: Indonesia
zh_Hans: 印度尼西亚
pt_BR: Indonesia
- value: IT
label:
en_US: Italy
zh_Hans: 意大利
pt_BR: Italy
- value: JP
label:
en_US: Japan
zh_Hans: 日本
pt_BR: Japan
- value: KR
label:
en_US: Korea
zh_Hans: 韩国
pt_BR: Korea
- value: MY
label:
en_US: Malaysia
zh_Hans: 马来西亚
pt_BR: Malaysia
- value: MX
label:
en_US: Mexico
zh_Hans: 墨西哥
pt_BR: Mexico
- value: NL
label:
en_US: Netherlands
zh_Hans: 荷兰
pt_BR: Netherlands
- value: NZ
label:
en_US: New Zealand
zh_Hans: 新西兰
pt_BR: New Zealand
- value: NO
label:
en_US: Norway
zh_Hans: 挪威
pt_BR: Norway
- value: PH
label:
en_US: Philippines
zh_Hans: 菲律宾
pt_BR: Philippines
- value: PL
label:
en_US: Poland
zh_Hans: 波兰
pt_BR: Poland
- value: PT
label:
en_US: Portugal
zh_Hans: 葡萄牙
pt_BR: Portugal
- value: RU
label:
en_US: Russia
zh_Hans: 俄罗斯
pt_BR: Russia
- value: SA
label:
en_US: Saudi Arabia
zh_Hans: 沙特阿拉伯
pt_BR: Saudi Arabia
- value: SG
label:
en_US: Singapore
zh_Hans: 新加坡
pt_BR: Singapore
- value: ZA
label:
en_US: South Africa
zh_Hans: 南非
pt_BR: South Africa
- value: ES
label:
en_US: Spain
zh_Hans: 西班牙
pt_BR: Spain
- value: SE
label:
en_US: Sweden
zh_Hans: 瑞典
pt_BR: Sweden
- value: CH
label:
en_US: Switzerland
zh_Hans: 瑞士
pt_BR: Switzerland
- value: TW
label:
en_US: Taiwan
zh_Hans: 台湾
pt_BR: Taiwan
- value: TH
label:
en_US: Thailand
zh_Hans: 泰国
pt_BR: Thailand
- value: TR
label:
en_US: Turkey
zh_Hans: 土耳其
pt_BR: Turkey
- value: GB
label:
en_US: United Kingdom
zh_Hans: 英国
pt_BR: United Kingdom
- value: US
label:
en_US: United States
zh_Hans: 美国
pt_BR: United States
- name: hl
type: select
label:
en_US: Language
zh_Hans: 语言
human_description:
en_US: Defines the interface language of the search. Default is "en".
zh_Hans: 定义搜索的界面语言。默认为“en”。
required: false
default: en
form: form
options:
- value: ar
label:
en_US: Arabic
zh_Hans: 阿拉伯语
- value: bg
label:
en_US: Bulgarian
zh_Hans: 保加利亚语
- value: ca
label:
en_US: Catalan
zh_Hans: 加泰罗尼亚语
- value: zh-cn
label:
en_US: Chinese (Simplified)
zh_Hans: 中文(简体)
- value: zh-tw
label:
en_US: Chinese (Traditional)
zh_Hans: 中文(繁体)
- value: cs
label:
en_US: Czech
zh_Hans: 捷克语
- value: da
label:
en_US: Danish
zh_Hans: 丹麦语
- value: nl
label:
en_US: Dutch
zh_Hans: 荷兰语
- value: en
label:
en_US: English
zh_Hans: 英语
- value: et
label:
en_US: Estonian
zh_Hans: 爱沙尼亚语
- value: fi
label:
en_US: Finnish
zh_Hans: 芬兰语
- value: fr
label:
en_US: French
zh_Hans: 法语
- value: de
label:
en_US: German
zh_Hans: 德语
- value: el
label:
en_US: Greek
zh_Hans: 希腊语
- value: iw
label:
en_US: Hebrew
zh_Hans: 希伯来语
- value: hi
label:
en_US: Hindi
zh_Hans: 印地语
- value: hu
label:
en_US: Hungarian
zh_Hans: 匈牙利语
- value: id
label:
en_US: Indonesian
zh_Hans: 印尼语
- value: it
label:
en_US: Italian
zh_Hans: 意大利语
- value: jp
label:
en_US: Japanese
zh_Hans: 日语
- value: kn
label:
en_US: Kannada
zh_Hans: 卡纳达语
- value: ko
label:
en_US: Korean
zh_Hans: 韩语
- value: lv
label:
en_US: Latvian
zh_Hans: 拉脱维亚语
- value: lt
label:
en_US: Lithuanian
zh_Hans: 立陶宛语
- value: my
label:
en_US: Malay
zh_Hans: 马来语
- value: ml
label:
en_US: Malayalam
zh_Hans: 马拉雅拉姆语
- value: mr
label:
en_US: Marathi
zh_Hans: 马拉地语
- value: "no"
label:
en_US: Norwegian
zh_Hans: 挪威语
- value: pl
label:
en_US: Polish
zh_Hans: 波兰语
- value: pt-br
label:
en_US: Portuguese (Brazil)
zh_Hans: 葡萄牙语(巴西)
- value: pt-pt
label:
en_US: Portuguese (Portugal)
zh_Hans: 葡萄牙语(葡萄牙)
- value: pa
label:
en_US: Punjabi
zh_Hans: 旁遮普语
- value: ro
label:
en_US: Romanian
zh_Hans: 罗马尼亚语
- value: ru
label:
en_US: Russian
zh_Hans: 俄语
- value: sr
label:
en_US: Serbian
zh_Hans: 塞尔维亚语
- value: sk
label:
en_US: Slovak
zh_Hans: 斯洛伐克语
- value: sl
label:
en_US: Slovenian
zh_Hans: 斯洛文尼亚语
- value: es
label:
en_US: Spanish
zh_Hans: 西班牙语
- value: sv
label:
en_US: Swedish
zh_Hans: 瑞典语
- value: ta
label:
en_US: Tamil
zh_Hans: 泰米尔语
- value: te
label:
en_US: Telugu
zh_Hans: 泰卢固语
- value: th
label:
en_US: Thai
zh_Hans: 泰语
- value: tr
label:
en_US: Turkish
zh_Hans: 土耳其语
- value: uk
label:
en_US: Ukrainian
zh_Hans: 乌克兰语
- value: vi
label:
en_US: Vietnamese
zh_Hans: 越南语
- name: google_domain
type: string
required: false
label:
en_US: google_domain
zh_Hans: google_domain
human_description:
en_US: Defines the Google domain of the search. Default is "google.com".
zh_Hans: 定义搜索的 Google 域。默认为“google.com”。
llm_description: Defines Google domain in which you want to search.
form: llm
- name: num
type: number
required: false
label:
en_US: num
zh_Hans: num
human_description:
en_US: Specifies the number of results to display per page. Default is 10. Max number - 100, min - 1.
zh_Hans: 指定每页显示的结果数。默认值为 10。最大数量 - 100最小数量 - 1。
pt_BR: Specifies the number of results to display per page. Default is 10. Max number - 100, min - 1.
llm_description: Specifies the num of results to display per page.
form: llm

View File

@ -0,0 +1,72 @@
from typing import Any, Union
import requests
from core.tools.entities.tool_entities import ToolInvokeMessage
from core.tools.tool.builtin_tool import BuiltinTool
SEARCH_API_URL = "https://www.searchapi.io/api/v1/search"
class SearchAPI:
"""
SearchAPI tool provider.
"""
def __init__(self, api_key: str) -> None:
"""Initialize SearchAPI tool provider."""
self.searchapi_api_key = api_key
def run(self, video_id: str, language: str, **kwargs: Any) -> str:
"""Run video_id through SearchAPI and parse result."""
return self._process_response(self.results(video_id, language, **kwargs))
def results(self, video_id: str, language: str, **kwargs: Any) -> dict:
"""Run video_id through SearchAPI and return the raw result."""
params = self.get_params(video_id, language, **kwargs)
response = requests.get(
url=SEARCH_API_URL,
params=params,
headers={"Authorization": f"Bearer {self.searchapi_api_key}"},
)
response.raise_for_status()
return response.json()
def get_params(self, video_id: str, language: str, **kwargs: Any) -> dict[str, str]:
"""Get parameters for SearchAPI."""
return {
"engine": "youtube_transcripts",
"video_id": video_id,
"lang": language if language else "en",
**{key: value for key, value in kwargs.items() if value not in [None, ""]},
}
@staticmethod
def _process_response(res: dict) -> str:
"""Process response from SearchAPI."""
if "error" in res.keys():
raise ValueError(f"Got error from SearchApi: {res['error']}")
toret = ""
if "transcripts" in res.keys() and "text" in res["transcripts"][0].keys():
for item in res["transcripts"]:
toret += item["text"] + " "
if toret == "":
toret = "No good search result found"
return toret
class YoutubeTranscriptsTool(BuiltinTool):
def _invoke(self,
user_id: str,
tool_parameters: dict[str, Any],
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
"""
Invoke the SearchApi tool.
"""
video_id = tool_parameters['video_id']
language = tool_parameters.get('language', "en")
api_key = self.runtime.credentials['searchapi_api_key']
result = SearchAPI(api_key).run(video_id, language=language)
return self.create_text_message(text=result)

View File

@ -0,0 +1,34 @@
identity:
name: youtube_transcripts_api
author: SearchApi
label:
en_US: YouTube Transcripts API
zh_Hans: YouTube 脚本 API
description:
human:
en_US: A tool to retrieve transcripts from the specific YouTube video.
zh_Hans: 一种从特定 YouTube 视频检索文字记录的工具。
llm: A tool to retrieve transcripts from the specific YouTube video.
parameters:
- name: video_id
type: string
required: true
label:
en_US: video_id
zh_Hans: 视频ID
human_description:
en_US: Used to define the video you want to search. You can find the video id's in YouTube page that appears in URL. For example - https://www.youtube.com/watch?v=video_id.
zh_Hans: 用于定义要搜索的视频。您可以在 URL 中显示的 YouTube 页面中找到视频 ID。例如 - https://www.youtube.com/watch?v=video_id。
llm_description: Used to define the video you want to search.
form: llm
- name: language
type: string
required: false
label:
en_US: language
zh_Hans: 语言
human_description:
en_US: Used to set the language for transcripts. The default value is "en". You can find all supported languages in SearchApi documentation.
zh_Hans: 用于设置成绩单的语言。默认值为“en”。您可以在 SearchApi 文档中找到所有支持的语言。
llm_description: Used to set the language for transcripts.
form: llm