|
|
|
|
@ -10,53 +10,23 @@ from core.tools.tool.builtin_tool import BuiltinTool
|
|
|
|
|
class BingSearchTool(BuiltinTool):
|
|
|
|
|
url = 'https://api.bing.microsoft.com/v7.0/search'
|
|
|
|
|
|
|
|
|
|
def _invoke(self,
|
|
|
|
|
user_id: str,
|
|
|
|
|
tool_parameters: dict[str, Any],
|
|
|
|
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
|
|
|
|
def _invoke_bing(self,
|
|
|
|
|
user_id: str,
|
|
|
|
|
subscription_key: str, query: str, limit: int,
|
|
|
|
|
result_type: str, market: str, lang: str,
|
|
|
|
|
filters: list[str]) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
|
|
|
|
"""
|
|
|
|
|
invoke tools
|
|
|
|
|
invoke bing search
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
key = self.runtime.credentials.get('subscription_key', None)
|
|
|
|
|
if not key:
|
|
|
|
|
raise Exception('subscription_key is required')
|
|
|
|
|
|
|
|
|
|
server_url = self.runtime.credentials.get('server_url', None)
|
|
|
|
|
if not server_url:
|
|
|
|
|
server_url = self.url
|
|
|
|
|
|
|
|
|
|
query = tool_parameters.get('query', None)
|
|
|
|
|
if not query:
|
|
|
|
|
raise Exception('query is required')
|
|
|
|
|
|
|
|
|
|
limit = min(tool_parameters.get('limit', 5), 10)
|
|
|
|
|
result_type = tool_parameters.get('result_type', 'text') or 'text'
|
|
|
|
|
|
|
|
|
|
market = tool_parameters.get('market', 'US')
|
|
|
|
|
lang = tool_parameters.get('language', 'en')
|
|
|
|
|
filter = []
|
|
|
|
|
|
|
|
|
|
if tool_parameters.get('enable_computation', False):
|
|
|
|
|
filter.append('Computation')
|
|
|
|
|
if tool_parameters.get('enable_entities', False):
|
|
|
|
|
filter.append('Entities')
|
|
|
|
|
if tool_parameters.get('enable_news', False):
|
|
|
|
|
filter.append('News')
|
|
|
|
|
if tool_parameters.get('enable_related_search', False):
|
|
|
|
|
filter.append('RelatedSearches')
|
|
|
|
|
if tool_parameters.get('enable_webpages', False):
|
|
|
|
|
filter.append('WebPages')
|
|
|
|
|
|
|
|
|
|
market_code = f'{lang}-{market}'
|
|
|
|
|
accept_language = f'{lang},{market_code};q=0.9'
|
|
|
|
|
headers = {
|
|
|
|
|
'Ocp-Apim-Subscription-Key': key,
|
|
|
|
|
'Ocp-Apim-Subscription-Key': subscription_key,
|
|
|
|
|
'Accept-Language': accept_language
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
query = quote(query)
|
|
|
|
|
server_url = f'{server_url}?q={query}&mkt={market_code}&count={limit}&responseFilter={",".join(filter)}'
|
|
|
|
|
server_url = f'{self.url}?q={query}&mkt={market_code}&count={limit}&responseFilter={",".join(filters)}'
|
|
|
|
|
response = get(server_url, headers=headers)
|
|
|
|
|
|
|
|
|
|
if response.status_code != 200:
|
|
|
|
|
@ -124,3 +94,105 @@ class BingSearchTool(BuiltinTool):
|
|
|
|
|
text += f'{related["displayText"]} - {related["webSearchUrl"]}\n'
|
|
|
|
|
|
|
|
|
|
return self.create_text_message(text=self.summary(user_id=user_id, content=text))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def validate_credentials(self, credentials: dict[str, Any], tool_parameters: dict[str, Any]) -> None:
|
|
|
|
|
key = credentials.get('subscription_key', None)
|
|
|
|
|
if not key:
|
|
|
|
|
raise Exception('subscription_key is required')
|
|
|
|
|
|
|
|
|
|
server_url = credentials.get('server_url', None)
|
|
|
|
|
if not server_url:
|
|
|
|
|
server_url = self.url
|
|
|
|
|
|
|
|
|
|
query = tool_parameters.get('query', None)
|
|
|
|
|
if not query:
|
|
|
|
|
raise Exception('query is required')
|
|
|
|
|
|
|
|
|
|
limit = min(tool_parameters.get('limit', 5), 10)
|
|
|
|
|
result_type = tool_parameters.get('result_type', 'text') or 'text'
|
|
|
|
|
|
|
|
|
|
market = tool_parameters.get('market', 'US')
|
|
|
|
|
lang = tool_parameters.get('language', 'en')
|
|
|
|
|
filter = []
|
|
|
|
|
|
|
|
|
|
if credentials.get('allow_entities', False):
|
|
|
|
|
filter.append('Entities')
|
|
|
|
|
|
|
|
|
|
if credentials.get('allow_computation', False):
|
|
|
|
|
filter.append('Computation')
|
|
|
|
|
|
|
|
|
|
if credentials.get('allow_news', False):
|
|
|
|
|
filter.append('News')
|
|
|
|
|
|
|
|
|
|
if credentials.get('allow_related_searches', False):
|
|
|
|
|
filter.append('RelatedSearches')
|
|
|
|
|
|
|
|
|
|
if credentials.get('allow_web_pages', False):
|
|
|
|
|
filter.append('WebPages')
|
|
|
|
|
|
|
|
|
|
if not filter:
|
|
|
|
|
raise Exception('At least one filter is required')
|
|
|
|
|
|
|
|
|
|
self._invoke_bing(
|
|
|
|
|
user_id='test',
|
|
|
|
|
subscription_key=key,
|
|
|
|
|
query=query,
|
|
|
|
|
limit=limit,
|
|
|
|
|
result_type=result_type,
|
|
|
|
|
market=market,
|
|
|
|
|
lang=lang,
|
|
|
|
|
filters=filter
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def _invoke(self,
|
|
|
|
|
user_id: str,
|
|
|
|
|
tool_parameters: dict[str, Any],
|
|
|
|
|
) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
|
|
|
|
|
"""
|
|
|
|
|
invoke tools
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
key = self.runtime.credentials.get('subscription_key', None)
|
|
|
|
|
if not key:
|
|
|
|
|
raise Exception('subscription_key is required')
|
|
|
|
|
|
|
|
|
|
server_url = self.runtime.credentials.get('server_url', None)
|
|
|
|
|
if not server_url:
|
|
|
|
|
server_url = self.url
|
|
|
|
|
|
|
|
|
|
query = tool_parameters.get('query', None)
|
|
|
|
|
if not query:
|
|
|
|
|
raise Exception('query is required')
|
|
|
|
|
|
|
|
|
|
limit = min(tool_parameters.get('limit', 5), 10)
|
|
|
|
|
result_type = tool_parameters.get('result_type', 'text') or 'text'
|
|
|
|
|
|
|
|
|
|
market = tool_parameters.get('market', 'US')
|
|
|
|
|
lang = tool_parameters.get('language', 'en')
|
|
|
|
|
filter = []
|
|
|
|
|
|
|
|
|
|
if tool_parameters.get('enable_computation', False):
|
|
|
|
|
filter.append('Computation')
|
|
|
|
|
if tool_parameters.get('enable_entities', False):
|
|
|
|
|
filter.append('Entities')
|
|
|
|
|
if tool_parameters.get('enable_news', False):
|
|
|
|
|
filter.append('News')
|
|
|
|
|
if tool_parameters.get('enable_related_search', False):
|
|
|
|
|
filter.append('RelatedSearches')
|
|
|
|
|
if tool_parameters.get('enable_webpages', False):
|
|
|
|
|
filter.append('WebPages')
|
|
|
|
|
|
|
|
|
|
if not filter:
|
|
|
|
|
raise Exception('At least one filter is required')
|
|
|
|
|
|
|
|
|
|
return self._invoke_bing(
|
|
|
|
|
user_id=user_id,
|
|
|
|
|
subscription_key=key,
|
|
|
|
|
query=query,
|
|
|
|
|
limit=limit,
|
|
|
|
|
result_type=result_type,
|
|
|
|
|
market=market,
|
|
|
|
|
lang=lang,
|
|
|
|
|
filters=filter
|
|
|
|
|
)
|