From 20b80a1ef8916b0de974a0b43c545feddd31c54c Mon Sep 17 00:00:00 2001 From: Chester Curme Date: Thu, 10 Jul 2025 15:16:24 -0400 Subject: [PATCH] enable code interpreter test for v1 --- .../langchain_openai/chat_models/_compat.py | 8 ++- .../cassettes/test_code_interpreter.yaml.gz | Bin 6973 -> 6805 bytes .../chat_models/test_responses_api.py | 49 ++++++++++++++---- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/libs/partners/openai/langchain_openai/chat_models/_compat.py b/libs/partners/openai/langchain_openai/chat_models/_compat.py index e9dac4bf0cd..c025beafcc7 100644 --- a/libs/partners/openai/langchain_openai/chat_models/_compat.py +++ b/libs/partners/openai/langchain_openai/chat_models/_compat.py @@ -482,10 +482,16 @@ def _implode_reasoning_blocks(blocks: list[dict[str, Any]]) -> Iterable[dict[str block = blocks[i] # Ordinary block – just yield a shallow copy - if block.get("type") != "reasoning" or "reasoning" not in block: + if block.get("type") != "reasoning": yield dict(block) i += 1 continue + elif "reasoning" not in block: + yield {**block, "summary": []} + i += 1 + continue + else: + pass summary: list[dict[str, str]] = [ {"type": "summary_text", "text": block.get("reasoning", "")} diff --git a/libs/partners/openai/tests/cassettes/test_code_interpreter.yaml.gz b/libs/partners/openai/tests/cassettes/test_code_interpreter.yaml.gz index 924ecc6cdddaacf93d5e44c65abaa91988732ad1..b8268a209665010d6ccc0ea48723f66719d05315 100644 GIT binary patch literal 6805 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 DBc7v;}BHRi1 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 PI=k`z+D5vfHHrWLp5~$| diff --git a/libs/partners/openai/tests/integration_tests/chat_models/test_responses_api.py b/libs/partners/openai/tests/integration_tests/chat_models/test_responses_api.py index 7be381bc6cd..abe7afb706a 100644 --- a/libs/partners/openai/tests/integration_tests/chat_models/test_responses_api.py +++ b/libs/partners/openai/tests/integration_tests/chat_models/test_responses_api.py @@ -455,9 +455,15 @@ def test_stream_reasoning_summary( assert isinstance(response_2, AIMessage) +@pytest.mark.default_cassette("test_code_interpreter.yaml.gz") @pytest.mark.vcr -def test_code_interpreter() -> None: - llm = ChatOpenAI(model="o4-mini", use_responses_api=True) +@pytest.mark.parametrize("output_version", ["v0", "responses/v1", "v1"]) +def test_code_interpreter( + output_version: Literal["v0", "responses/v1", "v1"], +) -> None: + llm = ChatOpenAI( + model="o4-mini", use_responses_api=True, output_version=output_version + ) llm_with_tools = llm.bind_tools( [{"type": "code_interpreter", "container": {"type": "auto"}}] ) @@ -467,14 +473,26 @@ def test_code_interpreter() -> None: } response = llm_with_tools.invoke([input_message]) _check_response(response) - tool_outputs = response.additional_kwargs["tool_outputs"] - assert tool_outputs - assert any(output["type"] == "code_interpreter_call" for output in tool_outputs) + if output_version == "v0": + tool_outputs = [ + item + for item in response.additional_kwargs["tool_outputs"] + if item["type"] == "code_interpreter_call" + ] + elif output_version == "responses/v1": + tool_outputs = [ + item for item in response.content if item["type"] == "code_interpreter_call" + ] + else: + # v1 + tool_outputs = [ + item["value"] for item in response.content if item["type"] == "non_standard" + ] + assert tool_outputs[0]["type"] == "code_interpreter_call" + assert len(tool_outputs) == 1 # Test streaming # Use same container - tool_outputs = response.additional_kwargs["tool_outputs"] - assert len(tool_outputs) == 1 container_id = tool_outputs[0]["container_id"] llm_with_tools = llm.bind_tools( [{"type": "code_interpreter", "container": container_id}] @@ -485,9 +503,22 @@ def test_code_interpreter() -> None: assert isinstance(chunk, AIMessageChunk) full = chunk if full is None else full + chunk assert isinstance(full, AIMessageChunk) - tool_outputs = full.additional_kwargs["tool_outputs"] + if output_version == "v0": + tool_outputs = [ + item + for item in response.additional_kwargs["tool_outputs"] + if item["type"] == "code_interpreter_call" + ] + elif output_version == "responses/v1": + tool_outputs = [ + item for item in response.content if item["type"] == "code_interpreter_call" + ] + else: + tool_outputs = [ + item["value"] for item in response.content if item["type"] == "non_standard" + ] + assert tool_outputs[0]["type"] == "code_interpreter_call" assert tool_outputs - assert any(output["type"] == "code_interpreter_call" for output in tool_outputs) # Test we can pass back in next_message = {"role": "user", "content": "Please add more comments to the code."}