mirror of
https://github.com/openai/codex.git
synced 2026-09-14 11:57:03 +00:00
## Summary Foundation PR only (base for PR #3). This PR contains the SDK runtime foundation and generated artifacts: - pinned runtime binary in `sdk/python/bin/` (`codex` or `codex.exe` by platform) - single maintenance script: `sdk/python/scripts/update_sdk_artifacts.py` - generated protocol/types artifacts under: - `sdk/python/src/codex_app_server/generated/protocol_types.py` - `sdk/python/src/codex_app_server/generated/schema_types.py` - `sdk/python/src/codex_app_server/generated/v2_all/*` - generation-contract test wiring (`tests/test_contract_generation.py`) ## Release asset behavior `update_sdk_artifacts.py` now: - selects latest release by channel (`--channel stable|alpha`) - resolves the correct asset for current OS/arch - extracts platform binary (`codex` on macOS/Linux, `codex.exe` on Windows) - keeps runtime on single pinned binary source in `sdk/python/bin/` ## Scope boundary - ✅ PR #2 = binary + generation pipeline + generated types foundation - ❌ PR #2 does **not** include examples/integration logic polish (that is PR #3) ## Validation - Ran: `python scripts/update_sdk_artifacts.py --channel stable` - Regenerated and committed resulting generated artifacts - Local tests pass on branch
42 lines
1007 B
Python
42 lines
1007 B
Python
from __future__ import annotations
|
|
|
|
import random
|
|
import time
|
|
from typing import Callable, TypeVar
|
|
|
|
from .errors import is_retryable_error
|
|
|
|
T = TypeVar("T")
|
|
|
|
|
|
def retry_on_overload(
|
|
op: Callable[[], T],
|
|
*,
|
|
max_attempts: int = 3,
|
|
initial_delay_s: float = 0.25,
|
|
max_delay_s: float = 2.0,
|
|
jitter_ratio: float = 0.2,
|
|
) -> T:
|
|
"""Retry helper for transient server-overload errors."""
|
|
|
|
if max_attempts < 1:
|
|
raise ValueError("max_attempts must be >= 1")
|
|
|
|
delay = initial_delay_s
|
|
attempt = 0
|
|
while True:
|
|
attempt += 1
|
|
try:
|
|
return op()
|
|
except Exception as exc:
|
|
if attempt >= max_attempts:
|
|
raise
|
|
if not is_retryable_error(exc):
|
|
raise
|
|
|
|
jitter = delay * jitter_ratio
|
|
sleep_for = min(max_delay_s, delay) + random.uniform(-jitter, jitter)
|
|
if sleep_for > 0:
|
|
time.sleep(sleep_for)
|
|
delay = min(max_delay_s, delay * 2)
|