Skip to content

[6/8] Add high-level Python SDK approval mode#21910

Open
aibrahim-oai wants to merge 9 commits intocodex/python-sdk-package-renamefrom
codex/python-sdk-approval-never
Open

[6/8] Add high-level Python SDK approval mode#21910
aibrahim-oai wants to merge 9 commits intocodex/python-sdk-package-renamefrom
codex/python-sdk-approval-never

Conversation

@aibrahim-oai
Copy link
Copy Markdown
Collaborator

@aibrahim-oai aibrahim-oai commented May 9, 2026

Why

The high-level SDK should expose the approval behavior it actually supports instead of leaking generated app-server routing fields. New work should have two clear choices: default auto review, or explicitly deny escalated permission requests. Existing threads and subsequent turns should preserve their current approval behavior unless the caller passes an override.

What

  • Add the public ApprovalMode enum with auto_review and deny_all.
  • Default new thread creation to ApprovalMode.auto_review.
  • Preserve existing approval settings by default for resume, fork, run, and turn helpers.
  • Remove raw approval_policy / approvals_reviewer kwargs from high-level SDK wrappers.
  • Update generated wrapper output, docs, examples, notebooks, and tests for the high-level approval mode API.

Stack

  1. [1/8] Pin Python SDK runtime dependency #21891 [1/8] Pin Python SDK runtime dependency
  2. [2/8] Generate Python SDK types from pinned runtime #21893 [2/8] Generate Python SDK types from pinned runtime
  3. [3/8] Run Python SDK tests in CI #21895 [3/8] Run Python SDK tests in CI
  4. [4/8] Define Python SDK public API surface #21896 [4/8] Define Python SDK public API surface
  5. [5/8] Rename Python SDK package to openai-codex #21905 [5/8] Rename Python SDK package to openai-codex
  6. This PR [6/8] Add high-level Python SDK approval mode
  7. [7/8] Add Python SDK app-server integration harness #22014 [7/8] Add Python SDK app-server integration harness
  8. [8/8] Add Python SDK Ruff formatting #22021 [8/8] Add Python SDK Ruff formatting

Verification

  • Added approval-mode mapping/default tests for new threads, existing threads, forks, resumes, and subsequent turns.

Co-authored-by: Codex <noreply@openai.com>
aibrahim-oai and others added 2 commits May 9, 2026 13:49
Co-authored-by: Codex <noreply@openai.com>
Expose approval_mode with deny_all and auto_review options on the high-level Python SDK, and map those choices to generated app-server approval params internally.

Update examples, docs, notebooks, and public API tests to use the new mode instead of raw generated approval fields.

Co-authored-by: Codex <noreply@openai.com>
@aibrahim-oai aibrahim-oai changed the title [6/6] Default Python SDK approval policy to never [6/6] Add high-level Python SDK approval mode May 10, 2026
aibrahim-oai and others added 2 commits May 10, 2026 11:58
Cover the exact public ApprovalMode values and ensure unsupported modes fail before sync or async high-level APIs can issue client requests.

Co-authored-by: Codex <noreply@openai.com>
Default high-level thread and turn starts to auto-review, keep deny_all as the explicit opt-out, and remove the generated AskForApproval alias customization.

Co-authored-by: Codex <noreply@openai.com>
Copy link
Copy Markdown
Contributor

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bfd11aa1fc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread sdk/python/src/openai_codex/api.py Outdated
*,
approval_policy: AskForApproval | None = None,
approvals_reviewer: ApprovalsReviewer | None = None,
approval_mode: ApprovalMode = ApprovalMode.auto_review,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve deny_all when starting turns

A caller can opt out via codex.thread_start(approval_mode=ApprovalMode.deny_all), but the returned Thread does not retain that choice. The common thread.run(...) path defaults back to auto_review and sends a turn-level override, so the first turn re-enables auto approvals instead of denying escalations. The async wrapper has the same default.

Useful? React with 👍 / 👎.

Use an explicit match over ApprovalMode values while keeping a separate runtime validation error for non-enum inputs.

Co-authored-by: Codex <noreply@openai.com>
Copy link
Copy Markdown
Contributor

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 934eda61c3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread sdk/python/src/openai_codex/api.py Outdated
*,
approval_policy: AskForApproval | None = None,
approvals_reviewer: ApprovalsReviewer | None = None,
approval_mode: ApprovalMode = ApprovalMode.auto_review,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve approval settings on resume

A resume with no approval argument should leave the thread's stored approval settings alone, but this default is immediately converted into approvalPolicy: on-request/approvalsReviewer: auto_review. Resuming a thread that was created with deny_all (or never outside this wrapper) silently re-enables escalated approvals. Use a sentinel/None default and only serialize an override when the caller opts in.

Useful? React with 👍 / 👎.

Comment thread sdk/python/src/openai_codex/api.py Outdated
*,
approval_policy: AskForApproval | None = None,
approvals_reviewer: ApprovalsReviewer | None = None,
approval_mode: ApprovalMode = ApprovalMode.auto_review,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve approval settings on resume

A resume with no approval argument should leave the thread's stored approval settings alone, but this default is immediately converted into approvalPolicy: on-request/approvalsReviewer: auto_review. Resuming a thread that was created with deny_all silently re-enables escalated approvals. Use a sentinel/None default and only serialize an override when the caller opts in.

Useful? React with 👍 / 👎.

Comment thread sdk/python/src/openai_codex/api.py Outdated
*,
approval_policy: AskForApproval | None = None,
approvals_reviewer: ApprovalsReviewer | None = None,
approval_mode: ApprovalMode = ApprovalMode.auto_review,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve approval settings when forking

Fork params describe approval fields as optional overrides for the forked thread. Because the wrapper default always serializes auto-review, forking a deny_all thread without an explicit argument changes the fork to on-request/auto_review instead of inheriting the source thread's approval behavior. This can unexpectedly re-enable escalations in the fork.

Useful? React with 👍 / 👎.

Comment thread sdk/python/src/openai_codex/api.py Outdated
*,
approval_policy: AskForApproval | None = None,
approvals_reviewer: ApprovalsReviewer | None = None,
approval_mode: ApprovalMode = ApprovalMode.auto_review,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Let turn-level approval overrides persist

Fresh evidence distinct from the earlier start-thread case: TurnStartParams.approval_policy is documented as applying to this turn and subsequent turns, but every later turn() call with the default serializes auto-review and overwrites a previous approval_mode=deny_all. A caller who denies escalations for one turn loses that protection on the next omitted-arg turn.

Useful? React with 👍 / 👎.

aibrahim-oai and others added 2 commits May 10, 2026 12:45
Replace fake sync and async client approval tests with direct serialization checks using generated TurnStartParams, while keeping existing run-path coverage for the default behavior.

Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
@aibrahim-oai
Copy link
Copy Markdown
Collaborator Author

@codex review this

Co-authored-by: Codex <noreply@openai.com>
@aibrahim-oai aibrahim-oai changed the title [6/6] Add high-level Python SDK approval mode [6/7] Add high-level Python SDK approval mode May 10, 2026
@aibrahim-oai aibrahim-oai changed the title [6/7] Add high-level Python SDK approval mode [6/8] Add high-level Python SDK approval mode May 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant