Skip to content

Commit

Permalink
fix (ai/ui): useChat messages have stable ids with streamProtocol: "t…
Browse files Browse the repository at this point in the history
…ext" (#2515)
  • Loading branch information
lgrammel authored Aug 1, 2024
1 parent ffed3a5 commit 5be2512
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 9 deletions.
6 changes: 6 additions & 0 deletions .changeset/thin-cooks-march.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@ai-sdk/ui-utils': patch
'@ai-sdk/react': patch
---

fix (ai/ui): useChat messages have stable ids with streamProtocol: "text"
43 changes: 35 additions & 8 deletions packages/react/src/use-chat.ui.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -265,8 +265,11 @@ describe('text stream', () => {
<div>
{messages.map((m, idx) => (
<div data-testid={`message-${idx}-text-stream`} key={m.id}>
{m.role === 'user' ? 'User: ' : 'AI: '}
{m.content}
<div data-testid={`message-${idx}-id`}>{m.id}</div>
<div data-testid={`message-${idx}-role`}>
{m.role === 'user' ? 'User: ' : 'AI: '}
</div>
<div data-testid={`message-${idx}-content`}>{m.content}</div>
</div>
))}

Expand Down Expand Up @@ -302,15 +305,39 @@ describe('text stream', () => {
async () => {
await userEvent.click(screen.getByTestId('do-append-text-stream'));

await screen.findByTestId('message-0-text-stream');
expect(screen.getByTestId('message-0-text-stream')).toHaveTextContent(
'User: hi',
await screen.findByTestId('message-0-content');
expect(screen.getByTestId('message-0-content')).toHaveTextContent('hi');

await screen.findByTestId('message-1-content');
expect(screen.getByTestId('message-1-content')).toHaveTextContent(
'Hello, world.',
);
},
),
);

await screen.findByTestId('message-1-text-stream');
expect(screen.getByTestId('message-1-text-stream')).toHaveTextContent(
'AI: Hello, world.',
it(
'should have stable message ids',
withTestServer(
{ url: '/api/chat', type: 'controlled-stream' },
async ({ streamController }) => {
streamController.enqueue('He');

await userEvent.click(screen.getByTestId('do-append-text-stream'));

await screen.findByTestId('message-1-content');
expect(screen.getByTestId('message-1-content')).toHaveTextContent('He');

const id = screen.getByTestId('message-1-id').textContent;

streamController.enqueue('llo');
streamController.close();

await screen.findByTestId('message-1-content');
expect(screen.getByTestId('message-1-content')).toHaveTextContent(
'Hello',
);
expect(screen.getByTestId('message-1-id').textContent).toBe(id);
},
),
);
Expand Down
1 change: 0 additions & 1 deletion packages/ui-utils/src/call-chat-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ export async function callChatApi({
}

resultMessage.content += decoder(value);
resultMessage.id = generateId();

// note: creating a new message object is required for Solid.js streaming
onUpdate([{ ...resultMessage }], []);
Expand Down

0 comments on commit 5be2512

Please sign in to comment.