Final_Assignment_Template / tools /code_execution.py
zeerafle's picture
Rename async method param from query to task in code_execution.py
818d867
from typing import Any, Optional
from langchain_core.callbacks import CallbackManagerForToolRun
from langchain_core.tools import BaseTool
from langchain_core.tools.base import ArgsSchema
from pydantic import BaseModel, Field
from google.genai.types import Tool, ToolCodeExecution, GenerateContentConfig, Content, Part
from google import genai
class CodeExecutionInput(BaseModel):
task: str = Field(description="The task to be executed")
class CodeExecutionTool(BaseTool):
name: str = "code_execution"
description: str = "Useful for generate and execute python code for a given task"
args_schema: Optional[ArgsSchema] = CodeExecutionInput
client: Any = None
model_id: str = "gemini-2.0-flash"
return_direct: bool = False
code_execution_tool: Any = None
def __init__(self, api_key: Optional[str] = None, **kwargs):
super().__init__(**kwargs)
self.client = genai.Client(api_key=api_key)
self.code_execution_tool = Tool(code_execution=ToolCodeExecution())
def _run(self, task: str, run_manager: Optional[CallbackManagerForToolRun]=None) -> str:
"""Generate and execute python code for a given task"""
try:
response = self.client.models.generate_content(
model=self.model_id,
contents=f"Task: {task} "
"Plan on how to solve the task. Generate and run code to solve the task.",
config=GenerateContentConfig(
tools=[self.code_execution_tool],
response_modalities=["TEXT"]
)
)
result = ""
for part in response.candidates[0].content.parts:
if part.executable_code is not None:
result += part.executable_code.code
if part.code_execution_result is not None:
result += "\n\n" + part.code_execution_result.output
return result
except Exception as e:
return f"Error performing code execution: {str(e)}"
async def _arun(self, task: str, run_manager: Optional[CallbackManagerForToolRun]=None) -> str:
"""Run the code execution tool asynchronously."""
return self._run(task, run_manager=run_manager.get_sync())
# Example usage
if __name__ == "__main__":
from dotenv import load_dotenv
# Load API key from environment variables
load_dotenv()
# Create the Google Search runnable
code_execution = CodeExecutionTool()
# Run a search query
result = code_execution.invoke({"task": "What is the sum of the first 50 prime numbers?"})
print(result)