|  | @@ -0,0 +1,61 @@
 | 
	
		
			
				|  |  | +from core.tools.tool.builtin_tool import BuiltinTool
 | 
	
		
			
				|  |  | +from core.tools.entities.tool_entities import ToolInvokeMessage
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +from typing import Any, Dict, List, Union
 | 
	
		
			
				|  |  | +from os import path
 | 
	
		
			
				|  |  | +from requests import get
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +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]]:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +            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')
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        market = tool_parameters.get('market', 'US')
 | 
	
		
			
				|  |  | +        lang = tool_parameters.get('language', 'en')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        market_code = f'{lang}-{market}'
 | 
	
		
			
				|  |  | +        accept_language = f'{lang},{market_code};q=0.9'
 | 
	
		
			
				|  |  | +        headers = {
 | 
	
		
			
				|  |  | +            'Ocp-Apim-Subscription-Key': key,
 | 
	
		
			
				|  |  | +            'Accept-Language': accept_language
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        params = {
 | 
	
		
			
				|  |  | +            'q': query,
 | 
	
		
			
				|  |  | +            'mkt': market_code
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        response = get(server_url, headers=headers, params=params)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if response.status_code != 200:
 | 
	
		
			
				|  |  | +            raise Exception(f'Error {response.status_code}: {response.text}')
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        response = response.json()
 | 
	
		
			
				|  |  | +        # get the first 5 results
 | 
	
		
			
				|  |  | +        search_results = response['webPages']['value'][:5]
 | 
	
		
			
				|  |  | +        results = []
 | 
	
		
			
				|  |  | +        for result in search_results:
 | 
	
		
			
				|  |  | +            results.append(self.create_text_message(
 | 
	
		
			
				|  |  | +                text=f'{result["name"]}: {result["url"]}'
 | 
	
		
			
				|  |  | +            ))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return results
 | 
	
		
			
				|  |  | +        
 |