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
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
from openai.types.chat import ChatCompletionToolChoiceOptionParam, completion_create_params

from .models import (
_REASONING_EFFORT_NONE_MODELS,
CerebrasChatModels,
ChatModels,
CometAPIChatModels,
Expand All @@ -59,6 +60,11 @@

lk_oai_debug = int(os.getenv("LK_OPENAI_DEBUG", 0))

# models that reject any reasoning_effort value but "none" once function tools are attached
_REASONING_EFFORT_TOOL_REQUIRES_NONE_MODELS: frozenset[str] = frozenset(
{"gpt-5.6", "gpt-5.6-luna", "gpt-5.6-sol", "gpt-5.6-terra"}
)

Verbosity = Literal["low", "medium", "high"]
PromptCacheRetention = Literal["in_memory", "24h"]

Expand Down Expand Up @@ -124,7 +130,7 @@ def __init__(
super().__init__()

if not is_given(reasoning_effort) and _supports_reasoning_effort(model):
if model in ["gpt-5.1", "gpt-5.2", "gpt-5.4", "gpt-5.4-mini"]:
if model in _REASONING_EFFORT_NONE_MODELS:
reasoning_effort = "none"
else:
reasoning_effort = "minimal"
Expand Down Expand Up @@ -1025,6 +1031,9 @@ def chat(
if is_given(response_format):
extra["response_format"] = llm_utils.to_openai_response_format(response_format) # type: ignore

if tools and self._opts.model in _REASONING_EFFORT_TOOL_REQUIRES_NONE_MODELS:
extra["reasoning_effort"] = "none"

return LLMStream(
self,
model=self._opts.model,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
]
DalleModels = Literal["dall-e-2", "dall-e-3"]
ChatModels = Literal[
"gpt-5.6",
"gpt-5.6-luna",
"gpt-5.6-sol",
"gpt-5.6-terra",
"gpt-5.5",
"gpt-5.4",
"gpt-5.4-mini",
Expand Down Expand Up @@ -291,6 +295,10 @@

def _supports_reasoning_effort(model: ChatModels | str) -> bool:
return model in [
"gpt-5.6",
"gpt-5.6-luna",
"gpt-5.6-sol",
"gpt-5.6-terra",
"gpt-5.5",
"gpt-5.4",
"gpt-5.4-mini",
Expand All @@ -302,6 +310,22 @@ def _supports_reasoning_effort(model: ChatModels | str) -> bool:
]


# Lowest tier these accept is "none"; everything else in _supports_reasoning_effort falls back
# to "minimal", which the gpt-5.6 family rejects outright.
_REASONING_EFFORT_NONE_MODELS: frozenset[str] = frozenset(
{
"gpt-5.6",
"gpt-5.6-luna",
"gpt-5.6-sol",
"gpt-5.6-terra",
"gpt-5.4",
"gpt-5.4-mini",
"gpt-5.2",
"gpt-5.1",
}
)


@dataclass
class OpenRouterWebPlugin:
"""OpenRouter web search plugin configuration"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
from openai.types.shared_params import ResponsesModel

from ..log import logger
from ..models import _supports_reasoning_effort
from ..models import _REASONING_EFFORT_NONE_MODELS, _supports_reasoning_effort
from ..tools import OpenAITool

ServiceTier = Literal["auto", "default", "flex", "scale", "priority"]
Expand Down Expand Up @@ -242,7 +242,7 @@ def __init__(
super().__init__()

if not is_given(reasoning) and _supports_reasoning_effort(model):
if model in ["gpt-5.1", "gpt-5.2", "gpt-5.4", "gpt-5.4-mini"]:
if model in _REASONING_EFFORT_NONE_MODELS:
reasoning = Reasoning(effort="none")
else:
reasoning = Reasoning(effort="minimal")
Expand Down
Loading