| 
					
				 | 
			
			
				@@ -0,0 +1,44 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from typing import Any, Union 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import requests 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from core.tools.entities.tool_entities import ToolInvokeMessage 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from core.tools.tool.builtin_tool import BuiltinTool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+SERPER_API_URL = "https://google.serper.dev/search" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class SerperSearchTool(BuiltinTool): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def _parse_response(self, response: dict) -> dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if "knowledgeGraph" in response: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            result["title"] = response["knowledgeGraph"].get("title", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            result["description"] = response["knowledgeGraph"].get("description", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if "organic" in response: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            result["organic"] = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    "title": item.get("title", ""), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    "link": item.get("link", ""), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    "snippet": item.get("snippet", "") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for item in response["organic"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return result 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def _invoke(self, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                user_id: str, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tool_parameters: dict[str, Any], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        params = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "q": tool_parameters['query'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "gl": "us", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "hl": "en" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        headers = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             'X-API-KEY': self.runtime.credentials['serperapi_api_key'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             'Content-Type': 'application/json' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response = requests.get(url=SERPER_API_URL, params=params,headers=headers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response.raise_for_status() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        valuable_res = self._parse_response(response.json()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return self.create_json_message(valuable_res) 
			 |