// (b) Streaming Responses request: exact event type names (ordered, with counts) + usage shape from response.completed. import { client, attempt, save, PROBE_MODELS, REASONING_MODELS, summarizeResponse } from "./lib"; const out: any[] = []; for (const model of PROBE_MODELS) { out.push(await attempt(`stream:${model}`, async () => { const params: any = { model, input: "Say hello in five words.", max_output_tokens: 200, stream: true }; if (REASONING_MODELS.has(model)) params.reasoning = { summary: "auto" }; const stream = await client.responses.create(params); const order: string[] = []; const counts: Record = {}; const samples: Record = {}; let final: any = null; let text = ""; let seqs: number[] = []; for await (const ev of stream as any) { counts[ev.type] = (counts[ev.type] ?? 0) + 1; if (!samples[ev.type]) { order.push(ev.type); const { response, ...rest } = ev; samples[ev.type] = response ? { ...rest, response: "" } : rest; } if (typeof ev.sequence_number === "number") seqs.push(ev.sequence_number); if (ev.type === "response.output_text.delta") text += ev.delta; if (ev.type === "response.completed" || ev.type === "response.incomplete" || ev.type === "response.failed") final = ev.response; } return { event_order: order, counts, samples, text, sequence_numbers_monotonic: seqs.every((s, i) => i === 0 || s === seqs[i - 1] + 1), final: final ? summarizeResponse(final) : null }; })); } save("03-stream", out);