Skip to content

Commit 390584d

Browse files
Make confirmation mode critical in conversation schema (#2870)
Co-authored-by: openhands <openhands@all-hands.dev>
1 parent 7d2db6e commit 390584d

2 files changed

Lines changed: 78 additions & 1 deletion

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ class ConversationSettings(BaseModel):
372372
json_schema_extra={
373373
SETTINGS_METADATA_KEY: SettingsFieldMetadata(
374374
label="Confirmation mode",
375-
prominence=SettingProminence.MAJOR,
375+
prominence=SettingProminence.CRITICAL,
376376
).model_dump(),
377377
SETTINGS_SECTION_METADATA_KEY: SettingsSectionMetadata(
378378
key="verification",

tests/sdk/test_settings.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,83 @@ def test_conversation_settings_export_schema_groups_sections() -> None:
141141
"confirmation_mode",
142142
"security_analyzer",
143143
}
144+
assert verification_fields["confirmation_mode"].default is False
145+
assert (
146+
verification_fields["confirmation_mode"].prominence
147+
is SettingProminence.CRITICAL
148+
)
149+
assert verification_fields["security_analyzer"].default == "llm"
150+
assert verification_fields["security_analyzer"].choices[0].value == "llm"
151+
assert verification_fields["security_analyzer"].depends_on == ["confirmation_mode"]
152+
153+
154+
def test_conversation_settings_model_dump_roundtrip() -> None:
155+
settings = ConversationSettings(
156+
max_iterations=42,
157+
confirmation_mode=True,
158+
security_analyzer="none",
159+
)
160+
161+
restored = ConversationSettings.model_validate(settings.model_dump(mode="json"))
162+
163+
assert restored == settings
164+
165+
166+
def test_conversation_settings_create_request() -> None:
167+
settings = ConversationSettings(
168+
max_iterations=77,
169+
confirmation_mode=True,
170+
security_analyzer="llm",
171+
)
172+
workspace = LocalWorkspace(working_dir="/tmp")
173+
agent = LLMAgentSettings(llm=LLM(model="test-model")).create_agent()
174+
175+
request = settings.create_request(
176+
StartConversationRequest,
177+
agent=agent,
178+
workspace=workspace,
179+
)
180+
181+
assert isinstance(request, StartConversationRequest)
182+
assert request.workspace == workspace
183+
assert request.max_iterations == 77
184+
assert isinstance(request.confirmation_policy, ConfirmRisky)
185+
assert isinstance(request.security_analyzer, LLMSecurityAnalyzer)
186+
187+
overridden_request = settings.create_request(
188+
StartConversationRequest,
189+
agent=agent,
190+
workspace=workspace,
191+
max_iterations=5,
192+
confirmation_policy=AlwaysConfirm(),
193+
security_analyzer=None,
194+
)
195+
196+
assert overridden_request.max_iterations == 5
197+
assert isinstance(overridden_request.confirmation_policy, AlwaysConfirm)
198+
assert overridden_request.security_analyzer is None
199+
200+
201+
def test_conversation_settings_create_request_for_acp() -> None:
202+
settings = ConversationSettings(
203+
max_iterations=77,
204+
confirmation_mode=True,
205+
security_analyzer="none",
206+
)
207+
workspace = LocalWorkspace(working_dir="/tmp")
208+
agent = ACPAgent(acp_command=["echo", "test"])
209+
210+
request = settings.create_request(
211+
StartACPConversationRequest,
212+
agent=agent,
213+
workspace=workspace,
214+
)
215+
216+
assert isinstance(request, StartACPConversationRequest)
217+
assert request.workspace == workspace
218+
assert request.max_iterations == 77
219+
assert isinstance(request.confirmation_policy, AlwaysConfirm)
220+
assert request.security_analyzer is None
144221

145222

146223
# ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)