Description
Please read this first
- Have you read the custom model provider docs, including the 'Common issues' section? Yes
- Have you searched for related issues? Yes
Describe the question
When using the Agents SDK with Google's Gemini API (OpenAI-compatible endpoint https://generativelanguage.googleapis.com/v1beta/openai/
) as a custom model provider, using the gemini-2.5-flash-preview-05-20
model with tools
specified in the Agent
leads to an AttributeError: 'NoneType' object has no attribute 'model_dump'
within the SDK's openai_chatcompletions.py
file.
This error occurs because the Gemini API returns a ChatCompletion
object where choices[0].message
is None
. Debugging reveals the finish_reason
for this None
message is content_filter: OTHER
.
Key observations:
- The
AttributeError
(and the underlyingNone
message withcontent_filter: OTHER
) does not occur with the oldergemini-2.5-flash-preview-04-17
model when tools are specified. - The
AttributeError
does not occur with thegemini-2.5-flash-preview-05-20
model iftools
are omitted from theAgent
initialization.
This suggests an issue with how the gemini-2.5-flash-preview-05-20
model (via its OpenAI-compatible API) handles requests that include the tools
parameter, leading to a response structure that causes an error in the Agents SDK.
Debug information
- Agents SDK version:
v0.0.16
(approximated, based on User-Agent during testing) - Python version: Python 3.12
- Relevant Traceback (from initial user report):
Traceback (most recent call last): File "c:\Users\S\Documents\Projects-2\DumbCompUse\agenttest copy.py", line 298, in main result = await Runner.run(agent, input=conversation, max_turns=100) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\S\AppData\Roaming\Python\Python312\site-packages\agents\run.py", line 218, in run input_guardrail_results, turn_result = await asyncio.gather( ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\S\AppData\Roaming\Python\Python312\site-packages\agents\run.py", line 762, in _run_single_turn new_response = await cls._get_new_response( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\S\AppData\Roaming\Python\Python312\site-packages\agents\run.py", line 921, in _get_new_response new_response = await model.get_response( ^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\S\AppData\Roaming\Python\Python312\site-packages\agents\models\openai_chatcompletions.py", line 78, in get_response f"LLM resp:\n{json.dumps(response.choices[0].message.model_dump(), indent=2)}\n" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'model_dump'
Repro steps
- Setup: Use
openai-agents
,openai
libraries. PointOpenAIChatCompletionsModel
to Gemini's OpenAI-compatible endpoint with a valid API key. - Script (ensure
openai_chatcompletions.py
is in its original state, without the manual error handling forNone
messages):import asyncio from openai import AsyncOpenAI from agents import Agent, Runner, function_tool, OpenAIChatCompletionsModel, set_tracing_disabled import logging # Set to logging.DEBUG to see underlying API responses if SDK is modified to not crash logging.basicConfig(level=logging.INFO) BASE_URL = "https://generativelanguage.googleapis.com/v1beta/openai/" API_KEY = "YOUR_GEMINI_API_KEY" # Replace with your actual key MODEL_WITH_ISSUE = "gemini-2.5-flash-preview-05-20" MODEL_WORKING_FINE = "gemini-2.5-flash-preview-04-17" # Test this model to see the AttributeError CURRENT_MODEL_TO_TEST = MODEL_WITH_ISSUE client = AsyncOpenAI(base_url=BASE_URL, api_key=API_KEY) set_tracing_disabled(True) # Keep it simple @function_tool def get_weather(city: str): """Gets the current weather.""" return f"The weather in {city} is sunny." async def main(): print(f"--- Testing: {CURRENT_MODEL_TO_TEST} with tools (expecting AttributeError) ---") agent = Agent( name="TestBot", model=OpenAIChatCompletionsModel(model=CURRENT_MODEL_TO_TEST, openai_client=client), tools=[get_weather], instructions="Respond in haikus." ) try: result = await Runner.run(agent, "What is the weather in Tokyo?") print(f"Output (with tools): {result.final_output if result else 'None - this should not be reached if AttributeError occurs'}") except AttributeError as e: print(f"Caught expected AttributeError: {e}") except Exception as e: print(f"Caught other exception: {e}") # For comparison, this works: print(f"\n--- Testing: {MODEL_WORKING_FINE} with tools (expected to work) ---") agent_ok = Agent( name="TestBotOK", model=OpenAIChatCompletionsModel(model=MODEL_WORKING_FINE, openai_client=client), tools=[get_weather], instructions="Respond in haikus." ) result_ok = await Runner.run(agent_ok, "What is the weather in Tokyo?") print(f"Output (MODEL_WORKING_FINE with tools): {result_ok.final_output if result_ok else 'None'}") asyncio.run(main())
- Run: Execute the script with
CURRENT_MODEL_TO_TEST
set toMODEL_WITH_ISSUE
. - Observed: The script raises
AttributeError: 'NoneType' object has no attribute 'model_dump'
atagents\models\openai_chatcompletions.py", line 78
. If the SDK is modified to inspect the response before this line, it's seen thatresponse.choices[0].message
isNone
andresponse.choices[0].finish_reason
iscontent_filter: OTHER
.
Expected behavior
The gemini-2.5-flash-preview-05-20
model, when used with the Agents SDK via its OpenAI-compatible endpoint and with tools
specified, should return a ChatCompletion
object where choices[0].message
is properly populated (with text content or tool_calls
). This would prevent the AttributeError
in the SDK and allow for normal tool use, consistent with gemini-2.5-flash-preview-04-17
or when tools are omitted for the 05-20
model. The API should not return a None
message with content_filter: OTHER
solely due to the presence of the tools
parameter for innocuous prompts.