|  | @@ -0,0 +1,59 @@
 | 
	
		
			
				|  |  | +import json
 | 
	
		
			
				|  |  | +from typing import Any, Union
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import requests
 | 
	
		
			
				|  |  | +from httpx import post
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +from core.tools.entities.tool_entities import ToolInvokeMessage
 | 
	
		
			
				|  |  | +from core.tools.tool.builtin_tool import BuiltinTool
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class ExecuteCodeTool(BuiltinTool):
 | 
	
		
			
				|  |  | +    def _invoke(self, user_id: str, tool_parameters: dict[str, Any]) -> Union[ToolInvokeMessage, list[ToolInvokeMessage]]:
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        invoke tools
 | 
	
		
			
				|  |  | +        """
 | 
	
		
			
				|  |  | +        api_key = self.runtime.credentials['X-RapidAPI-Key']
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        url = "https://judge0-ce.p.rapidapi.com/submissions"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        querystring = {"base64_encoded": "false", "fields": "*"}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        headers = {
 | 
	
		
			
				|  |  | +            "Content-Type": "application/json",
 | 
	
		
			
				|  |  | +            "X-RapidAPI-Key": api_key,
 | 
	
		
			
				|  |  | +            "X-RapidAPI-Host": "judge0-ce.p.rapidapi.com"
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        payload = {
 | 
	
		
			
				|  |  | +            "language_id": tool_parameters['language_id'],
 | 
	
		
			
				|  |  | +            "source_code": tool_parameters['source_code'],
 | 
	
		
			
				|  |  | +            "stdin": tool_parameters.get('stdin', ''),
 | 
	
		
			
				|  |  | +            "expected_output": tool_parameters.get('expected_output', ''),
 | 
	
		
			
				|  |  | +            "additional_files": tool_parameters.get('additional_files', ''),
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        response = post(url, data=json.dumps(payload), headers=headers, params=querystring)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if response.status_code != 201:
 | 
	
		
			
				|  |  | +            raise Exception(response.text)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        token = response.json()['token']
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        url = f"https://judge0-ce.p.rapidapi.com/submissions/{token}"
 | 
	
		
			
				|  |  | +        headers = {
 | 
	
		
			
				|  |  | +            "X-RapidAPI-Key": api_key
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        response = requests.get(url, headers=headers)
 | 
	
		
			
				|  |  | +        if response.status_code == 200:
 | 
	
		
			
				|  |  | +            result = response.json()
 | 
	
		
			
				|  |  | +            return self.create_text_message(text=f"stdout: {result.get('stdout', '')}\n"
 | 
	
		
			
				|  |  | +                             f"stderr: {result.get('stderr', '')}\n"
 | 
	
		
			
				|  |  | +                             f"compile_output: {result.get('compile_output', '')}\n"
 | 
	
		
			
				|  |  | +                             f"message: {result.get('message', '')}\n"
 | 
	
		
			
				|  |  | +                             f"status: {result['status']['description']}\n"
 | 
	
		
			
				|  |  | +                             f"time: {result.get('time', '')} seconds\n"
 | 
	
		
			
				|  |  | +                             f"memory: {result.get('memory', '')} bytes")
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            return self.create_text_message(text=f"Error retrieving submission details: {response.text}")
 |