Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions llm_openai.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,12 @@ class ReasoningEffortEnum(str, Enum):
high = "high"


class ReasoningSummaryEnum(str, Enum):
auto = "auto"
concise = "concise"
detailed = "detailed"


class BaseOptions(Options):
max_output_tokens: Optional[int] = Field(
description=(
Expand Down Expand Up @@ -149,6 +155,14 @@ class ReasoningOptions(Options):
),
default=None,
)
reasoning_summary: Optional[ReasoningSummaryEnum] = Field(
description=(
"A summary of the reasoning performed by the model. This can be useful for "
"debugging and understanding the model's reasoning process. One of 'auto', "
"'concise', or 'detailed'."
),
default=None,
)


class _SharedResponses:
Expand Down Expand Up @@ -286,6 +300,17 @@ def _build_kwargs(self, prompt, conversation):
if value is not None:
kwargs[option] = value

# Build reasoning options if either effort or summary is specified
reasoning_effort = getattr(prompt.options, "reasoning_effort", None)
reasoning_summary = getattr(prompt.options, "reasoning_summary", None)
if reasoning_effort is not None or reasoning_summary is not None:
reasoning = {}
if reasoning_effort is not None:
reasoning["effort"] = reasoning_effort.value
if reasoning_summary is not None:
reasoning["summary"] = reasoning_summary.value
kwargs["reasoning"] = reasoning

if prompt.tools:
tool_defs = []
for tool in prompt.tools:
Expand Down
46 changes: 46 additions & 0 deletions tests/test_openai.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,49 @@ def simple_tool(number):
)
output = chain_response.text()
assert output == snapshot


def test_reasoning_options_in_kwargs():
"""Test that reasoning options are correctly passed to the API."""
model = llm.get_model("openai/gpt-5-mini")
prompt = llm.Prompt(
model=model,
prompt="What is 2+2?",
options=model.Options(reasoning_effort="high", reasoning_summary="auto")
)
kwargs = model._build_kwargs(prompt, conversation=None)

# Verify reasoning parameter is set correctly
assert "reasoning" in kwargs
assert kwargs["reasoning"]["effort"] == "high"
assert kwargs["reasoning"]["summary"] == "auto"


def test_reasoning_effort_only_in_kwargs():
"""Test that reasoning_effort works without reasoning_summary."""
model = llm.get_model("openai/gpt-5-mini")
prompt = llm.Prompt(
model=model,
prompt="What is 2+2?",
options=model.Options(reasoning_effort="medium")
)
kwargs = model._build_kwargs(prompt, conversation=None)

assert "reasoning" in kwargs
assert kwargs["reasoning"]["effort"] == "medium"
assert "summary" not in kwargs["reasoning"]


def test_reasoning_summary_only_in_kwargs():
"""Test that reasoning_summary works without reasoning_effort."""
model = llm.get_model("openai/gpt-5-mini")
prompt = llm.Prompt(
model=model,
prompt="What is 2+2?",
options=model.Options(reasoning_summary="detailed")
)
kwargs = model._build_kwargs(prompt, conversation=None)

assert "reasoning" in kwargs
assert kwargs["reasoning"]["summary"] == "detailed"
assert "effort" not in kwargs["reasoning"]