ai 6.0.31 → 6.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/index.js +1 -1
  3. package/dist/index.mjs +1 -1
  4. package/dist/internal/index.js +1 -1
  5. package/dist/internal/index.mjs +1 -1
  6. package/docs/00-introduction/index.mdx +76 -0
  7. package/docs/02-foundations/01-overview.mdx +43 -0
  8. package/docs/02-foundations/02-providers-and-models.mdx +163 -0
  9. package/docs/02-foundations/03-prompts.mdx +620 -0
  10. package/docs/02-foundations/04-tools.mdx +160 -0
  11. package/docs/02-foundations/05-streaming.mdx +62 -0
  12. package/docs/02-foundations/index.mdx +43 -0
  13. package/docs/02-getting-started/00-choosing-a-provider.mdx +110 -0
  14. package/docs/02-getting-started/01-navigating-the-library.mdx +85 -0
  15. package/docs/02-getting-started/02-nextjs-app-router.mdx +556 -0
  16. package/docs/02-getting-started/03-nextjs-pages-router.mdx +542 -0
  17. package/docs/02-getting-started/04-svelte.mdx +627 -0
  18. package/docs/02-getting-started/05-nuxt.mdx +566 -0
  19. package/docs/02-getting-started/06-nodejs.mdx +512 -0
  20. package/docs/02-getting-started/07-expo.mdx +766 -0
  21. package/docs/02-getting-started/08-tanstack-start.mdx +583 -0
  22. package/docs/02-getting-started/index.mdx +44 -0
  23. package/docs/03-agents/01-overview.mdx +96 -0
  24. package/docs/03-agents/02-building-agents.mdx +367 -0
  25. package/docs/03-agents/03-workflows.mdx +370 -0
  26. package/docs/03-agents/04-loop-control.mdx +350 -0
  27. package/docs/03-agents/05-configuring-call-options.mdx +286 -0
  28. package/docs/03-agents/index.mdx +40 -0
  29. package/docs/03-ai-sdk-core/01-overview.mdx +33 -0
  30. package/docs/03-ai-sdk-core/05-generating-text.mdx +600 -0
  31. package/docs/03-ai-sdk-core/10-generating-structured-data.mdx +662 -0
  32. package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +1102 -0
  33. package/docs/03-ai-sdk-core/16-mcp-tools.mdx +375 -0
  34. package/docs/03-ai-sdk-core/20-prompt-engineering.mdx +144 -0
  35. package/docs/03-ai-sdk-core/25-settings.mdx +198 -0
  36. package/docs/03-ai-sdk-core/30-embeddings.mdx +247 -0
  37. package/docs/03-ai-sdk-core/31-reranking.mdx +218 -0
  38. package/docs/03-ai-sdk-core/35-image-generation.mdx +341 -0
  39. package/docs/03-ai-sdk-core/36-transcription.mdx +173 -0
  40. package/docs/03-ai-sdk-core/37-speech.mdx +167 -0
  41. package/docs/03-ai-sdk-core/40-middleware.mdx +480 -0
  42. package/docs/03-ai-sdk-core/45-provider-management.mdx +349 -0
  43. package/docs/03-ai-sdk-core/50-error-handling.mdx +149 -0
  44. package/docs/03-ai-sdk-core/55-testing.mdx +218 -0
  45. package/docs/03-ai-sdk-core/60-telemetry.mdx +313 -0
  46. package/docs/03-ai-sdk-core/65-devtools.mdx +107 -0
  47. package/docs/03-ai-sdk-core/index.mdx +88 -0
  48. package/docs/04-ai-sdk-ui/01-overview.mdx +44 -0
  49. package/docs/04-ai-sdk-ui/02-chatbot.mdx +1313 -0
  50. package/docs/04-ai-sdk-ui/03-chatbot-message-persistence.mdx +535 -0
  51. package/docs/04-ai-sdk-ui/03-chatbot-resume-streams.mdx +263 -0
  52. package/docs/04-ai-sdk-ui/03-chatbot-tool-usage.mdx +682 -0
  53. package/docs/04-ai-sdk-ui/04-generative-user-interfaces.mdx +389 -0
  54. package/docs/04-ai-sdk-ui/05-completion.mdx +186 -0
  55. package/docs/04-ai-sdk-ui/08-object-generation.mdx +344 -0
  56. package/docs/04-ai-sdk-ui/20-streaming-data.mdx +397 -0
  57. package/docs/04-ai-sdk-ui/21-error-handling.mdx +190 -0
  58. package/docs/04-ai-sdk-ui/21-transport.mdx +174 -0
  59. package/docs/04-ai-sdk-ui/24-reading-ui-message-streams.mdx +104 -0
  60. package/docs/04-ai-sdk-ui/25-message-metadata.mdx +152 -0
  61. package/docs/04-ai-sdk-ui/50-stream-protocol.mdx +477 -0
  62. package/docs/04-ai-sdk-ui/index.mdx +64 -0
  63. package/docs/05-ai-sdk-rsc/01-overview.mdx +45 -0
  64. package/docs/05-ai-sdk-rsc/02-streaming-react-components.mdx +209 -0
  65. package/docs/05-ai-sdk-rsc/03-generative-ui-state.mdx +279 -0
  66. package/docs/05-ai-sdk-rsc/03-saving-and-restoring-states.mdx +105 -0
  67. package/docs/05-ai-sdk-rsc/04-multistep-interfaces.mdx +282 -0
  68. package/docs/05-ai-sdk-rsc/05-streaming-values.mdx +158 -0
  69. package/docs/05-ai-sdk-rsc/06-loading-state.mdx +273 -0
  70. package/docs/05-ai-sdk-rsc/08-error-handling.mdx +96 -0
  71. package/docs/05-ai-sdk-rsc/09-authentication.mdx +42 -0
  72. package/docs/05-ai-sdk-rsc/10-migrating-to-ui.mdx +722 -0
  73. package/docs/05-ai-sdk-rsc/index.mdx +58 -0
  74. package/docs/06-advanced/01-prompt-engineering.mdx +96 -0
  75. package/docs/06-advanced/02-stopping-streams.mdx +184 -0
  76. package/docs/06-advanced/03-backpressure.mdx +173 -0
  77. package/docs/06-advanced/04-caching.mdx +169 -0
  78. package/docs/06-advanced/05-multiple-streamables.mdx +68 -0
  79. package/docs/06-advanced/06-rate-limiting.mdx +60 -0
  80. package/docs/06-advanced/07-rendering-ui-with-language-models.mdx +213 -0
  81. package/docs/06-advanced/08-model-as-router.mdx +120 -0
  82. package/docs/06-advanced/09-multistep-interfaces.mdx +115 -0
  83. package/docs/06-advanced/09-sequential-generations.mdx +55 -0
  84. package/docs/06-advanced/10-vercel-deployment-guide.mdx +117 -0
  85. package/docs/06-advanced/index.mdx +11 -0
  86. package/docs/07-reference/01-ai-sdk-core/01-generate-text.mdx +2142 -0
  87. package/docs/07-reference/01-ai-sdk-core/02-stream-text.mdx +3215 -0
  88. package/docs/07-reference/01-ai-sdk-core/03-generate-object.mdx +780 -0
  89. package/docs/07-reference/01-ai-sdk-core/04-stream-object.mdx +1140 -0
  90. package/docs/07-reference/01-ai-sdk-core/05-embed.mdx +190 -0
  91. package/docs/07-reference/01-ai-sdk-core/06-embed-many.mdx +171 -0
  92. package/docs/07-reference/01-ai-sdk-core/06-rerank.mdx +309 -0
  93. package/docs/07-reference/01-ai-sdk-core/10-generate-image.mdx +227 -0
  94. package/docs/07-reference/01-ai-sdk-core/11-transcribe.mdx +138 -0
  95. package/docs/07-reference/01-ai-sdk-core/12-generate-speech.mdx +214 -0
  96. package/docs/07-reference/01-ai-sdk-core/15-agent.mdx +203 -0
  97. package/docs/07-reference/01-ai-sdk-core/16-tool-loop-agent.mdx +449 -0
  98. package/docs/07-reference/01-ai-sdk-core/17-create-agent-ui-stream.mdx +148 -0
  99. package/docs/07-reference/01-ai-sdk-core/18-create-agent-ui-stream-response.mdx +168 -0
  100. package/docs/07-reference/01-ai-sdk-core/18-pipe-agent-ui-stream-to-response.mdx +144 -0
  101. package/docs/07-reference/01-ai-sdk-core/20-tool.mdx +196 -0
  102. package/docs/07-reference/01-ai-sdk-core/22-dynamic-tool.mdx +175 -0
  103. package/docs/07-reference/01-ai-sdk-core/23-create-mcp-client.mdx +410 -0
  104. package/docs/07-reference/01-ai-sdk-core/24-mcp-stdio-transport.mdx +68 -0
  105. package/docs/07-reference/01-ai-sdk-core/25-json-schema.mdx +94 -0
  106. package/docs/07-reference/01-ai-sdk-core/26-zod-schema.mdx +109 -0
  107. package/docs/07-reference/01-ai-sdk-core/27-valibot-schema.mdx +55 -0
  108. package/docs/07-reference/01-ai-sdk-core/28-output.mdx +342 -0
  109. package/docs/07-reference/01-ai-sdk-core/30-model-message.mdx +415 -0
  110. package/docs/07-reference/01-ai-sdk-core/31-ui-message.mdx +246 -0
  111. package/docs/07-reference/01-ai-sdk-core/32-validate-ui-messages.mdx +101 -0
  112. package/docs/07-reference/01-ai-sdk-core/33-safe-validate-ui-messages.mdx +113 -0
  113. package/docs/07-reference/01-ai-sdk-core/40-provider-registry.mdx +182 -0
  114. package/docs/07-reference/01-ai-sdk-core/42-custom-provider.mdx +121 -0
  115. package/docs/07-reference/01-ai-sdk-core/50-cosine-similarity.mdx +52 -0
  116. package/docs/07-reference/01-ai-sdk-core/60-wrap-language-model.mdx +59 -0
  117. package/docs/07-reference/01-ai-sdk-core/61-wrap-image-model.mdx +64 -0
  118. package/docs/07-reference/01-ai-sdk-core/65-language-model-v2-middleware.mdx +46 -0
  119. package/docs/07-reference/01-ai-sdk-core/66-extract-reasoning-middleware.mdx +68 -0
  120. package/docs/07-reference/01-ai-sdk-core/67-simulate-streaming-middleware.mdx +71 -0
  121. package/docs/07-reference/01-ai-sdk-core/68-default-settings-middleware.mdx +80 -0
  122. package/docs/07-reference/01-ai-sdk-core/69-add-tool-input-examples-middleware.mdx +155 -0
  123. package/docs/07-reference/01-ai-sdk-core/70-extract-json-middleware.mdx +147 -0
  124. package/docs/07-reference/01-ai-sdk-core/70-step-count-is.mdx +84 -0
  125. package/docs/07-reference/01-ai-sdk-core/71-has-tool-call.mdx +120 -0
  126. package/docs/07-reference/01-ai-sdk-core/75-simulate-readable-stream.mdx +94 -0
  127. package/docs/07-reference/01-ai-sdk-core/80-smooth-stream.mdx +145 -0
  128. package/docs/07-reference/01-ai-sdk-core/90-generate-id.mdx +43 -0
  129. package/docs/07-reference/01-ai-sdk-core/91-create-id-generator.mdx +89 -0
  130. package/docs/07-reference/01-ai-sdk-core/index.mdx +159 -0
  131. package/docs/07-reference/02-ai-sdk-ui/01-use-chat.mdx +446 -0
  132. package/docs/07-reference/02-ai-sdk-ui/02-use-completion.mdx +179 -0
  133. package/docs/07-reference/02-ai-sdk-ui/03-use-object.mdx +178 -0
  134. package/docs/07-reference/02-ai-sdk-ui/31-convert-to-model-messages.mdx +230 -0
  135. package/docs/07-reference/02-ai-sdk-ui/32-prune-messages.mdx +108 -0
  136. package/docs/07-reference/02-ai-sdk-ui/40-create-ui-message-stream.mdx +151 -0
  137. package/docs/07-reference/02-ai-sdk-ui/41-create-ui-message-stream-response.mdx +113 -0
  138. package/docs/07-reference/02-ai-sdk-ui/42-pipe-ui-message-stream-to-response.mdx +73 -0
  139. package/docs/07-reference/02-ai-sdk-ui/43-read-ui-message-stream.mdx +57 -0
  140. package/docs/07-reference/02-ai-sdk-ui/46-infer-ui-tools.mdx +99 -0
  141. package/docs/07-reference/02-ai-sdk-ui/47-infer-ui-tool.mdx +75 -0
  142. package/docs/07-reference/02-ai-sdk-ui/50-direct-chat-transport.mdx +333 -0
  143. package/docs/07-reference/02-ai-sdk-ui/index.mdx +89 -0
  144. package/docs/07-reference/03-ai-sdk-rsc/01-stream-ui.mdx +767 -0
  145. package/docs/07-reference/03-ai-sdk-rsc/02-create-ai.mdx +90 -0
  146. package/docs/07-reference/03-ai-sdk-rsc/03-create-streamable-ui.mdx +91 -0
  147. package/docs/07-reference/03-ai-sdk-rsc/04-create-streamable-value.mdx +48 -0
  148. package/docs/07-reference/03-ai-sdk-rsc/05-read-streamable-value.mdx +78 -0
  149. package/docs/07-reference/03-ai-sdk-rsc/06-get-ai-state.mdx +50 -0
  150. package/docs/07-reference/03-ai-sdk-rsc/07-get-mutable-ai-state.mdx +70 -0
  151. package/docs/07-reference/03-ai-sdk-rsc/08-use-ai-state.mdx +26 -0
  152. package/docs/07-reference/03-ai-sdk-rsc/09-use-actions.mdx +42 -0
  153. package/docs/07-reference/03-ai-sdk-rsc/10-use-ui-state.mdx +35 -0
  154. package/docs/07-reference/03-ai-sdk-rsc/11-use-streamable-value.mdx +46 -0
  155. package/docs/07-reference/03-ai-sdk-rsc/20-render.mdx +262 -0
  156. package/docs/07-reference/03-ai-sdk-rsc/index.mdx +67 -0
  157. package/docs/07-reference/04-stream-helpers/01-ai-stream.mdx +89 -0
  158. package/docs/07-reference/04-stream-helpers/02-streaming-text-response.mdx +79 -0
  159. package/docs/07-reference/04-stream-helpers/05-stream-to-response.mdx +108 -0
  160. package/docs/07-reference/04-stream-helpers/07-openai-stream.mdx +77 -0
  161. package/docs/07-reference/04-stream-helpers/08-anthropic-stream.mdx +79 -0
  162. package/docs/07-reference/04-stream-helpers/09-aws-bedrock-stream.mdx +91 -0
  163. package/docs/07-reference/04-stream-helpers/10-aws-bedrock-anthropic-stream.mdx +96 -0
  164. package/docs/07-reference/04-stream-helpers/10-aws-bedrock-messages-stream.mdx +96 -0
  165. package/docs/07-reference/04-stream-helpers/11-aws-bedrock-cohere-stream.mdx +93 -0
  166. package/docs/07-reference/04-stream-helpers/12-aws-bedrock-llama-2-stream.mdx +93 -0
  167. package/docs/07-reference/04-stream-helpers/13-cohere-stream.mdx +78 -0
  168. package/docs/07-reference/04-stream-helpers/14-google-generative-ai-stream.mdx +85 -0
  169. package/docs/07-reference/04-stream-helpers/15-hugging-face-stream.mdx +84 -0
  170. package/docs/07-reference/04-stream-helpers/16-langchain-adapter.mdx +98 -0
  171. package/docs/07-reference/04-stream-helpers/16-llamaindex-adapter.mdx +70 -0
  172. package/docs/07-reference/04-stream-helpers/17-mistral-stream.mdx +81 -0
  173. package/docs/07-reference/04-stream-helpers/18-replicate-stream.mdx +83 -0
  174. package/docs/07-reference/04-stream-helpers/19-inkeep-stream.mdx +80 -0
  175. package/docs/07-reference/04-stream-helpers/index.mdx +103 -0
  176. package/docs/07-reference/05-ai-sdk-errors/ai-api-call-error.mdx +30 -0
  177. package/docs/07-reference/05-ai-sdk-errors/ai-download-error.mdx +27 -0
  178. package/docs/07-reference/05-ai-sdk-errors/ai-empty-response-body-error.mdx +24 -0
  179. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-argument-error.mdx +26 -0
  180. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-data-content-error.mdx +25 -0
  181. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-data-content.mdx +26 -0
  182. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-message-role-error.mdx +25 -0
  183. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-prompt-error.mdx +47 -0
  184. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-response-data-error.mdx +25 -0
  185. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-tool-approval-error.mdx +25 -0
  186. package/docs/07-reference/05-ai-sdk-errors/ai-invalid-tool-input-error.mdx +27 -0
  187. package/docs/07-reference/05-ai-sdk-errors/ai-json-parse-error.mdx +25 -0
  188. package/docs/07-reference/05-ai-sdk-errors/ai-load-api-key-error.mdx +24 -0
  189. package/docs/07-reference/05-ai-sdk-errors/ai-load-setting-error.mdx +24 -0
  190. package/docs/07-reference/05-ai-sdk-errors/ai-message-conversion-error.mdx +25 -0
  191. package/docs/07-reference/05-ai-sdk-errors/ai-no-content-generated-error.mdx +24 -0
  192. package/docs/07-reference/05-ai-sdk-errors/ai-no-image-generated-error.mdx +36 -0
  193. package/docs/07-reference/05-ai-sdk-errors/ai-no-object-generated-error.mdx +43 -0
  194. package/docs/07-reference/05-ai-sdk-errors/ai-no-speech-generated-error.mdx +25 -0
  195. package/docs/07-reference/05-ai-sdk-errors/ai-no-such-model-error.mdx +26 -0
  196. package/docs/07-reference/05-ai-sdk-errors/ai-no-such-provider-error.mdx +28 -0
  197. package/docs/07-reference/05-ai-sdk-errors/ai-no-such-tool-error.mdx +26 -0
  198. package/docs/07-reference/05-ai-sdk-errors/ai-no-transcript-generated-error.mdx +25 -0
  199. package/docs/07-reference/05-ai-sdk-errors/ai-retry-error.mdx +27 -0
  200. package/docs/07-reference/05-ai-sdk-errors/ai-too-many-embedding-values-for-call-error.mdx +27 -0
  201. package/docs/07-reference/05-ai-sdk-errors/ai-tool-call-not-found-for-approval-error.mdx +26 -0
  202. package/docs/07-reference/05-ai-sdk-errors/ai-tool-call-repair-error.mdx +28 -0
  203. package/docs/07-reference/05-ai-sdk-errors/ai-type-validation-error.mdx +25 -0
  204. package/docs/07-reference/05-ai-sdk-errors/ai-unsupported-functionality-error.mdx +25 -0
  205. package/docs/07-reference/05-ai-sdk-errors/index.mdx +38 -0
  206. package/docs/07-reference/index.mdx +34 -0
  207. package/docs/08-migration-guides/00-versioning.mdx +46 -0
  208. package/docs/08-migration-guides/24-migration-guide-6-0.mdx +823 -0
  209. package/docs/08-migration-guides/25-migration-guide-5-0-data.mdx +882 -0
  210. package/docs/08-migration-guides/26-migration-guide-5-0.mdx +3427 -0
  211. package/docs/08-migration-guides/27-migration-guide-4-2.mdx +99 -0
  212. package/docs/08-migration-guides/28-migration-guide-4-1.mdx +14 -0
  213. package/docs/08-migration-guides/29-migration-guide-4-0.mdx +1157 -0
  214. package/docs/08-migration-guides/36-migration-guide-3-4.mdx +14 -0
  215. package/docs/08-migration-guides/37-migration-guide-3-3.mdx +64 -0
  216. package/docs/08-migration-guides/38-migration-guide-3-2.mdx +46 -0
  217. package/docs/08-migration-guides/39-migration-guide-3-1.mdx +168 -0
  218. package/docs/08-migration-guides/index.mdx +22 -0
  219. package/docs/09-troubleshooting/01-azure-stream-slow.mdx +33 -0
  220. package/docs/09-troubleshooting/02-client-side-function-calls-not-invoked.mdx +22 -0
  221. package/docs/09-troubleshooting/03-server-actions-in-client-components.mdx +40 -0
  222. package/docs/09-troubleshooting/04-strange-stream-output.mdx +36 -0
  223. package/docs/09-troubleshooting/05-streamable-ui-errors.mdx +16 -0
  224. package/docs/09-troubleshooting/05-tool-invocation-missing-result.mdx +106 -0
  225. package/docs/09-troubleshooting/06-streaming-not-working-when-deployed.mdx +31 -0
  226. package/docs/09-troubleshooting/06-streaming-not-working-when-proxied.mdx +31 -0
  227. package/docs/09-troubleshooting/06-timeout-on-vercel.mdx +60 -0
  228. package/docs/09-troubleshooting/07-unclosed-streams.mdx +34 -0
  229. package/docs/09-troubleshooting/08-use-chat-failed-to-parse-stream.mdx +26 -0
  230. package/docs/09-troubleshooting/09-client-stream-error.mdx +25 -0
  231. package/docs/09-troubleshooting/10-use-chat-tools-no-response.mdx +32 -0
  232. package/docs/09-troubleshooting/11-use-chat-custom-request-options.mdx +149 -0
  233. package/docs/09-troubleshooting/12-typescript-performance-zod.mdx +46 -0
  234. package/docs/09-troubleshooting/12-use-chat-an-error-occurred.mdx +59 -0
  235. package/docs/09-troubleshooting/13-repeated-assistant-messages.mdx +73 -0
  236. package/docs/09-troubleshooting/14-stream-abort-handling.mdx +73 -0
  237. package/docs/09-troubleshooting/14-tool-calling-with-structured-outputs.mdx +48 -0
  238. package/docs/09-troubleshooting/15-abort-breaks-resumable-streams.mdx +55 -0
  239. package/docs/09-troubleshooting/15-stream-text-not-working.mdx +33 -0
  240. package/docs/09-troubleshooting/16-streaming-status-delay.mdx +63 -0
  241. package/docs/09-troubleshooting/17-use-chat-stale-body-data.mdx +141 -0
  242. package/docs/09-troubleshooting/18-ontoolcall-type-narrowing.mdx +66 -0
  243. package/docs/09-troubleshooting/19-unsupported-model-version.mdx +50 -0
  244. package/docs/09-troubleshooting/20-no-object-generated-content-filter.mdx +72 -0
  245. package/docs/09-troubleshooting/30-model-is-not-assignable-to-type.mdx +21 -0
  246. package/docs/09-troubleshooting/40-typescript-cannot-find-namespace-jsx.mdx +24 -0
  247. package/docs/09-troubleshooting/50-react-maximum-update-depth-exceeded.mdx +39 -0
  248. package/docs/09-troubleshooting/60-jest-cannot-find-module-ai-rsc.mdx +22 -0
  249. package/docs/09-troubleshooting/index.mdx +11 -0
  250. package/package.json +8 -4
@@ -0,0 +1,282 @@
1
+ ---
2
+ title: Multistep Interfaces
3
+ description: Overview of Building Multistep Interfaces with AI SDK RSC
4
+ ---
5
+
6
+ # Designing Multistep Interfaces
7
+
8
+ <Note type="warning">
9
+ AI SDK RSC is currently experimental. We recommend using [AI SDK
10
+ UI](/docs/ai-sdk-ui/overview) for production. For guidance on migrating from
11
+ RSC to UI, see our [migration guide](/docs/ai-sdk-rsc/migrating-to-ui).
12
+ </Note>
13
+
14
+ Multistep interfaces refer to user interfaces that require multiple independent steps to be executed in order to complete a specific task.
15
+
16
+ For example, if you wanted to build a Generative UI chatbot capable of booking flights, it could have three steps:
17
+
18
+ - Search all flights
19
+ - Pick flight
20
+ - Check availability
21
+
22
+ To build this kind of application you will leverage two concepts, **tool composition** and **application context**.
23
+
24
+ **Tool composition** is the process of combining multiple [tools](/docs/ai-sdk-core/tools-and-tool-calling) to create a new tool. This is a powerful concept that allows you to break down complex tasks into smaller, more manageable steps. In the example above, _"search all flights"_, _"pick flight"_, and _"check availability"_ come together to create a holistic _"book flight"_ tool.
25
+
26
+ **Application context** refers to the state of the application at any given point in time. This includes the user's input, the output of the language model, and any other relevant information. In the example above, the flight selected in _"pick flight"_ would be used as context necessary to complete the _"check availability"_ task.
27
+
28
+ ## Overview
29
+
30
+ In order to build a multistep interface with `@ai-sdk/rsc`, you will need a few things:
31
+
32
+ - A Server Action that calls and returns the result from the `streamUI` function
33
+ - Tool(s) (sub-tasks necessary to complete your overall task)
34
+ - React component(s) that should be rendered when the tool is called
35
+ - A page to render your chatbot
36
+
37
+ The general flow that you will follow is:
38
+
39
+ - User sends a message (calls your Server Action with `useActions`, passing the message as an input)
40
+ - Message is appended to the AI State and then passed to the model alongside a number of tools
41
+ - Model can decide to call a tool, which will render the `<SomeTool />` component
42
+ - Within that component, you can add interactivity by using `useActions` to call the model with your Server Action and `useUIState` to append the model's response (`<SomeOtherTool />`) to the UI State
43
+ - And so on...
44
+
45
+ ## Implementation
46
+
47
+ The turn-by-turn implementation is the simplest form of multistep interfaces. In this implementation, the user and the model take turns during the conversation. For every user input, the model generates a response, and the conversation continues in this turn-by-turn fashion.
48
+
49
+ In the following example, you specify two tools (`searchFlights` and `lookupFlight`) that the model can use to search for flights and lookup details for a specific flight.
50
+
51
+ ```tsx filename="app/actions.tsx"
52
+ import { streamUI } from '@ai-sdk/rsc';
53
+ import { openai } from '@ai-sdk/openai';
54
+ import { z } from 'zod';
55
+
56
+ const searchFlights = async (
57
+ source: string,
58
+ destination: string,
59
+ date: string,
60
+ ) => {
61
+ return [
62
+ {
63
+ id: '1',
64
+ flightNumber: 'AA123',
65
+ },
66
+ {
67
+ id: '2',
68
+ flightNumber: 'AA456',
69
+ },
70
+ ];
71
+ };
72
+
73
+ const lookupFlight = async (flightNumber: string) => {
74
+ return {
75
+ flightNumber: flightNumber,
76
+ departureTime: '10:00 AM',
77
+ arrivalTime: '12:00 PM',
78
+ };
79
+ };
80
+
81
+ export async function submitUserMessage(input: string) {
82
+ 'use server';
83
+
84
+ const ui = await streamUI({
85
+ model: openai('gpt-4o'),
86
+ system: 'you are a flight booking assistant',
87
+ prompt: input,
88
+ text: async ({ content }) => <div>{content}</div>,
89
+ tools: {
90
+ searchFlights: {
91
+ description: 'search for flights',
92
+ inputSchema: z.object({
93
+ source: z.string().describe('The origin of the flight'),
94
+ destination: z.string().describe('The destination of the flight'),
95
+ date: z.string().describe('The date of the flight'),
96
+ }),
97
+ generate: async function* ({ source, destination, date }) {
98
+ yield `Searching for flights from ${source} to ${destination} on ${date}...`;
99
+ const results = await searchFlights(source, destination, date);
100
+
101
+ return (
102
+ <div>
103
+ {results.map(result => (
104
+ <div key={result.id}>
105
+ <div>{result.flightNumber}</div>
106
+ </div>
107
+ ))}
108
+ </div>
109
+ );
110
+ },
111
+ },
112
+ lookupFlight: {
113
+ description: 'lookup details for a flight',
114
+ parameters: z.object({
115
+ flightNumber: z.string().describe('The flight number'),
116
+ }),
117
+ generate: async function* ({ flightNumber }) {
118
+ yield `Looking up details for flight ${flightNumber}...`;
119
+ const details = await lookupFlight(flightNumber);
120
+
121
+ return (
122
+ <div>
123
+ <div>Flight Number: {details.flightNumber}</div>
124
+ <div>Departure Time: {details.departureTime}</div>
125
+ <div>Arrival Time: {details.arrivalTime}</div>
126
+ </div>
127
+ );
128
+ },
129
+ },
130
+ },
131
+ });
132
+
133
+ return ui.value;
134
+ }
135
+ ```
136
+
137
+ Next, create an AI context that will hold the UI State and AI State.
138
+
139
+ ```ts filename='app/ai.ts'
140
+ import { createAI } from '@ai-sdk/rsc';
141
+ import { submitUserMessage } from './actions';
142
+
143
+ export const AI = createAI<any[], React.ReactNode[]>({
144
+ initialUIState: [],
145
+ initialAIState: [],
146
+ actions: {
147
+ submitUserMessage,
148
+ },
149
+ });
150
+ ```
151
+
152
+ Next, wrap your application with your newly created context.
153
+
154
+ ```tsx filename='app/layout.tsx'
155
+ import { type ReactNode } from 'react';
156
+ import { AI } from './ai';
157
+
158
+ export default function RootLayout({
159
+ children,
160
+ }: Readonly<{ children: ReactNode }>) {
161
+ return (
162
+ <AI>
163
+ <html lang="en">
164
+ <body>{children}</body>
165
+ </html>
166
+ </AI>
167
+ );
168
+ }
169
+ ```
170
+
171
+ To call your Server Action, update your root page with the following:
172
+
173
+ ```tsx filename="app/page.tsx"
174
+ 'use client';
175
+
176
+ import { useState } from 'react';
177
+ import { AI } from './ai';
178
+ import { useActions, useUIState } from '@ai-sdk/rsc';
179
+
180
+ export default function Page() {
181
+ const [input, setInput] = useState<string>('');
182
+ const [conversation, setConversation] = useUIState<typeof AI>();
183
+ const { submitUserMessage } = useActions();
184
+
185
+ const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
186
+ e.preventDefault();
187
+ setInput('');
188
+ setConversation(currentConversation => [
189
+ ...currentConversation,
190
+ <div>{input}</div>,
191
+ ]);
192
+ const message = await submitUserMessage(input);
193
+ setConversation(currentConversation => [...currentConversation, message]);
194
+ };
195
+
196
+ return (
197
+ <div>
198
+ <div>
199
+ {conversation.map((message, i) => (
200
+ <div key={i}>{message}</div>
201
+ ))}
202
+ </div>
203
+ <div>
204
+ <form onSubmit={handleSubmit}>
205
+ <input
206
+ type="text"
207
+ value={input}
208
+ onChange={e => setInput(e.target.value)}
209
+ />
210
+ <button>Send Message</button>
211
+ </form>
212
+ </div>
213
+ </div>
214
+ );
215
+ }
216
+ ```
217
+
218
+ This page pulls in the current UI State using the `useUIState` hook, which is then mapped over and rendered in the UI. To access the Server Action, you use the `useActions` hook which will return all actions that were passed to the `actions` key of the `createAI` function in your `actions.tsx` file. Finally, you call the `submitUserMessage` function like any other TypeScript function. This function returns a React component (`message`) that is then rendered in the UI by updating the UI State with `setConversation`.
219
+
220
+ In this example, to call the next tool, the user must respond with plain text. **Given you are streaming a React component, you can add a button to trigger the next step in the conversation**.
221
+
222
+ To add user interaction, you will have to convert the component into a client component and use the `useAction` hook to trigger the next step in the conversation.
223
+
224
+ ```tsx filename="components/flights.tsx"
225
+ 'use client';
226
+
227
+ import { useActions, useUIState } from '@ai-sdk/rsc';
228
+ import { ReactNode } from 'react';
229
+
230
+ interface FlightsProps {
231
+ flights: { id: string; flightNumber: string }[];
232
+ }
233
+
234
+ export const Flights = ({ flights }: FlightsProps) => {
235
+ const { submitUserMessage } = useActions();
236
+ const [_, setMessages] = useUIState();
237
+
238
+ return (
239
+ <div>
240
+ {flights.map(result => (
241
+ <div key={result.id}>
242
+ <div
243
+ onClick={async () => {
244
+ const display = await submitUserMessage(
245
+ `lookupFlight ${result.flightNumber}`,
246
+ );
247
+
248
+ setMessages((messages: ReactNode[]) => [...messages, display]);
249
+ }}
250
+ >
251
+ {result.flightNumber}
252
+ </div>
253
+ </div>
254
+ ))}
255
+ </div>
256
+ );
257
+ };
258
+ ```
259
+
260
+ Now, update your `searchFlights` tool to render the new `<Flights />` component.
261
+
262
+ ```tsx filename="actions.tsx"
263
+ ...
264
+ searchFlights: {
265
+ description: 'search for flights',
266
+ parameters: z.object({
267
+ source: z.string().describe('The origin of the flight'),
268
+ destination: z.string().describe('The destination of the flight'),
269
+ date: z.string().describe('The date of the flight'),
270
+ }),
271
+ generate: async function* ({ source, destination, date }) {
272
+ yield `Searching for flights from ${source} to ${destination} on ${date}...`;
273
+ const results = await searchFlights(source, destination, date);
274
+ return (<Flights flights={results} />);
275
+ },
276
+ }
277
+ ...
278
+ ```
279
+
280
+ In the above example, the `Flights` component is used to display the search results. When the user clicks on a flight number, the `lookupFlight` tool is called with the flight number as a parameter. The `submitUserMessage` action is then called to trigger the next step in the conversation.
281
+
282
+ Learn more about tool calling in Next.js App Router by checking out examples [here](/examples/next-app/tools).
@@ -0,0 +1,158 @@
1
+ ---
2
+ title: Streaming Values
3
+ description: Overview of streaming RSCs
4
+ ---
5
+
6
+ import { UIPreviewCard, Card } from '@/components/home/card';
7
+ import { EventPlanning } from '@/components/home/event-planning';
8
+ import { Searching } from '@/components/home/searching';
9
+ import { Weather } from '@/components/home/weather';
10
+
11
+ # Streaming Values
12
+
13
+ <Note type="warning">
14
+ AI SDK RSC is currently experimental. We recommend using [AI SDK
15
+ UI](/docs/ai-sdk-ui/overview) for production. For guidance on migrating from
16
+ RSC to UI, see our [migration guide](/docs/ai-sdk-rsc/migrating-to-ui).
17
+ </Note>
18
+
19
+ The RSC API provides several utility functions to allow you to stream values from the server to the client. This is useful when you need more granular control over what you are streaming and how you are streaming it.
20
+
21
+ <Note>
22
+ These utilities can also be paired with [AI SDK Core](/docs/ai-sdk-core)
23
+ functions like [`streamText`](/docs/reference/ai-sdk-core/stream-text) and
24
+ [`streamObject`](/docs/reference/ai-sdk-core/stream-object) to easily stream
25
+ LLM generations from the server to the client.
26
+ </Note>
27
+
28
+ There are two functions provided by the RSC API that allow you to create streamable values:
29
+
30
+ - [`createStreamableValue`](/docs/reference/ai-sdk-rsc/create-streamable-value) - creates a streamable (serializable) value, with full control over how you create, update, and close the stream.
31
+ - [`createStreamableUI`](/docs/reference/ai-sdk-rsc/create-streamable-ui) - creates a streamable React component, with full control over how you create, update, and close the stream.
32
+
33
+ ## `createStreamableValue`
34
+
35
+ The RSC API allows you to stream serializable Javascript values from the server to the client using [`createStreamableValue`](/docs/reference/ai-sdk-rsc/create-streamable-value), such as strings, numbers, objects, and arrays.
36
+
37
+ This is useful when you want to stream:
38
+
39
+ - Text generations from the language model in real-time.
40
+ - Buffer values of image and audio generations from multi-modal models.
41
+ - Progress updates from multi-step agent runs.
42
+
43
+ ## Creating a Streamable Value
44
+
45
+ You can import `createStreamableValue` from `@ai-sdk/rsc` and use it to create a streamable value.
46
+
47
+ ```tsx file='app/actions.ts'
48
+ 'use server';
49
+
50
+ import { createStreamableValue } from '@ai-sdk/rsc';
51
+
52
+ export const runThread = async () => {
53
+ const streamableStatus = createStreamableValue('thread.init');
54
+
55
+ setTimeout(() => {
56
+ streamableStatus.update('thread.run.create');
57
+ streamableStatus.update('thread.run.update');
58
+ streamableStatus.update('thread.run.end');
59
+ streamableStatus.done('thread.end');
60
+ }, 1000);
61
+
62
+ return {
63
+ status: streamableStatus.value,
64
+ };
65
+ };
66
+ ```
67
+
68
+ ## Reading a Streamable Value
69
+
70
+ You can read streamable values on the client using `readStreamableValue`. It returns an async iterator that yields the value of the streamable as it is updated:
71
+
72
+ ```tsx file='app/page.tsx'
73
+ import { readStreamableValue } from '@ai-sdk/rsc';
74
+ import { runThread } from '@/actions';
75
+
76
+ export default function Page() {
77
+ return (
78
+ <button
79
+ onClick={async () => {
80
+ const { status } = await runThread();
81
+
82
+ for await (const value of readStreamableValue(status)) {
83
+ console.log(value);
84
+ }
85
+ }}
86
+ >
87
+ Ask
88
+ </button>
89
+ );
90
+ }
91
+ ```
92
+
93
+ Learn how to stream a text generation (with `streamText`) using the Next.js App Router and `createStreamableValue` in this [example](/examples/next-app/basics/streaming-text-generation).
94
+
95
+ ## `createStreamableUI`
96
+
97
+ `createStreamableUI` creates a stream that holds a React component. Unlike AI SDK Core APIs, this function does not call a large language model. Instead, it provides a primitive that can be used to have granular control over streaming a React component.
98
+
99
+ ## Using `createStreamableUI`
100
+
101
+ Let's look at how you can use the `createStreamableUI` function with a Server Action.
102
+
103
+ ```tsx filename='app/actions.tsx'
104
+ 'use server';
105
+
106
+ import { createStreamableUI } from '@ai-sdk/rsc';
107
+
108
+ export async function getWeather() {
109
+ const weatherUI = createStreamableUI();
110
+
111
+ weatherUI.update(<div style={{ color: 'gray' }}>Loading...</div>);
112
+
113
+ setTimeout(() => {
114
+ weatherUI.done(<div>It&apos;s a sunny day!</div>);
115
+ }, 1000);
116
+
117
+ return weatherUI.value;
118
+ }
119
+ ```
120
+
121
+ First, you create a streamable UI with an empty state and then update it with a loading message. After 1 second, you mark the stream as done passing in the actual weather information as its final value. The `.value` property contains the actual UI that can be sent to the client.
122
+
123
+ ## Reading a Streamable UI
124
+
125
+ On the client side, you can call the `getWeather` Server Action and render the returned UI like any other React component.
126
+
127
+ ```tsx filename='app/page.tsx'
128
+ 'use client';
129
+
130
+ import { useState } from 'react';
131
+ import { readStreamableValue } from '@ai-sdk/rsc';
132
+ import { getWeather } from '@/actions';
133
+
134
+ export default function Page() {
135
+ const [weather, setWeather] = useState<React.ReactNode | null>(null);
136
+
137
+ return (
138
+ <div>
139
+ <button
140
+ onClick={async () => {
141
+ const weatherUI = await getWeather();
142
+ setWeather(weatherUI);
143
+ }}
144
+ >
145
+ What&apos;s the weather?
146
+ </button>
147
+
148
+ {weather}
149
+ </div>
150
+ );
151
+ }
152
+ ```
153
+
154
+ When the button is clicked, the `getWeather` function is called, and the returned UI is set to the `weather` state and rendered on the page. Users will see the loading message first and then the actual weather information after 1 second.
155
+
156
+ Learn more about handling multiple streams in a single request in the [Multiple Streamables](/docs/advanced/multiple-streamables) guide.
157
+
158
+ Learn more about handling state for more complex use cases with [ AI/UI State ](/docs/ai-sdk-rsc/generative-ui-state).