From 090b8f0659ab2cb6625b72b6673d32d049b1c03b Mon Sep 17 00:00:00 2001 From: Denis Shulyaka Date: Mon, 7 Jul 2025 19:07:28 +0300 Subject: [PATCH] Bump openai to 1.93.0 (#148350) --- .../openai_conversation/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- .../openai_conversation/test_conversation.py | 36 +++++++++++++++++-- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/openai_conversation/manifest.json b/homeassistant/components/openai_conversation/manifest.json index 84369eb15a2..d8c2c3a644c 100644 --- a/homeassistant/components/openai_conversation/manifest.json +++ b/homeassistant/components/openai_conversation/manifest.json @@ -8,5 +8,5 @@ "documentation": "https://www.home-assistant.io/integrations/openai_conversation", "integration_type": "service", "iot_class": "cloud_polling", - "requirements": ["openai==1.76.2"] + "requirements": ["openai==1.93.0"] } diff --git a/requirements_all.txt b/requirements_all.txt index 40a4ef46bc2..bfd989f849e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1597,7 +1597,7 @@ open-garage==0.2.0 open-meteo==0.3.2 # homeassistant.components.openai_conversation -openai==1.76.2 +openai==1.93.0 # homeassistant.components.openerz openerz-api==0.3.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 9bccc3393c7..78882ff5bd9 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1365,7 +1365,7 @@ open-garage==0.2.0 open-meteo==0.3.2 # homeassistant.components.openai_conversation -openai==1.76.2 +openai==1.93.0 # homeassistant.components.openerz openerz-api==0.3.0 diff --git a/tests/components/openai_conversation/test_conversation.py b/tests/components/openai_conversation/test_conversation.py index 8621465bd14..3d662cb0f00 100644 --- a/tests/components/openai_conversation/test_conversation.py +++ b/tests/components/openai_conversation/test_conversation.py @@ -35,6 +35,7 @@ from openai.types.responses import ( ResponseWebSearchCallSearchingEvent, ) from openai.types.responses.response import IncompleteDetails +from openai.types.responses.response_function_web_search import ActionSearch import pytest from syrupy.assertion import SnapshotAssertion @@ -95,10 +96,12 @@ def mock_create_stream() -> Generator[AsyncMock]: ) yield ResponseCreatedEvent( response=response, + sequence_number=0, type="response.created", ) yield ResponseInProgressEvent( response=response, + sequence_number=0, type="response.in_progress", ) response.status = "completed" @@ -123,16 +126,19 @@ def mock_create_stream() -> Generator[AsyncMock]: if response.status == "incomplete": yield ResponseIncompleteEvent( response=response, + sequence_number=0, type="response.incomplete", ) elif response.status == "failed": yield ResponseFailedEvent( response=response, + sequence_number=0, type="response.failed", ) else: yield ResponseCompletedEvent( response=response, + sequence_number=0, type="response.completed", ) @@ -301,7 +307,7 @@ async def test_incomplete_response( "OpenAI response failed: Rate limit exceeded", ), ( - ResponseErrorEvent(type="error", message="Some error"), + ResponseErrorEvent(type="error", message="Some error", sequence_number=0), "OpenAI response error: Some error", ), ], @@ -359,6 +365,7 @@ def create_message_item( status="in_progress", ), output_index=output_index, + sequence_number=0, type="response.output_item.added", ), ResponseContentPartAddedEvent( @@ -366,6 +373,7 @@ def create_message_item( item_id=id, output_index=output_index, part=content, + sequence_number=0, type="response.content_part.added", ), ] @@ -377,6 +385,7 @@ def create_message_item( delta=delta, item_id=id, output_index=output_index, + sequence_number=0, type="response.output_text.delta", ) for delta in text @@ -389,6 +398,7 @@ def create_message_item( item_id=id, output_index=output_index, text="".join(text), + sequence_number=0, type="response.output_text.done", ), ResponseContentPartDoneEvent( @@ -396,6 +406,7 @@ def create_message_item( item_id=id, output_index=output_index, part=content, + sequence_number=0, type="response.content_part.done", ), ResponseOutputItemDoneEvent( @@ -407,6 +418,7 @@ def create_message_item( type="message", ), output_index=output_index, + sequence_number=0, type="response.output_item.done", ), ] @@ -433,6 +445,7 @@ def create_function_tool_call_item( status="in_progress", ), output_index=output_index, + sequence_number=0, type="response.output_item.added", ) ] @@ -442,6 +455,7 @@ def create_function_tool_call_item( delta=delta, item_id=id, output_index=output_index, + sequence_number=0, type="response.function_call_arguments.delta", ) for delta in arguments @@ -452,6 +466,7 @@ def create_function_tool_call_item( arguments="".join(arguments), item_id=id, output_index=output_index, + sequence_number=0, type="response.function_call_arguments.done", ) ) @@ -467,6 +482,7 @@ def create_function_tool_call_item( status="completed", ), output_index=output_index, + sequence_number=0, type="response.output_item.done", ) ) @@ -485,6 +501,7 @@ def create_reasoning_item(id: str, output_index: int) -> list[ResponseStreamEven status=None, ), output_index=output_index, + sequence_number=0, type="response.output_item.added", ), ResponseOutputItemDoneEvent( @@ -495,6 +512,7 @@ def create_reasoning_item(id: str, output_index: int) -> list[ResponseStreamEven status=None, ), output_index=output_index, + sequence_number=0, type="response.output_item.done", ), ] @@ -505,31 +523,42 @@ def create_web_search_item(id: str, output_index: int) -> list[ResponseStreamEve return [ ResponseOutputItemAddedEvent( item=ResponseFunctionWebSearch( - id=id, status="in_progress", type="web_search_call" + id=id, + status="in_progress", + action=ActionSearch(query="query", type="search"), + type="web_search_call", ), output_index=output_index, + sequence_number=0, type="response.output_item.added", ), ResponseWebSearchCallInProgressEvent( item_id=id, output_index=output_index, + sequence_number=0, type="response.web_search_call.in_progress", ), ResponseWebSearchCallSearchingEvent( item_id=id, output_index=output_index, + sequence_number=0, type="response.web_search_call.searching", ), ResponseWebSearchCallCompletedEvent( item_id=id, output_index=output_index, + sequence_number=0, type="response.web_search_call.completed", ), ResponseOutputItemDoneEvent( item=ResponseFunctionWebSearch( - id=id, status="completed", type="web_search_call" + id=id, + status="completed", + action=ActionSearch(query="query", type="search"), + type="web_search_call", ), output_index=output_index, + sequence_number=0, type="response.output_item.done", ), ] @@ -588,6 +617,7 @@ async def test_function_call( "id": "rs_A", "summary": [], "type": "reasoning", + "encrypted_content": None, } assert result.response.response_type == intent.IntentResponseType.ACTION_DONE # Don't test the prompt, as it's not deterministic