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,389 @@
1
+ ---
2
+ title: Generative User Interfaces
3
+ description: Learn how to build Generative UI with AI SDK UI.
4
+ ---
5
+
6
+ # Generative User Interfaces
7
+
8
+ Generative user interfaces (generative UI) is the process of allowing a large language model (LLM) to go beyond text and "generate UI". This creates a more engaging and AI-native experience for users.
9
+
10
+ <WeatherSearch />
11
+
12
+ At the core of generative UI are [ tools ](/docs/ai-sdk-core/tools-and-tool-calling), which are functions you provide to the model to perform specialized tasks like getting the weather in a location. The model can decide when and how to use these tools based on the context of the conversation.
13
+
14
+ Generative UI is the process of connecting the results of a tool call to a React component. Here's how it works:
15
+
16
+ 1. You provide the model with a prompt or conversation history, along with a set of tools.
17
+ 2. Based on the context, the model may decide to call a tool.
18
+ 3. If a tool is called, it will execute and return data.
19
+ 4. This data can then be passed to a React component for rendering.
20
+
21
+ By passing the tool results to React components, you can create a generative UI experience that's more engaging and adaptive to your needs.
22
+
23
+ ## Build a Generative UI Chat Interface
24
+
25
+ Let's create a chat interface that handles text-based conversations and incorporates dynamic UI elements based on model responses.
26
+
27
+ ### Basic Chat Implementation
28
+
29
+ Start with a basic chat implementation using the `useChat` hook:
30
+
31
+ ```tsx filename="app/page.tsx"
32
+ 'use client';
33
+
34
+ import { useChat } from '@ai-sdk/react';
35
+ import { useState } from 'react';
36
+
37
+ export default function Page() {
38
+ const [input, setInput] = useState('');
39
+ const { messages, sendMessage } = useChat();
40
+
41
+ const handleSubmit = (e: React.FormEvent) => {
42
+ e.preventDefault();
43
+ sendMessage({ text: input });
44
+ setInput('');
45
+ };
46
+
47
+ return (
48
+ <div>
49
+ {messages.map(message => (
50
+ <div key={message.id}>
51
+ <div>{message.role === 'user' ? 'User: ' : 'AI: '}</div>
52
+ <div>
53
+ {message.parts.map((part, index) => {
54
+ if (part.type === 'text') {
55
+ return <span key={index}>{part.text}</span>;
56
+ }
57
+ return null;
58
+ })}
59
+ </div>
60
+ </div>
61
+ ))}
62
+
63
+ <form onSubmit={handleSubmit}>
64
+ <input
65
+ value={input}
66
+ onChange={e => setInput(e.target.value)}
67
+ placeholder="Type a message..."
68
+ />
69
+ <button type="submit">Send</button>
70
+ </form>
71
+ </div>
72
+ );
73
+ }
74
+ ```
75
+
76
+ To handle the chat requests and model responses, set up an API route:
77
+
78
+ ```ts filename="app/api/chat/route.ts"
79
+ import { streamText, convertToModelMessages, UIMessage, stepCountIs } from 'ai';
80
+ __PROVIDER_IMPORT__;
81
+
82
+ export async function POST(request: Request) {
83
+ const { messages }: { messages: UIMessage[] } = await request.json();
84
+
85
+ const result = streamText({
86
+ model: __MODEL__,
87
+ system: 'You are a friendly assistant!',
88
+ messages: await convertToModelMessages(messages),
89
+ stopWhen: stepCountIs(5),
90
+ });
91
+
92
+ return result.toUIMessageStreamResponse();
93
+ }
94
+ ```
95
+
96
+ This API route uses the `streamText` function to process chat messages and stream the model's responses back to the client.
97
+
98
+ ### Create a Tool
99
+
100
+ Before enhancing your chat interface with dynamic UI elements, you need to create a tool and corresponding React component. A tool will allow the model to perform a specific action, such as fetching weather information.
101
+
102
+ Create a new file called `ai/tools.ts` with the following content:
103
+
104
+ ```ts filename="ai/tools.ts"
105
+ import { tool as createTool } from 'ai';
106
+ import { z } from 'zod';
107
+
108
+ export const weatherTool = createTool({
109
+ description: 'Display the weather for a location',
110
+ inputSchema: z.object({
111
+ location: z.string().describe('The location to get the weather for'),
112
+ }),
113
+ execute: async function ({ location }) {
114
+ await new Promise(resolve => setTimeout(resolve, 2000));
115
+ return { weather: 'Sunny', temperature: 75, location };
116
+ },
117
+ });
118
+
119
+ export const tools = {
120
+ displayWeather: weatherTool,
121
+ };
122
+ ```
123
+
124
+ In this file, you've created a tool called `weatherTool`. This tool simulates fetching weather information for a given location. This tool will return simulated data after a 2-second delay. In a real-world application, you would replace this simulation with an actual API call to a weather service.
125
+
126
+ ### Update the API Route
127
+
128
+ Update the API route to include the tool you've defined:
129
+
130
+ ```ts filename="app/api/chat/route.ts" highlight="3,8,14"
131
+ import { streamText, convertToModelMessages, UIMessage, stepCountIs } from 'ai';
132
+ __PROVIDER_IMPORT__;
133
+ import { tools } from '@/ai/tools';
134
+
135
+ export async function POST(request: Request) {
136
+ const { messages }: { messages: UIMessage[] } = await request.json();
137
+
138
+ const result = streamText({
139
+ model: __MODEL__,
140
+ system: 'You are a friendly assistant!',
141
+ messages: await convertToModelMessages(messages),
142
+ stopWhen: stepCountIs(5),
143
+ tools,
144
+ });
145
+
146
+ return result.toUIMessageStreamResponse();
147
+ }
148
+ ```
149
+
150
+ Now that you've defined the tool and added it to your `streamText` call, let's build a React component to display the weather information it returns.
151
+
152
+ ### Create UI Components
153
+
154
+ Create a new file called `components/weather.tsx`:
155
+
156
+ ```tsx filename="components/weather.tsx"
157
+ type WeatherProps = {
158
+ temperature: number;
159
+ weather: string;
160
+ location: string;
161
+ };
162
+
163
+ export const Weather = ({ temperature, weather, location }: WeatherProps) => {
164
+ return (
165
+ <div>
166
+ <h2>Current Weather for {location}</h2>
167
+ <p>Condition: {weather}</p>
168
+ <p>Temperature: {temperature}°C</p>
169
+ </div>
170
+ );
171
+ };
172
+ ```
173
+
174
+ This component will display the weather information for a given location. It takes three props: `temperature`, `weather`, and `location` (exactly what the `weatherTool` returns).
175
+
176
+ ### Render the Weather Component
177
+
178
+ Now that you have your tool and corresponding React component, let's integrate them into your chat interface. You'll render the Weather component when the model calls the weather tool.
179
+
180
+ To check if the model has called a tool, you can check the `parts` array of the UIMessage object for tool-specific parts. In AI SDK 5.0, tool parts use typed naming: `tool-${toolName}` instead of generic types.
181
+
182
+ Update your `page.tsx` file:
183
+
184
+ ```tsx filename="app/page.tsx" highlight="4,9,14-15,19-46"
185
+ 'use client';
186
+
187
+ import { useChat } from '@ai-sdk/react';
188
+ import { useState } from 'react';
189
+ import { Weather } from '@/components/weather';
190
+
191
+ export default function Page() {
192
+ const [input, setInput] = useState('');
193
+ const { messages, sendMessage } = useChat();
194
+
195
+ const handleSubmit = (e: React.FormEvent) => {
196
+ e.preventDefault();
197
+ sendMessage({ text: input });
198
+ setInput('');
199
+ };
200
+
201
+ return (
202
+ <div>
203
+ {messages.map(message => (
204
+ <div key={message.id}>
205
+ <div>{message.role === 'user' ? 'User: ' : 'AI: '}</div>
206
+ <div>
207
+ {message.parts.map((part, index) => {
208
+ if (part.type === 'text') {
209
+ return <span key={index}>{part.text}</span>;
210
+ }
211
+
212
+ if (part.type === 'tool-displayWeather') {
213
+ switch (part.state) {
214
+ case 'input-available':
215
+ return <div key={index}>Loading weather...</div>;
216
+ case 'output-available':
217
+ return (
218
+ <div key={index}>
219
+ <Weather {...part.output} />
220
+ </div>
221
+ );
222
+ case 'output-error':
223
+ return <div key={index}>Error: {part.errorText}</div>;
224
+ default:
225
+ return null;
226
+ }
227
+ }
228
+
229
+ return null;
230
+ })}
231
+ </div>
232
+ </div>
233
+ ))}
234
+
235
+ <form onSubmit={handleSubmit}>
236
+ <input
237
+ value={input}
238
+ onChange={e => setInput(e.target.value)}
239
+ placeholder="Type a message..."
240
+ />
241
+ <button type="submit">Send</button>
242
+ </form>
243
+ </div>
244
+ );
245
+ }
246
+ ```
247
+
248
+ In this updated code snippet, you:
249
+
250
+ 1. Use manual input state management with `useState` instead of the built-in `input` and `handleInputChange`.
251
+ 2. Use `sendMessage` instead of `handleSubmit` to send messages.
252
+ 3. Check the `parts` array of each message for different content types.
253
+ 4. Handle tool parts with type `tool-displayWeather` and their different states (`input-available`, `output-available`, `output-error`).
254
+
255
+ This approach allows you to dynamically render UI components based on the model's responses, creating a more interactive and context-aware chat experience.
256
+
257
+ ## Expanding Your Generative UI Application
258
+
259
+ You can enhance your chat application by adding more tools and components, creating a richer and more versatile user experience. Here's how you can expand your application:
260
+
261
+ ### Adding More Tools
262
+
263
+ To add more tools, simply define them in your `ai/tools.ts` file:
264
+
265
+ ```ts
266
+ // Add a new stock tool
267
+ export const stockTool = createTool({
268
+ description: 'Get price for a stock',
269
+ inputSchema: z.object({
270
+ symbol: z.string().describe('The stock symbol to get the price for'),
271
+ }),
272
+ execute: async function ({ symbol }) {
273
+ // Simulated API call
274
+ await new Promise(resolve => setTimeout(resolve, 2000));
275
+ return { symbol, price: 100 };
276
+ },
277
+ });
278
+
279
+ // Update the tools object
280
+ export const tools = {
281
+ displayWeather: weatherTool,
282
+ getStockPrice: stockTool,
283
+ };
284
+ ```
285
+
286
+ Now, create a new file called `components/stock.tsx`:
287
+
288
+ ```tsx
289
+ type StockProps = {
290
+ price: number;
291
+ symbol: string;
292
+ };
293
+
294
+ export const Stock = ({ price, symbol }: StockProps) => {
295
+ return (
296
+ <div>
297
+ <h2>Stock Information</h2>
298
+ <p>Symbol: {symbol}</p>
299
+ <p>Price: ${price}</p>
300
+ </div>
301
+ );
302
+ };
303
+ ```
304
+
305
+ Finally, update your `page.tsx` file to include the new Stock component:
306
+
307
+ ```tsx
308
+ 'use client';
309
+
310
+ import { useChat } from '@ai-sdk/react';
311
+ import { useState } from 'react';
312
+ import { Weather } from '@/components/weather';
313
+ import { Stock } from '@/components/stock';
314
+
315
+ export default function Page() {
316
+ const [input, setInput] = useState('');
317
+ const { messages, sendMessage } = useChat();
318
+
319
+ const handleSubmit = (e: React.FormEvent) => {
320
+ e.preventDefault();
321
+ sendMessage({ text: input });
322
+ setInput('');
323
+ };
324
+
325
+ return (
326
+ <div>
327
+ {messages.map(message => (
328
+ <div key={message.id}>
329
+ <div>{message.role}</div>
330
+ <div>
331
+ {message.parts.map((part, index) => {
332
+ if (part.type === 'text') {
333
+ return <span key={index}>{part.text}</span>;
334
+ }
335
+
336
+ if (part.type === 'tool-displayWeather') {
337
+ switch (part.state) {
338
+ case 'input-available':
339
+ return <div key={index}>Loading weather...</div>;
340
+ case 'output-available':
341
+ return (
342
+ <div key={index}>
343
+ <Weather {...part.output} />
344
+ </div>
345
+ );
346
+ case 'output-error':
347
+ return <div key={index}>Error: {part.errorText}</div>;
348
+ default:
349
+ return null;
350
+ }
351
+ }
352
+
353
+ if (part.type === 'tool-getStockPrice') {
354
+ switch (part.state) {
355
+ case 'input-available':
356
+ return <div key={index}>Loading stock price...</div>;
357
+ case 'output-available':
358
+ return (
359
+ <div key={index}>
360
+ <Stock {...part.output} />
361
+ </div>
362
+ );
363
+ case 'output-error':
364
+ return <div key={index}>Error: {part.errorText}</div>;
365
+ default:
366
+ return null;
367
+ }
368
+ }
369
+
370
+ return null;
371
+ })}
372
+ </div>
373
+ </div>
374
+ ))}
375
+
376
+ <form onSubmit={handleSubmit}>
377
+ <input
378
+ type="text"
379
+ value={input}
380
+ onChange={e => setInput(e.target.value)}
381
+ />
382
+ <button type="submit">Send</button>
383
+ </form>
384
+ </div>
385
+ );
386
+ }
387
+ ```
388
+
389
+ By following this pattern, you can continue to add more tools and components, expanding the capabilities of your Generative UI application.
@@ -0,0 +1,186 @@
1
+ ---
2
+ title: Completion
3
+ description: Learn how to use the useCompletion hook.
4
+ ---
5
+
6
+ # Completion
7
+
8
+ The `useCompletion` hook allows you to create a user interface to handle text completions in your application. It enables the streaming of text completions from your AI provider, manages the state for chat input, and updates the UI automatically as new messages are received.
9
+
10
+ <Note>
11
+ The `useCompletion` hook is now part of the `@ai-sdk/react` package.
12
+ </Note>
13
+
14
+ In this guide, you will learn how to use the `useCompletion` hook in your application to generate text completions and stream them in real-time to your users.
15
+
16
+ ## Example
17
+
18
+ ```tsx filename='app/page.tsx'
19
+ 'use client';
20
+
21
+ import { useCompletion } from '@ai-sdk/react';
22
+
23
+ export default function Page() {
24
+ const { completion, input, handleInputChange, handleSubmit } = useCompletion({
25
+ api: '/api/completion',
26
+ });
27
+
28
+ return (
29
+ <form onSubmit={handleSubmit}>
30
+ <input
31
+ name="prompt"
32
+ value={input}
33
+ onChange={handleInputChange}
34
+ id="input"
35
+ />
36
+ <button type="submit">Submit</button>
37
+ <div>{completion}</div>
38
+ </form>
39
+ );
40
+ }
41
+ ```
42
+
43
+ ```ts filename='app/api/completion/route.ts'
44
+ import { streamText } from 'ai';
45
+ __PROVIDER_IMPORT__;
46
+
47
+ // Allow streaming responses up to 30 seconds
48
+ export const maxDuration = 30;
49
+
50
+ export async function POST(req: Request) {
51
+ const { prompt }: { prompt: string } = await req.json();
52
+
53
+ const result = streamText({
54
+ model: __MODEL__,
55
+ prompt,
56
+ });
57
+
58
+ return result.toUIMessageStreamResponse();
59
+ }
60
+ ```
61
+
62
+ In the `Page` component, the `useCompletion` hook will request to your AI provider endpoint whenever the user submits a message. The completion is then streamed back in real-time and displayed in the UI.
63
+
64
+ This enables a seamless text completion experience where the user can see the AI response as soon as it is available, without having to wait for the entire response to be received.
65
+
66
+ ## Customized UI
67
+
68
+ `useCompletion` also provides ways to manage the prompt via code, show loading and error states, and update messages without being triggered by user interactions.
69
+
70
+ ### Loading and error states
71
+
72
+ To show a loading spinner while the chatbot is processing the user's message, you can use the `isLoading` state returned by the `useCompletion` hook:
73
+
74
+ ```tsx
75
+ const { isLoading, ... } = useCompletion()
76
+
77
+ return(
78
+ <>
79
+ {isLoading ? <Spinner /> : null}
80
+ </>
81
+ )
82
+ ```
83
+
84
+ Similarly, the `error` state reflects the error object thrown during the fetch request. It can be used to display an error message, or show a toast notification:
85
+
86
+ ```tsx
87
+ const { error, ... } = useCompletion()
88
+
89
+ useEffect(() => {
90
+ if (error) {
91
+ toast.error(error.message)
92
+ }
93
+ }, [error])
94
+
95
+ // Or display the error message in the UI:
96
+ return (
97
+ <>
98
+ {error ? <div>{error.message}</div> : null}
99
+ </>
100
+ )
101
+ ```
102
+
103
+ ### Controlled input
104
+
105
+ In the initial example, we have `handleSubmit` and `handleInputChange` callbacks that manage the input changes and form submissions. These are handy for common use cases, but you can also use uncontrolled APIs for more advanced scenarios such as form validation or customized components.
106
+
107
+ The following example demonstrates how to use more granular APIs like `setInput` with your custom input and submit button components:
108
+
109
+ ```tsx
110
+ const { input, setInput } = useCompletion();
111
+
112
+ return (
113
+ <>
114
+ <MyCustomInput value={input} onChange={value => setInput(value)} />
115
+ </>
116
+ );
117
+ ```
118
+
119
+ ### Cancelation
120
+
121
+ It's also a common use case to abort the response message while it's still streaming back from the AI provider. You can do this by calling the `stop` function returned by the `useCompletion` hook.
122
+
123
+ ```tsx
124
+ const { stop, isLoading, ... } = useCompletion()
125
+
126
+ return (
127
+ <>
128
+ <button onClick={stop} disabled={!isLoading}>Stop</button>
129
+ </>
130
+ )
131
+ ```
132
+
133
+ When the user clicks the "Stop" button, the fetch request will be aborted. This avoids consuming unnecessary resources and improves the UX of your application.
134
+
135
+ ### Throttling UI Updates
136
+
137
+ <Note>This feature is currently only available for React.</Note>
138
+
139
+ By default, the `useCompletion` hook will trigger a render every time a new chunk is received.
140
+ You can throttle the UI updates with the `experimental_throttle` option.
141
+
142
+ ```tsx filename="page.tsx" highlight="2-3"
143
+ const { completion, ... } = useCompletion({
144
+ // Throttle the completion and data updates to 50ms:
145
+ experimental_throttle: 50
146
+ })
147
+ ```
148
+
149
+ ## Event Callbacks
150
+
151
+ `useCompletion` also provides optional event callbacks that you can use to handle different stages of the chatbot lifecycle. These callbacks can be used to trigger additional actions, such as logging, analytics, or custom UI updates.
152
+
153
+ ```tsx
154
+ const { ... } = useCompletion({
155
+ onResponse: (response: Response) => {
156
+ console.log('Received response from server:', response)
157
+ },
158
+ onFinish: (prompt: string, completion: string) => {
159
+ console.log('Finished streaming completion:', completion)
160
+ },
161
+ onError: (error: Error) => {
162
+ console.error('An error occurred:', error)
163
+ },
164
+ })
165
+ ```
166
+
167
+ It's worth noting that you can abort the processing by throwing an error in the `onResponse` callback. This will trigger the `onError` callback and stop the message from being appended to the chat UI. This can be useful for handling unexpected responses from the AI provider.
168
+
169
+ ## Configure Request Options
170
+
171
+ By default, the `useCompletion` hook sends a HTTP POST request to the `/api/completion` endpoint with the prompt as part of the request body. You can customize the request by passing additional options to the `useCompletion` hook:
172
+
173
+ ```tsx
174
+ const { messages, input, handleInputChange, handleSubmit } = useCompletion({
175
+ api: '/api/custom-completion',
176
+ headers: {
177
+ Authorization: 'your_token',
178
+ },
179
+ body: {
180
+ user_id: '123',
181
+ },
182
+ credentials: 'same-origin',
183
+ });
184
+ ```
185
+
186
+ In this example, the `useCompletion` hook sends a POST request to the `/api/completion` endpoint with the specified headers, additional body fields, and credentials for that fetch request. On your server side, you can handle the request with these additional information.