Skip to content

Commit c1c3e13

Browse files
authored
openai[patch]: add Responses API attributes to BaseChatOpenAI (#30329)
`reasoning`, `include`, `store`, `truncation`. Previously these had to be added through `model_kwargs`.
1 parent b610859 commit c1c3e13

File tree

3 files changed

+65
-10
lines changed

3 files changed

+65
-10
lines changed

libs/langchain/tests/unit_tests/chat_models/test_base.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,10 @@ def test_configurable() -> None:
116116
"request_timeout": None,
117117
"max_retries": None,
118118
"presence_penalty": None,
119+
"reasoning": None,
119120
"reasoning_effort": None,
120121
"frequency_penalty": None,
122+
"include": None,
121123
"seed": None,
122124
"service_tier": None,
123125
"logprobs": None,
@@ -126,11 +128,13 @@ def test_configurable() -> None:
126128
"streaming": False,
127129
"n": None,
128130
"top_p": None,
131+
"truncation": None,
129132
"max_tokens": None,
130133
"tiktoken_model_name": None,
131134
"default_headers": None,
132135
"default_query": None,
133136
"stop": None,
137+
"store": None,
134138
"extra_body": None,
135139
"include_response_headers": False,
136140
"stream_usage": False,

libs/partners/openai/langchain_openai/chat_models/base.py

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -502,15 +502,31 @@ class BaseChatOpenAI(BaseChatModel):
502502
max_tokens: Optional[int] = Field(default=None)
503503
"""Maximum number of tokens to generate."""
504504
reasoning_effort: Optional[str] = None
505-
"""Constrains effort on reasoning for reasoning models.
506-
507-
Reasoning models only, like OpenAI o1 and o3-mini.
505+
"""Constrains effort on reasoning for reasoning models. For use with the Chat
506+
Completions API.
507+
508+
Reasoning models only, like OpenAI o1, o3, and o4-mini.
508509
509510
Currently supported values are low, medium, and high. Reducing reasoning effort
510511
can result in faster responses and fewer tokens used on reasoning in a response.
511-
512+
512513
.. versionadded:: 0.2.14
513514
"""
515+
reasoning: Optional[dict[str, Any]] = None
516+
"""Reasoning parameters for reasoning models, i.e., OpenAI o-series models (o1, o3,
517+
o4-mini, etc.). For use with the Responses API.
518+
519+
Example:
520+
521+
.. code-block:: python
522+
523+
reasoning={
524+
"effort": "medium", # can be "low", "medium", or "high"
525+
"summary": "auto", # can be "auto", "concise", or "detailed"
526+
}
527+
528+
.. versionadded:: 0.3.24
529+
"""
514530
tiktoken_model_name: Optional[str] = None
515531
"""The model name to pass to tiktoken when using this class.
516532
Tiktoken is used to count the number of tokens in documents to constrain
@@ -556,11 +572,41 @@ class BaseChatOpenAI(BaseChatModel):
556572
However this does not prevent a user from directly passed in the parameter during
557573
invocation.
558574
"""
575+
576+
include: Optional[list[str]] = None
577+
"""Additional fields to include in generations from Responses API.
578+
579+
Supported values:
580+
581+
- ``"file_search_call.results"``
582+
- ``"message.input_image.image_url"``
583+
- ``"computer_call_output.output.image_url"``
584+
- ``"reasoning.encrypted_content"``
585+
- ``"code_interpreter_call.outputs"``
586+
587+
.. versionadded:: 0.3.24
588+
"""
589+
559590
service_tier: Optional[str] = None
560591
"""Latency tier for request. Options are 'auto', 'default', or 'flex'. Relevant
561592
for users of OpenAI's scale tier service.
562593
"""
563594

595+
store: Optional[bool] = None
596+
"""If True, the Responses API may store response data for future use. Defaults to
597+
True.
598+
599+
.. versionadded:: 0.3.24
600+
"""
601+
602+
truncation: Optional[str] = None
603+
"""Truncation strategy (Responses API). Can be ``"auto"`` or ``"disabled"``
604+
(default). If ``"auto"``, model may drop input items from the middle of the
605+
message sequence to fit the context window.
606+
607+
.. versionadded:: 0.3.24
608+
"""
609+
564610
use_responses_api: Optional[bool] = None
565611
"""Whether to use the Responses API instead of the Chat API.
566612
@@ -685,7 +731,11 @@ def _default_params(self) -> dict[str, Any]:
685731
"n": self.n,
686732
"temperature": self.temperature,
687733
"reasoning_effort": self.reasoning_effort,
734+
"reasoning": self.reasoning,
735+
"include": self.include,
688736
"service_tier": self.service_tier,
737+
"truncation": self.truncation,
738+
"store": self.store,
689739
}
690740

691741
params = {
@@ -3134,7 +3184,7 @@ def _construct_responses_api_payload(
31343184
for legacy_token_param in ["max_tokens", "max_completion_tokens"]:
31353185
if legacy_token_param in payload:
31363186
payload["max_output_tokens"] = payload.pop(legacy_token_param)
3137-
if "reasoning_effort" in payload:
3187+
if "reasoning_effort" in payload and "reasoning" not in payload:
31383188
payload["reasoning"] = {"effort": payload.pop("reasoning_effort")}
31393189

31403190
payload["input"] = _construct_responses_api_input(messages)

libs/partners/openai/tests/integration_tests/chat_models/test_responses_api.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ def test_route_from_model_kwargs() -> None:
323323

324324
@pytest.mark.flaky(retries=3, delay=1)
325325
def test_computer_calls() -> None:
326-
llm = ChatOpenAI(model="computer-use-preview", model_kwargs={"truncation": "auto"})
326+
llm = ChatOpenAI(model="computer-use-preview", truncation="auto")
327327
tool = {
328328
"type": "computer_use_preview",
329329
"display_width": 1024,
@@ -354,10 +354,10 @@ def test_file_search() -> None:
354354

355355

356356
def test_stream_reasoning_summary() -> None:
357-
reasoning = {"effort": "medium", "summary": "auto"}
358-
359357
llm = ChatOpenAI(
360-
model="o4-mini", use_responses_api=True, model_kwargs={"reasoning": reasoning}
358+
model="o4-mini",
359+
use_responses_api=True,
360+
reasoning={"effort": "medium", "summary": "auto"},
361361
)
362362
message_1 = {"role": "user", "content": "What is 3^3?"}
363363
response_1: Optional[BaseMessageChunk] = None
@@ -465,7 +465,8 @@ def test_mcp_builtin_zdr() -> None:
465465
llm = ChatOpenAI(
466466
model="o4-mini",
467467
use_responses_api=True,
468-
model_kwargs={"store": False, "include": ["reasoning.encrypted_content"]},
468+
store=False,
469+
include=["reasoning.encrypted_content"],
469470
)
470471

471472
llm_with_tools = llm.bind_tools(

0 commit comments

Comments
 (0)