diff --git a/.changeset/tidy-badgers-return.md b/.changeset/tidy-badgers-return.md
new file mode 100644
index 000000000000..cc46694c550e
--- /dev/null
+++ b/.changeset/tidy-badgers-return.md
@@ -0,0 +1,5 @@
+---
+'@ai-sdk/solid': patch
+---
+
+feat (ui/solid): add support for prepareRequestBody
diff --git a/content/cookbook/01-next/80-send-custom-body-from-use-chat.mdx b/content/cookbook/01-next/80-send-custom-body-from-use-chat.mdx
index 7462c1543212..f65262252dfd 100644
--- a/content/cookbook/01-next/80-send-custom-body-from-use-chat.mdx
+++ b/content/cookbook/01-next/80-send-custom-body-from-use-chat.mdx
@@ -8,7 +8,7 @@ tags: ['next', 'chat']
`experimental_prepareRequestBody` is an experimental feature and only
- available in React.
+ available in React and Solid.
By default, `useChat` sends all messages as well as information from the request to the server.
diff --git a/content/docs/07-reference/02-ai-sdk-ui/01-use-chat.mdx b/content/docs/07-reference/02-ai-sdk-ui/01-use-chat.mdx
index 2aba6cdd7e46..8e03e3f59b98 100644
--- a/content/docs/07-reference/02-ai-sdk-ui/01-use-chat.mdx
+++ b/content/docs/07-reference/02-ai-sdk-ui/01-use-chat.mdx
@@ -189,10 +189,10 @@ Allows you to easily create a conversational user interface for your chatbot app
},
{
name: 'experimental_prepareRequestBody',
- type: '(options: { messages: Message[]; requestData?: JSONValue; requestBody?: object, id: string }) => unknown',
+ type: '(options: { messages: UIMessage[]; requestData?: JSONValue; requestBody?: object, id: string }) => unknown',
isOptional: true,
description:
- 'Experimental (React only). When a function is provided, it will be used to prepare the request body for the chat API. This can be useful for customizing the request body based on the messages and data in the chat.',
+ 'Experimental (React & Solid only). When a function is provided, it will be used to prepare the request body for the chat API. This can be useful for customizing the request body based on the messages and data in the chat.',
},
{
name: 'experimental_throttle',
diff --git a/examples/solidstart-openai/src/routes/api/use-chat-request/index.ts b/examples/solidstart-openai/src/routes/api/use-chat-request/index.ts
new file mode 100644
index 000000000000..4847f9755bbd
--- /dev/null
+++ b/examples/solidstart-openai/src/routes/api/use-chat-request/index.ts
@@ -0,0 +1,24 @@
+import { openai } from '@ai-sdk/openai';
+import { streamText, Message } from 'ai';
+import { APIEvent } from '@solidjs/start/server';
+
+export const POST = async (event: APIEvent) => {
+ // Extract the `messages` from the body of the request
+ const { message } = await event.request.json();
+
+ // Implement your own logic here to add message history
+ const previousMessages: Message[] = [];
+ const messages = [...previousMessages, message];
+
+ // Call the language model
+ const result = streamText({
+ model: openai('gpt-4o-mini'),
+ messages,
+ async onFinish({ text, toolCalls, toolResults, usage, finishReason }) {
+ // Implement your own logic here, e.g. for storing messages
+ },
+ });
+
+ // Respond with the stream
+ return result.toDataStreamResponse();
+};
diff --git a/examples/solidstart-openai/src/routes/use-chat-request/index.tsx b/examples/solidstart-openai/src/routes/use-chat-request/index.tsx
new file mode 100644
index 000000000000..ec5225a09d95
--- /dev/null
+++ b/examples/solidstart-openai/src/routes/use-chat-request/index.tsx
@@ -0,0 +1,78 @@
+/* eslint-disable @next/next/no-img-element */
+import { For } from 'solid-js';
+import { useChat } from '@ai-sdk/solid';
+import { createIdGenerator } from 'ai';
+
+export default function Chat() {
+ const {
+ input,
+ messages,
+ handleInputChange,
+ handleSubmit,
+ isLoading,
+ error,
+ stop,
+ reload,
+ } = useChat({
+ api: '/api/use-chat-request',
+ sendExtraMessageFields: true,
+ generateId: createIdGenerator({ prefix: 'msgc', size: 16 }),
+
+ experimental_prepareRequestBody({ messages }) {
+ return {
+ message: messages[messages.length - 1],
+ };
+ },
+ });
+
+ return (
+