Skip to content

Commit b9a831e

Browse files
authored
New experimental_streamUI() API (#1379)
1 parent 3e304eb commit b9a831e

File tree

8 files changed

+683
-0
lines changed

8 files changed

+683
-0
lines changed

‎.changeset/wise-cycles-mix.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+
ai/rsc: add experimental_streamUI()

‎packages/core/rsc/index.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export type {
33
getMutableAIState,
44
createStreamableUI,
55
createStreamableValue,
6+
experimental_streamUI,
67
render,
78
createAI,
89
} from './rsc-server';

‎packages/core/rsc/rsc-server.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ export {
44
createStreamableValue,
55
render,
66
} from './streamable';
7+
export { experimental_streamUI } from './stream-ui';
78
export { createAI } from './provider';
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2+
3+
exports[`result.value > should render text 1`] = `
4+
{
5+
"children": {
6+
"children": {},
7+
"props": {
8+
"c": undefined,
9+
"n": {
10+
"done": false,
11+
"next": {
12+
"done": false,
13+
"next": {
14+
"done": false,
15+
"next": {
16+
"done": false,
17+
"next": {
18+
"done": false,
19+
"next": {
20+
"done": false,
21+
"next": {
22+
"done": true,
23+
"value": "{ \\"content\\": \\"Hello, world!\\" }",
24+
},
25+
"value": "{ \\"content\\": \\"Hello, world!\\" }",
26+
},
27+
"value": "{ \\"content\\": \\"Hello, world!\\"",
28+
},
29+
"value": "{ \\"content\\": \\"Hello, world",
30+
},
31+
"value": "{ \\"content\\": \\"Hello, ",
32+
},
33+
"value": "{ \\"content\\": ",
34+
},
35+
"value": "{ ",
36+
},
37+
},
38+
"type": "",
39+
},
40+
"props": {
41+
"fallback": undefined,
42+
},
43+
"type": "Symbol(react.suspense)",
44+
}
45+
`;
46+
47+
exports[`result.value > should render text function returned ui 1`] = `
48+
{
49+
"children": {
50+
"children": {},
51+
"props": {
52+
"c": undefined,
53+
"n": {
54+
"done": false,
55+
"next": {
56+
"done": false,
57+
"next": {
58+
"done": false,
59+
"next": {
60+
"done": false,
61+
"next": {
62+
"done": false,
63+
"next": {
64+
"done": false,
65+
"next": {
66+
"done": false,
67+
"next": {
68+
"done": true,
69+
"value": <h1>
70+
{ "content": "Hello, world!" }
71+
</h1>,
72+
},
73+
"value": <h1>
74+
{ "content": "Hello, world!" }
75+
</h1>,
76+
},
77+
"value": <h1>
78+
{ "content": "Hello, world!" }
79+
</h1>,
80+
},
81+
"value": <h1>
82+
{ "content": "Hello, world!"
83+
</h1>,
84+
},
85+
"value": <h1>
86+
{ "content": "Hello, world
87+
</h1>,
88+
},
89+
"value": <h1>
90+
{ "content": "Hello,
91+
</h1>,
92+
},
93+
"value": <h1>
94+
{ "content":
95+
</h1>,
96+
},
97+
"value": <h1>
98+
{
99+
</h1>,
100+
},
101+
},
102+
"type": "",
103+
},
104+
"props": {
105+
"fallback": undefined,
106+
},
107+
"type": "Symbol(react.suspense)",
108+
}
109+
`;
110+
111+
exports[`result.value > should render tool call results 1`] = `
112+
{
113+
"children": {
114+
"children": {},
115+
"props": {
116+
"c": undefined,
117+
"n": {
118+
"done": false,
119+
"next": {
120+
"done": false,
121+
"next": {
122+
"done": true,
123+
"value": <div>
124+
tool1:
125+
value
126+
</div>,
127+
},
128+
"value": <div>
129+
tool1:
130+
value
131+
</div>,
132+
},
133+
"value": "",
134+
},
135+
},
136+
"type": "",
137+
},
138+
"props": {
139+
"fallback": undefined,
140+
},
141+
"type": "Symbol(react.suspense)",
142+
}
143+
`;
144+
145+
exports[`result.value > should render tool call results with generator render function 1`] = `
146+
{
147+
"children": {
148+
"children": {},
149+
"props": {
150+
"c": undefined,
151+
"n": {
152+
"done": false,
153+
"next": {
154+
"done": false,
155+
"next": {
156+
"done": false,
157+
"next": {
158+
"done": true,
159+
"value": <div>
160+
tool:
161+
value
162+
</div>,
163+
},
164+
"value": <div>
165+
tool:
166+
value
167+
</div>,
168+
},
169+
"value": "",
170+
},
171+
"value": <div>
172+
Loading...
173+
</div>,
174+
},
175+
},
176+
"type": "",
177+
},
178+
"props": {
179+
"fallback": undefined,
180+
},
181+
"type": "Symbol(react.suspense)",
182+
}
183+
`;
184+
185+
exports[`result.value > should show better error messages if legacy options are passed 1`] = `[Error: Tool definition in \`experimental_streamUI\` should not have \`render\` property. Use \`generate\` instead. Found in tool: tool1]`;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { experimental_streamUI } from './stream-ui';

0 commit comments

Comments
 (0)