diff --git a/libs/partners/openai/langchain_openai/chat_models/base.py b/libs/partners/openai/langchain_openai/chat_models/base.py index 2950b8a9ce..dd1bfd4c84 100644 --- a/libs/partners/openai/langchain_openai/chat_models/base.py +++ b/libs/partners/openai/langchain_openai/chat_models/base.py @@ -5010,10 +5010,12 @@ def _construct_responses_api_input( input_.append(new_item) elif block_type == "reasoning": if lc_msg.response_metadata.get( + "output_version" + ) == "v1" and lc_msg.response_metadata.get( "model_provider" - ) == "openai" and ( - store is not False or block.get("encrypted_content") - ): + ) not in (None, "openai"): + continue + if store is not False or block.get("encrypted_content"): input_.append(_pop_index_and_sub_index(block)) elif block_type in ( "compaction", diff --git a/libs/partners/openai/tests/unit_tests/chat_models/test_base.py b/libs/partners/openai/tests/unit_tests/chat_models/test_base.py index fc116f2487..5155704c6f 100644 --- a/libs/partners/openai/tests/unit_tests/chat_models/test_base.py +++ b/libs/partners/openai/tests/unit_tests/chat_models/test_base.py @@ -3303,22 +3303,39 @@ def test__construct_responses_api_input_human_message_with_image_url_conversion( @pytest.mark.parametrize("provider", ["openai", "anthropic", None]) @pytest.mark.parametrize("store", [None, True, False]) +@pytest.mark.parametrize("output_version", ["v1", "responses/v1", None]) def test__construct_responses_api_input_reasoning_provider( - provider: str | None, store: bool | None + provider: str | None, store: bool | None, output_version: str | None ) -> None: message = AIMessage( content=[ {"type": "reasoning", "reasoning": "reasoning text"}, {"type": "text", "text": "answer"}, ], - response_metadata={"model_provider": provider, "output_version": "v1"}, + response_metadata={ + "model_provider": provider, + "output_version": output_version, + }, ) result = _construct_responses_api_input([message], store=store) reasoning = [item for item in result if item["type"] == "reasoning"] - assert bool(reasoning) == (provider == "openai" and store is not False) + assert bool(reasoning) == ( + (output_version != "v1" or provider in (None, "openai")) and store is not False + ) assert result[-1]["content"][0]["text"] == "answer" +def test__construct_responses_api_input_legacy_reasoning() -> None: + message = AIMessage( + content=[{"type": "text", "text": "answer"}], + additional_kwargs={ + "reasoning": {"type": "reasoning", "id": "rs_123", "summary": []}, + }, + ) + result = _construct_responses_api_input([message]) + assert {"type": "reasoning", "id": "rs_123", "summary": []} in result + + def test__construct_responses_api_input_store_false_replays_stateless_history() -> None: ai_message = AIMessage( content=[