mirror of
https://github.com/openai/codex.git
synced 2026-04-30 17:36:40 +00:00
## TL;DR Bring the Python app-server SDK from `main-with-prs-13953-and-14232` onto current `main` as a standalone SDK-only PR. - adds the new `sdk/python` and `sdk/python-runtime` package trees - keeps the scope to the SDK payload only, without the unrelated branch-history or workflow changes from the source branch - regenerates `sdk/python/src/codex_app_server/generated/v2_all.py` against current `main` schema so the extracted SDK matches today's protocol definitions ## Validation - `PYTHONPATH=sdk/python/src python3 -m pytest sdk/python/tests` Co-authored-by: Codex <noreply@openai.com>
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)
|