diff --git a/examples/responses/stream_background.ts b/examples/responses/stream_background.ts index 16b1131b40..cf4066486e 100755 --- a/examples/responses/stream_background.ts +++ b/examples/responses/stream_background.ts @@ -12,9 +12,12 @@ async function main() { }); let id: string | null = null; + let lastSequenceNumber = -1; let completed = false; for await (const event of runner) { + lastSequenceNumber = event.sequence_number; + if (event.type === 'response.created') { id = event.response.id; } @@ -41,7 +44,7 @@ async function main() { const runner2 = openai.responses.stream({ response_id: id!, - starting_after: 10, + starting_after: lastSequenceNumber, }); for await (const event of runner2) { diff --git a/tests/lib/background-streaming-example.test.ts b/tests/lib/background-streaming-example.test.ts index a8fe147132..69f315bddb 100644 --- a/tests/lib/background-streaming-example.test.ts +++ b/tests/lib/background-streaming-example.test.ts @@ -155,7 +155,8 @@ test.each(cases)('$source: $status $name', async ({ chunks, resumed, partial, st const events = responseEvents(chunks, status, background); const nonterminal = status === 'queued' || status === 'in_progress'; const body = `${events.map((event) => `data: ${JSON.stringify(event)}`).join('\n\n')}\n\n${nonterminal ? '' : 'data: [DONE]\n\n'}`; - const partialEvents = nonterminal ? events : events.slice(0, -1); + // Disconnect before the final delta as well as the terminal event. + const partialEvents = nonterminal ? events : events.slice(0, -2); const partialBody = `${partialEvents.map((event) => `data: ${JSON.stringify(event)}`).join('\n\n')}\n\n`; const requests: { method: string | undefined; @@ -220,6 +221,8 @@ main();`, OPENAI_BASE_URL: `http://127.0.0.1:${address.port}/v1`, OPENAI_CUSTOM_HEADERS: undefined, OPENAI_LOG: undefined, + // Keep console-inspected event numbers plain for the sequence assertions. + FORCE_COLOR: undefined, TS_NODE_PROJECT: path.join(root, 'tsconfig.json'), DISABLE_V8_COMPILE_CACHE: '1', }, @@ -270,6 +273,10 @@ main();`, } if (source === 'example') { expect(stdout.includes('Interrupted. Continuing...')).toBe(resumed); + const seenSequences = [...stdout.matchAll(/sequence_number:\s*(?\d+)/gu)].map((match) => + Number(match.groups?.['sequence']), + ); + expect(seenSequences).toEqual(events.map((event) => event.sequence_number)); } else if (source === 'guide') { expect(stdout + stderr).not.toContain(privateErrorDetail); }