Skip to content

Commit 9caf8c8

Browse files
fix(sdk): keep deprecated verification accessors
Co-authored-by: openhands <openhands@all-hands.dev>
1 parent f672ff0 commit 9caf8c8

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

openhands-sdk/openhands/sdk/settings/model.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from pydantic import (
1010
BaseModel,
1111
Field,
12+
PrivateAttr,
1213
SecretStr,
1314
field_serializer,
1415
field_validator,
@@ -18,6 +19,7 @@
1819
from openhands.sdk.context.agent_context import AgentContext
1920
from openhands.sdk.llm import LLM
2021
from openhands.sdk.tool import Tool
22+
from openhands.sdk.utils.deprecation import warn_deprecated
2123

2224
from .metadata import (
2325
SETTINGS_METADATA_KEY,
@@ -107,6 +109,9 @@ class CondenserSettings(BaseModel):
107109
class VerificationSettings(BaseModel):
108110
"""Critic and iterative-refinement settings for the agent."""
109111

112+
_deprecated_confirmation_mode: bool = PrivateAttr(default=False)
113+
_deprecated_security_analyzer: str | None = PrivateAttr(default=None)
114+
110115
# -- Critic --
111116
critic_enabled: bool = Field(
112117
default=False,
@@ -197,6 +202,64 @@ class VerificationSettings(BaseModel):
197202
},
198203
)
199204

205+
@property
206+
def confirmation_mode(self) -> bool:
207+
warn_deprecated(
208+
"VerificationSettings.confirmation_mode",
209+
deprecated_in="1.16.1",
210+
removed_in="1.18.0",
211+
details=(
212+
"Use ConversationSettings.confirmation_mode; "
213+
"verification settings no longer serialize "
214+
"conversation approval controls."
215+
),
216+
)
217+
return self._deprecated_confirmation_mode
218+
219+
@confirmation_mode.setter
220+
def confirmation_mode(self, value: bool) -> None:
221+
warn_deprecated(
222+
"VerificationSettings.confirmation_mode",
223+
deprecated_in="1.16.1",
224+
removed_in="1.18.0",
225+
details=(
226+
"Use ConversationSettings.confirmation_mode; "
227+
"verification settings no longer serialize "
228+
"conversation approval controls."
229+
),
230+
stacklevel=3,
231+
)
232+
self._deprecated_confirmation_mode = value
233+
234+
@property
235+
def security_analyzer(self) -> str | None:
236+
warn_deprecated(
237+
"VerificationSettings.security_analyzer",
238+
deprecated_in="1.16.1",
239+
removed_in="1.18.0",
240+
details=(
241+
"Use ConversationSettings.security_analyzer; "
242+
"verification settings no longer serialize "
243+
"conversation security controls."
244+
),
245+
)
246+
return self._deprecated_security_analyzer
247+
248+
@security_analyzer.setter
249+
def security_analyzer(self, value: str | None) -> None:
250+
warn_deprecated(
251+
"VerificationSettings.security_analyzer",
252+
deprecated_in="1.16.1",
253+
removed_in="1.18.0",
254+
details=(
255+
"Use ConversationSettings.security_analyzer; "
256+
"verification settings no longer serialize "
257+
"conversation security controls."
258+
),
259+
stacklevel=3,
260+
)
261+
self._deprecated_security_analyzer = value
262+
200263

201264
def _default_llm_settings() -> LLM:
202265
model = LLM.model_fields["model"].get_default()

tests/sdk/test_settings.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pytest
12
from fastmcp.mcp_config import MCPConfig
23
from pydantic import SecretStr
34

@@ -144,6 +145,28 @@ def test_conversation_settings_export_schema_groups_sections() -> None:
144145
assert verification_fields["security_analyzer"].depends_on == ["confirmation_mode"]
145146

146147

148+
def test_verification_settings_legacy_controls_remain_deprecated_accessors() -> None:
149+
settings = VerificationSettings()
150+
151+
with pytest.deprecated_call():
152+
assert settings.confirmation_mode is False
153+
with pytest.deprecated_call():
154+
settings.confirmation_mode = True
155+
with pytest.deprecated_call():
156+
assert settings.confirmation_mode is True
157+
158+
with pytest.deprecated_call():
159+
assert settings.security_analyzer is None
160+
with pytest.deprecated_call():
161+
settings.security_analyzer = "llm"
162+
with pytest.deprecated_call():
163+
assert settings.security_analyzer == "llm"
164+
165+
dumped = settings.model_dump(mode="json")
166+
assert "confirmation_mode" not in dumped
167+
assert "security_analyzer" not in dumped
168+
169+
147170
def test_conversation_settings_model_dump_roundtrip() -> None:
148171
settings = ConversationSettings(
149172
max_iterations=42,

0 commit comments

Comments
 (0)