Skip to content

Commit 50f0362

Browse files
authored
fix (ai): fix experimental sendStart/sendFinish options in streamText (#6325)
## Background The experimental `sendStart` and `sendFinish` options were broken. ## Summary Fix experimental sendStart/sendFinish options in streamText.
1 parent 2b9bbcd commit 50f0362

File tree

4 files changed

+69
-18
lines changed

4 files changed

+69
-18
lines changed

‎.changeset/seven-beans-push.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'ai': patch
3+
---
4+
5+
fix (ai): fix experimental sendStart/sendFinish options in streamText

‎packages/ai/core/generate-text/__snapshots__/stream-text.test.ts.snap

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2802,9 +2802,6 @@ exports[`streamText > result.pipeUIMessageStreamToResponse > should omit message
28022802
",
28032803
"data: {"type":"finish-step"}
28042804
2805-
",
2806-
"data: {"type":"finish"}
2807-
28082805
",
28092806
"data: [DONE]
28102807
@@ -3266,7 +3263,28 @@ exports[`streamText > result.toUIMessageStream > should mask error messages by d
32663263
]
32673264
`;
32683265

3269-
exports[`streamText > result.toUIMessageStream > should omit message finish event (d:) when sendFinish is false 1`] = `
3266+
exports[`streamText > result.toUIMessageStream > should omit message finish event when sendFinish is false 1`] = `
3267+
[
3268+
{
3269+
"type": "start",
3270+
"value": undefined,
3271+
},
3272+
{
3273+
"type": "start-step",
3274+
"value": undefined,
3275+
},
3276+
{
3277+
"type": "text",
3278+
"value": "Hello, World!",
3279+
},
3280+
{
3281+
"type": "finish-step",
3282+
"value": undefined,
3283+
},
3284+
]
3285+
`;
3286+
3287+
exports[`streamText > result.toUIMessageStream > should omit message start event when sendStart is false 1`] = `
32703288
[
32713289
{
32723290
"type": "start-step",

‎packages/ai/core/generate-text/stream-text.test.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1406,10 +1406,11 @@ describe('streamText', () => {
14061406
expect(await convertReadableStreamToArray(dataStream)).toMatchSnapshot();
14071407
});
14081408

1409-
it('should omit message finish event (d:) when sendFinish is false', async () => {
1409+
it('should omit message finish event when sendFinish is false', async () => {
14101410
const result = streamText({
14111411
model: createTestModel({
14121412
stream: convertArrayToReadableStream([
1413+
{ type: 'stream-start', warnings: [] },
14131414
{ type: 'text', text: 'Hello, World!' },
14141415
{
14151416
type: 'finish',
@@ -1428,6 +1429,29 @@ describe('streamText', () => {
14281429
expect(await convertReadableStreamToArray(dataStream)).toMatchSnapshot();
14291430
});
14301431

1432+
it('should omit message start event when sendStart is false', async () => {
1433+
const result = streamText({
1434+
model: createTestModel({
1435+
stream: convertArrayToReadableStream([
1436+
{ type: 'stream-start', warnings: [] },
1437+
{ type: 'text', text: 'Hello, World!' },
1438+
{
1439+
type: 'finish',
1440+
finishReason: 'stop',
1441+
usage: testUsage,
1442+
},
1443+
]),
1444+
}),
1445+
...defaultSettings(),
1446+
});
1447+
1448+
const dataStream = result.toUIMessageStream({
1449+
experimental_sendStart: false,
1450+
});
1451+
1452+
expect(await convertReadableStreamToArray(dataStream)).toMatchSnapshot();
1453+
});
1454+
14311455
it('should send reasoning content when sendReasoning is true', async () => {
14321456
const result = streamText({
14331457
model: modelWithReasoning,

‎packages/ai/core/generate-text/stream-text.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,23 +1478,27 @@ However, the LLM results are expected to be small enough to not cause issues.
14781478
}
14791479

14801480
case 'start': {
1481-
const metadata = messageMetadata?.({ part });
1482-
controller.enqueue({
1483-
type: 'start',
1484-
value:
1485-
messageId != null || metadata != null
1486-
? { messageId, metadata }
1487-
: undefined,
1488-
});
1481+
if (experimental_sendStart) {
1482+
const metadata = messageMetadata?.({ part });
1483+
controller.enqueue({
1484+
type: 'start',
1485+
value:
1486+
messageId != null || metadata != null
1487+
? { messageId, metadata }
1488+
: undefined,
1489+
});
1490+
}
14891491
break;
14901492
}
14911493

14921494
case 'finish': {
1493-
const metadata = messageMetadata?.({ part });
1494-
controller.enqueue({
1495-
type: 'finish',
1496-
value: metadata != null ? { metadata } : undefined,
1497-
});
1495+
if (experimental_sendFinish) {
1496+
const metadata = messageMetadata?.({ part });
1497+
controller.enqueue({
1498+
type: 'finish',
1499+
value: metadata != null ? { metadata } : undefined,
1500+
});
1501+
}
14981502
break;
14991503
}
15001504

0 commit comments

Comments
 (0)