Files
openai--openai-agents-python/src/agents/extensions/experimental/codex/thread_options.py
T
2026-07-13 12:39:17 +08:00

53 lines
2.0 KiB
Python

from __future__ import annotations
from collections.abc import Mapping, Sequence
from dataclasses import dataclass, fields
from typing import Any, Literal
from agents.exceptions import UserError
ApprovalMode = Literal["never", "on-request", "on-failure", "untrusted"]
SandboxMode = Literal["read-only", "workspace-write", "danger-full-access"]
ModelReasoningEffort = Literal["minimal", "low", "medium", "high", "xhigh"]
WebSearchMode = Literal["disabled", "cached", "live"]
@dataclass(frozen=True)
class ThreadOptions:
# Model identifier passed to the Codex CLI (--model).
model: str | None = None
# Sandbox permissions for filesystem/network access.
sandbox_mode: SandboxMode | None = None
# Working directory for the Codex CLI process.
working_directory: str | None = None
# Allow running outside a Git repository.
skip_git_repo_check: bool | None = None
# Configure model reasoning effort.
model_reasoning_effort: ModelReasoningEffort | None = None
# Toggle network access in sandboxed workspace writes.
network_access_enabled: bool | None = None
# Configure web search mode via codex config.
web_search_mode: WebSearchMode | None = None
# Legacy toggle for web search behavior.
web_search_enabled: bool | None = None
# Approval policy for tool invocations within Codex.
approval_policy: ApprovalMode | None = None
# Additional filesystem roots available to Codex.
additional_directories: Sequence[str] | None = None
def coerce_thread_options(
options: ThreadOptions | Mapping[str, Any] | None,
) -> ThreadOptions | None:
if options is None or isinstance(options, ThreadOptions):
return options
if not isinstance(options, Mapping):
raise UserError("ThreadOptions must be a ThreadOptions or a mapping.")
allowed = {field.name for field in fields(ThreadOptions)}
unknown = set(options.keys()) - allowed
if unknown:
raise UserError(f"Unknown ThreadOptions field(s): {sorted(unknown)}")
return ThreadOptions(**dict(options))