chore(openai): fix broken vcr cassette playback and add ci guard (#36502)

Fix broken VCR cassette playback in `langchain-openai` integration tests
and add a CI job to prevent regressions. Two independent bugs made all
VCR-backed tests fail: `before_record_request` redacts URIs to
`**REDACTED**` but `match_on` still included `uri` (so playback never
matched), and a typo-fix commit (`c9f51aef85`) changed test input
strings without re-recording cassettes (so `json_body` matching also
failed).
This commit is contained in:
Mason Daugherty
2026-04-03 12:55:52 -04:00
committed by GitHub
parent 8c15649127
commit deb85b6c4c
6 changed files with 111 additions and 7 deletions

View File

@@ -32,7 +32,9 @@ def vcr_config() -> dict:
"""Extend the default configuration coming from langchain_tests."""
config = base_vcr_config()
config["match_on"] = [
m if m != "body" else "json_body" for m in config.get("match_on", [])
m if m != "body" else "json_body"
for m in config.get("match_on", [])
if m != "uri"
]
config.setdefault("filter_headers", []).extend(_EXTRA_HEADERS)
config["before_record_request"] = remove_request_headers

View File

@@ -182,13 +182,13 @@ def test_function_calling(output_version: Literal["v0", "responses/v1", "v1"]) -
llm = ChatOpenAI(model=MODEL_NAME, output_version=output_version)
bound_llm = llm.bind_tools([multiply, {"type": "web_search_preview"}])
ai_msg = cast(AIMessage, bound_llm.invoke("what's 5 * 4"))
ai_msg = cast(AIMessage, bound_llm.invoke("whats 5 * 4"))
assert len(ai_msg.tool_calls) == 1
assert ai_msg.tool_calls[0]["name"] == "multiply"
assert set(ai_msg.tool_calls[0]["args"]) == {"x", "y"}
full: Any = None
for chunk in bound_llm.stream("what's 5 * 4"):
for chunk in bound_llm.stream("whats 5 * 4"):
assert isinstance(chunk, AIMessageChunk)
full = chunk if full is None else full + chunk
assert len(full.tool_calls) == 1
@@ -416,7 +416,7 @@ def test_function_calling_and_structured_output(schema: Any) -> None:
assert parsed == response.additional_kwargs["parsed"]
# Test function calling
ai_msg = cast(AIMessage, bound_llm.invoke("what's 5 * 4"))
ai_msg = cast(AIMessage, bound_llm.invoke("whats 5 * 4"))
assert len(ai_msg.tool_calls) == 1
assert ai_msg.tool_calls[0]["name"] == "multiply"
assert set(ai_msg.tool_calls[0]["args"]) == {"x", "y"}
@@ -555,7 +555,7 @@ def test_stream_reasoning_summary(
)
message_1 = {
"role": "user",
"content": "What was the third tallest building in the year 2000?",
"content": "What was the third tallest buliding in the year 2000?",
}
response_1: BaseMessageChunk | None = None
for chunk in llm.stream([message_1]):