fix: pass tools to llm.call() for native function calling support (fixes #4238) #4239
+544
−15
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
This PR fixes issue #4238 where Gemini models fail with
UNEXPECTED_TOOL_CALLerrors when used in hierarchical crews. The root cause was that tools were not being passed tollm.call()andllm.acall(), preventing native function calling support for models like Gemini that require tools to be declared upfront.Changes:
_extract_tools_from_context()helper function that extracts tools from executor context (CrewAgentExecutor.toolsorLiteAgent._parsed_tools) and converts them to dict formatget_llm_response()to extract and pass tools tollm.call()aget_llm_response()to extract and pass tools tollm.acall()executor_contextinaget_llm_response()to acceptLiteAgent | NoneImportant implementation detail: The
toolsparameter is only passed tollm.call()/llm.acall()when tools are actually available (not None). This maintains backward compatibility with existing code that checks"tools" in kwargsto determine if tools were provided.Review & Testing Checklist for Human
{name, description, args_schema}format. Confirm this is compatible with howllm.call()processes tools for Gemini and other providersgemini/gemini-2.0-flash-exp) to verify the fix resolves theUNEXPECTED_TOOL_CALLerrortoolswhen no tools are available doesn't break OpenAI, Anthropic, or other providersCrewAgentExecutorandLiteAgent- confirm both paths work correctlyRecommended test plan:
UNEXPECTED_TOOL_CALLerrors occurNotes