You can use the toDataStream method to get a data stream from the result and then pipe it to the response.
index.ts
import { streamText } from 'ai';import Fastify from 'fastify';const fastify = Fastify({ logger: true });fastify.post('/', async function (request, reply) { const result = streamText({ model: 'openai/gpt-4o', prompt: 'Invent a new holiday and describe its traditions.', }); // Mark the response as a v1 data stream: reply.header('X-Vercel-AI-Data-Stream', 'v1'); reply.header('Content-Type', 'text/plain; charset=utf-8'); return reply.send(result.toDataStream({ data }));});fastify.listen({ port: 8080 });
createDataStream can be used to send custom data to the client.
index.ts
import { createDataStream, streamText } from 'ai';import Fastify from 'fastify';const fastify = Fastify({ logger: true });fastify.post('/stream-data', async function (request, reply) { // immediately start streaming the response const dataStream = createDataStream({ execute: async dataStreamWriter => { dataStreamWriter.writeData('initialized call'); const result = streamText({ model: 'openai/gpt-4o', prompt: 'Invent a new holiday and describe its traditions.', }); result.mergeIntoDataStream(dataStreamWriter); }, onError: error => { // Error messages are masked by default for security reasons. // If you want to expose the error message to the client, you can do so here: return error instanceof Error ? error.message : String(error); }, }); // Mark the response as a v1 data stream: reply.header('X-Vercel-AI-Data-Stream', 'v1'); reply.header('Content-Type', 'text/plain; charset=utf-8'); return reply.send(dataStream);});fastify.listen({ port: 8080 });