Add Python SDK dangerous bypass mode

This commit is contained in:
Ahmed Ibrahim
2026-05-15 19:35:27 -07:00
parent a280248021
commit 2eb61fa741
8 changed files with 394 additions and 12 deletions

View File

@@ -15,6 +15,9 @@ class ApprovalMode(str, Enum):
deny_all = "deny_all"
auto_review = "auto_review"
dangerously_bypass_approvals_and_sandbox = (
"dangerously_bypass_approvals_and_sandbox"
)
def _approval_mode_settings(
@@ -33,6 +36,8 @@ def _approval_mode_settings(
)
case ApprovalMode.deny_all:
return AskForApproval(root=AskForApprovalValue.never), None
case ApprovalMode.dangerously_bypass_approvals_and_sandbox:
return AskForApproval(root=AskForApprovalValue.never), None
case _:
return _assert_never_approval_mode(approval_mode)

View File

@@ -30,6 +30,7 @@ from ._run import (
from .async_client import AsyncAppServerClient
from .client import AppServerClient, AppServerConfig
from .generated.v2_all import (
DangerFullAccessSandboxPolicy,
ModelListResponse,
Personality,
ReasoningEffort,
@@ -60,6 +61,36 @@ from .generated.v2_all import (
from .models import InitializeResponse, JsonObject, Notification
def _thread_sandbox_for_approval_mode(
approval_mode: ApprovalMode | None,
sandbox: SandboxMode | None,
) -> SandboxMode | None:
"""Apply approval-mode sandbox presets for thread operations."""
if approval_mode is not ApprovalMode.dangerously_bypass_approvals_and_sandbox:
return sandbox
if sandbox is not None:
raise ValueError(
"dangerous bypass approval_mode cannot be combined with sandbox"
)
return SandboxMode.danger_full_access
def _turn_sandbox_policy_for_approval_mode(
approval_mode: ApprovalMode | None,
sandbox_policy: SandboxPolicy | None,
) -> SandboxPolicy | None:
"""Apply approval-mode sandbox presets for turn operations."""
if approval_mode is not ApprovalMode.dangerously_bypass_approvals_and_sandbox:
return sandbox_policy
if sandbox_policy is not None:
raise ValueError(
"dangerous bypass approval_mode cannot be combined with sandbox_policy"
)
return SandboxPolicy(
root=DangerFullAccessSandboxPolicy(type="dangerFullAccess")
)
class Codex:
"""Typed Python client for app-server v2 workflows."""
@@ -105,6 +136,7 @@ class Codex:
thread_source: ThreadSource | None = None,
) -> Thread:
approval_policy, approvals_reviewer = _approval_mode_settings(approval_mode)
sandbox = _thread_sandbox_for_approval_mode(approval_mode, sandbox)
params = ThreadStartParams(
approval_policy=approval_policy,
approvals_reviewer=approvals_reviewer,
@@ -168,7 +200,10 @@ class Codex:
sandbox: SandboxMode | None = None,
service_tier: str | None = None,
) -> Thread:
approval_policy, approvals_reviewer = _approval_mode_override_settings(approval_mode)
approval_policy, approvals_reviewer = _approval_mode_override_settings(
approval_mode
)
sandbox = _thread_sandbox_for_approval_mode(approval_mode, sandbox)
params = ThreadResumeParams(
thread_id=thread_id,
approval_policy=approval_policy,
@@ -202,7 +237,10 @@ class Codex:
service_tier: str | None = None,
thread_source: ThreadSource | None = None,
) -> Thread:
approval_policy, approvals_reviewer = _approval_mode_override_settings(approval_mode)
approval_policy, approvals_reviewer = _approval_mode_override_settings(
approval_mode
)
sandbox = _thread_sandbox_for_approval_mode(approval_mode, sandbox)
params = ThreadForkParams(
thread_id=thread_id,
approval_policy=approval_policy,
@@ -307,6 +345,7 @@ class AsyncCodex:
) -> AsyncThread:
await self._ensure_initialized()
approval_policy, approvals_reviewer = _approval_mode_settings(approval_mode)
sandbox = _thread_sandbox_for_approval_mode(approval_mode, sandbox)
params = ThreadStartParams(
approval_policy=approval_policy,
approvals_reviewer=approvals_reviewer,
@@ -372,7 +411,10 @@ class AsyncCodex:
service_tier: str | None = None,
) -> AsyncThread:
await self._ensure_initialized()
approval_policy, approvals_reviewer = _approval_mode_override_settings(approval_mode)
approval_policy, approvals_reviewer = _approval_mode_override_settings(
approval_mode
)
sandbox = _thread_sandbox_for_approval_mode(approval_mode, sandbox)
params = ThreadResumeParams(
thread_id=thread_id,
approval_policy=approval_policy,
@@ -407,7 +449,10 @@ class AsyncCodex:
thread_source: ThreadSource | None = None,
) -> AsyncThread:
await self._ensure_initialized()
approval_policy, approvals_reviewer = _approval_mode_override_settings(approval_mode)
approval_policy, approvals_reviewer = _approval_mode_override_settings(
approval_mode
)
sandbox = _thread_sandbox_for_approval_mode(approval_mode, sandbox)
params = ThreadForkParams(
thread_id=thread_id,
approval_policy=approval_policy,
@@ -495,7 +540,13 @@ class Thread:
summary: ReasoningSummary | None = None,
) -> TurnHandle:
wire_input = _to_wire_input(input)
approval_policy, approvals_reviewer = _approval_mode_override_settings(approval_mode)
approval_policy, approvals_reviewer = _approval_mode_override_settings(
approval_mode
)
sandbox_policy = _turn_sandbox_policy_for_approval_mode(
approval_mode,
sandbox_policy,
)
params = TurnStartParams(
thread_id=self.id,
input=wire_input,
@@ -579,7 +630,13 @@ class AsyncThread:
) -> AsyncTurnHandle:
await self._codex._ensure_initialized()
wire_input = _to_wire_input(input)
approval_policy, approvals_reviewer = _approval_mode_override_settings(approval_mode)
approval_policy, approvals_reviewer = _approval_mode_override_settings(
approval_mode
)
sandbox_policy = _turn_sandbox_policy_for_approval_mode(
approval_mode,
sandbox_policy,
)
params = TurnStartParams(
thread_id=self.id,
input=wire_input,