-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Execute type/param addition in GkeCodeExecutor #4111
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Summary of ChangesHello @SHRUTI6991, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request enhances the Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces a new execution path in GkeCodeExecutor to use agentic-sandbox, controlled by a new executor_type parameter. The changes are logical and the addition of unit tests for the new branching logic is great. My feedback focuses on improving robustness, configurability, and code quality. Key suggestions include pinning the new git dependency for build stability, making the sandbox template name configurable, ensuring consistent logger usage, fixing a potential type error, and making the executor type selection logic more robust.
| # go/keep-sorted start | ||
| "PyYAML>=6.0.2, <7.0.0", # For APIHubToolset. | ||
| "aiosqlite>=0.21.0", # For SQLite database | ||
| "agentic_sandbox @ git+https://github.com/kubernetes-sigs/agent-sandbox.git@main#subdirectory=clients/python/agentic-sandbox-client", # For Agent Sandboxed Code Execution |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The agentic_sandbox dependency is sourced directly from the main branch of a git repository. This can lead to non-reproducible builds and unexpected breakages when the main branch is updated. It's highly recommended to pin this dependency to a specific commit hash to ensure stability.
Additionally, the indentation for this line is inconsistent with the surrounding lines. It should be 2 spaces to match the other dependencies.
| "agentic_sandbox @ git+https://github.com/kubernetes-sigs/agent-sandbox.git@main#subdirectory=clients/python/agentic-sandbox-client", # For Agent Sandboxed Code Execution | |
| "agentic_sandbox @ git+https://github.com/kubernetes-sigs/agent-sandbox.git@<SPECIFIC_COMMIT_HASH>#subdirectory=clients/python/agentic-sandbox-client", # For Agent Sandboxed Code Execution |
|
|
||
| return CodeExecutionResult( | ||
| stdout=result.stdout, | ||
| stderr=result.stderr if result.stderr else None |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The stderr attribute of CodeExecutionResult is typed as str, but this expression can result in None if result.stderr is falsy (like an empty string or None). This could cause type errors in code that consumes this result. To ensure stderr is always a string, you can use result.stderr or "".
| stderr=result.stderr if result.stderr else None | |
| stderr=result.stderr or "" |
| """Executes code using Agent Sandbox Client.""" | ||
| try: | ||
| with SandboxClient( | ||
| template_name="python-sandbox-template", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The template_name for the SandboxClient is hardcoded as "python-sandbox-template". To improve flexibility and configurability, consider making this a class attribute of GkeCodeExecutor, similar to how image is handled for the job-based executor.
You could add this to the class attributes:
sandbox_template_name: str = "python-sandbox-template"And then use self.sandbox_template_name here.
| namespace=self.namespace | ||
| ) as sandbox: | ||
| # Execute the code as a python script | ||
| logging.debug("Executing code in sandbox:\n```\n%s\n```", code) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This file defines a module-level logger instance. For consistency and to ensure logs are correctly associated with this module, please use logger.debug instead of the global logging.debug.
| logging.debug("Executing code in sandbox:\n```\n%s\n```", code) | |
| logger.debug("Executing code in sandbox:\n```\n%s\n```", code) |
| """Overrides the base method to route execution based on executor_type.""" | ||
|
|
||
| code = code_execution_input.code | ||
|
|
||
| if self.executor_type == "sandbox": | ||
| return self._execute_in_sandbox(code) | ||
| else: | ||
| # Fallback to existing GKE Job logic | ||
| return self._execute_as_job(code, invocation_context) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This block has a couple of areas for improvement:
- Robustness: The logic defaults to the 'job' executor for any
executor_typethat is not 'sandbox'. This could hide configuration errors if an invalid type is provided. It would be more robust to explicitly check for 'job' and raise aValueErrorfor any unsupported types. - Style: There are extraneous indented blank lines (222, 224), which affects code style.
The suggested change addresses both points.
| """Overrides the base method to route execution based on executor_type.""" | |
| code = code_execution_input.code | |
| if self.executor_type == "sandbox": | |
| return self._execute_in_sandbox(code) | |
| else: | |
| # Fallback to existing GKE Job logic | |
| return self._execute_as_job(code, invocation_context) | |
| """Overrides the base method to route execution based on executor_type.""" | |
| code = code_execution_input.code | |
| if self.executor_type == "sandbox": | |
| return self._execute_in_sandbox(code) | |
| elif self.executor_type == "job": | |
| # Fallback to existing GKE Job logic | |
| return self._execute_as_job(code, invocation_context) | |
| else: | |
| raise ValueError(f"Unsupported executor_type: '{self.executor_type}'") |
Description:
Link to an existing issue (if applicable):
#3263
This PR is an initial draft for the changes made in
GkeCodeExecutorto add a new param calledexecutor_typewhich takes eitherjob/sandbox. CurrentlyGkeCodeExecutorcan only execute python code, so the changes made also focusses on executing ONLY python code via sandbox client.Testing Plan
Unit Tests:
Addition of new Unit tests to verify forking of code between
sandboxvsjob.Please include a summary of passed
pytestresults.-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
======================== 9 passed, 2 warnings in 2.72s =========================
Finished running tests!
Manual End-to-End (E2E) Tests:
Integration test by running a simple AI Agent: https://google.github.io/adk-docs/tools/google-cloud/gke-code-executor/ to write and execute Python code. The sandbox was connected via local tunnel for testing.
Output:
Checklist
Additional context
Add any other context or screenshots about the feature request here.