Repository navigation
lm15 2.1.0 for R
No API change in R. response.incomplete already ended an R stream, and the realtime completion path already completed from final copies; a Responses stream cut by a content filter now finishes content_filter, as the complete call does.
Streams now yield what the provider said, all of it, once (MAP-20). Nothing is removed and no field changes meaning. Contract 77f22f4, 2,132 of 2,132 checks, the same in all six lm15 languages.
- Parallel tool calls on the Codex subscription keep their inputs. The Codex backend sends the arguments of parallel calls only in each call's final
response.output_item.done, never in pieces, and lm15 read only the pieces, so every call arrived with input{}(fromstreamand fromcompletealike). A stream's final copy of an item now completes whatever its pieces did not deliver: arguments, message text, a reasoning summary. A piece that contradicts the final copy is refused (StreamAssemblyError, codestream_assembly, with the part's index) instead of either value being chosen. - A streamed reasoning summary reads like the complete one: its parts are joined with a newline, as the complete call joins them. They used to run together (
**First idea****Second idea**). - Gemini parallel calls sent one per chunk stay separate calls. gemini-2.5-pro and gemini-3-flash-preview send each parallel call in a chunk of its own. Every call landed in the same slot and their arguments ran into one unreadable input.
How this is checked from now on: the contract harness compares every OpenAI Responses stream with the stream's own final copy of the whole response (no hand-written answer needed), replays legal re-shapings of every recorded stream (fragments cut elsewhere, joined, re-chunked, dropped where a final copy restates them, contradicted), and every kind of event a recorded stream carries must be classified (mapping/stream-events.json). See lm15-contract/changes/2026-11-05-stream-final-copy.md.