-
Notifications
You must be signed in to change notification settings - Fork 2.7k
fix: 'NoneType' object is not iterable #3988
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?
fix: 'NoneType' object is not iterable #3988
Conversation
|
Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA). View this failed invocation of the CLA check for more information. For the most up to date status, view the checks section at the bottom of the pull request. |
Summary of ChangesHello @ananthanarayanan-28, 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 resolves a critical 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 fixes a TypeError that occurs when last_content.parts is None. The fix involves checking for None and providing an empty list as a fallback. A unit test is also added to verify the fix.
My review focuses on simplifying the implementation. The current change, while effective, introduces unnecessary complexity and a subtle change in behavior regarding the handling of empty strings. I've suggested a more concise and readable implementation that preserves the original logic while still fixing the bug. The changes are duplicated across two files, and my feedback applies to both.
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
|
Hi @ananthanarayanan-28, Thank you for your contribution! We appreciate you taking the time to submit this pull request. |
|
@ryanaiagent can you check now, done with lint errors |
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 effectively addresses a TypeError that occurs when last_content.parts is None. The fix, which provides an empty list as a fallback, is correct and has been applied to both AgentTool and GoogleSearchAgentTool. A new unit test has been added to verify this fix, which is great. I've made a couple of suggestions to make the code slightly more concise by inlining the fallback logic. Overall, this is a good fix.
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
|
@ryanaiagent @adk-bot any updates on this PR? |
|
/gemini review. |
|
It looks like you might be trying to invoke a command. To do so, please use Here's the full help message for reference: 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. |
|
/gemini review. |
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 correctly fixes a TypeError that occurs when last_content.parts is None by providing an empty list as a fallback. The fix is applied in both AgentTool and GoogleSearchAgentTool, and a new unit test is added to verify this behavior, which is great. My review includes feedback on a potential resource leak and significant code duplication in GoogleSearchAgentTool, with suggestions for improvement.
| if not last_content: | ||
| return '' | ||
| merged_text = '\n'.join(p.text for p in last_content.parts if p.text) | ||
| merged_text = '\n'.join(p.text for p in (last_content.parts or []) if p.text) |
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.
I noticed that this run_async method is missing a call to await runner.close() after the async with Aclosing(...) block (around line 125).
The parent class AgentTool includes this call, and a comment there highlights its importance for resource cleanup:
# Clean up runner resources (especially MCP sessions)
# to avoid "Attempted to exit cancel scope in a different task" errors
await runner.close()The absence of this call could lead to resource leaks. Please add await runner.close() before the if not last_content: check.
| if not last_content: | ||
| return '' | ||
| merged_text = '\n'.join(p.text for p in last_content.parts if p.text) | ||
| merged_text = '\n'.join(p.text for p in (last_content.parts or []) if p.text) |
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 run_async method is almost a complete copy of AgentTool.run_async. This code duplication makes the code harder to maintain, as bugs (like the one this PR fixes) need to be fixed in multiple places.
Since you are already modifying this code, it would be a great opportunity to refactor and reduce duplication. One approach could be to make AgentTool.run_async more extensible so that this method can call super().run_async() and then just add its specific logic for grounding_metadata.
Link to Issue or Description of Change
1. Link to an existing issue (if applicable):
2. Or, if no issue exists, describe the change:
Problem:
Idea about my use case
I'm building the report generation system using google-ask (1.18.0) and building multiple subagents here, I'm passing the one subagent Agent as a tool to another Parent Agent. Note: Sub-agent can do web search.
here, parent agent triggers multiple sub-agent (same agent) multiple times according to use case or complexity of the user input
Describe the bug
here, the bug sometimes sub agents doesn't provide the proper output and resulted in the
Solution:
Creating fallback if there is no last_content.parts it will return the empty parts so we won't face the NoneType issue
Testing Plan
Created a unit test file for this issue
test_google_search_agent_tool_repro.py
Unit Tests:
Please include a summary of passed
pytestresults.3677 passed, 2208 warnings in 42.64s
Manual End-to-End (E2E) Tests:
N/A
Checklist
Additional context
N/A