feat: add smooth stream (#722)

This commit is contained in:
Jeremy 2025-01-23 01:53:41 +05:30 committed by GitHub
parent 3f9d379a6a
commit 5e8cddc886
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 52 additions and 20 deletions

View file

@ -2,6 +2,7 @@ import {
type Message, type Message,
convertToCoreMessages, convertToCoreMessages,
createDataStreamResponse, createDataStreamResponse,
smoothStream,
streamText, streamText,
} from 'ai'; } from 'ai';
@ -99,6 +100,7 @@ export async function POST(request: Request) {
messages: coreMessages, messages: coreMessages,
maxSteps: 5, maxSteps: 5,
experimental_activeTools: allTools, experimental_activeTools: allTools,
experimental_transform: smoothStream({ chunking: 'word' }),
tools: { tools: {
getWeather, getWeather,
createDocument: createDocument({ session, dataStream, model }), createDocument: createDocument({ session, dataStream, model }),

View file

@ -2,6 +2,7 @@ import { generateUUID } from '@/lib/utils';
import { import {
DataStreamWriter, DataStreamWriter,
experimental_generateImage, experimental_generateImage,
smoothStream,
streamObject, streamObject,
streamText, streamText,
tool, tool,
@ -60,6 +61,7 @@ export const createDocument = ({
model: customModel(model.apiIdentifier), model: customModel(model.apiIdentifier),
system: system:
'Write about the given topic. Markdown is supported. Use headings wherever appropriate.', 'Write about the given topic. Markdown is supported. Use headings wherever appropriate.',
experimental_transform: smoothStream({ chunking: 'word' }),
prompt: title, prompt: title,
}); });

View file

@ -1,6 +1,7 @@
import { import {
DataStreamWriter, DataStreamWriter,
experimental_generateImage, experimental_generateImage,
smoothStream,
streamObject, streamObject,
streamText, streamText,
tool, tool,
@ -52,6 +53,7 @@ export const updateDocument = ({
const { fullStream } = streamText({ const { fullStream } = streamText({
model: customModel(model.apiIdentifier), model: customModel(model.apiIdentifier),
system: updateDocumentPrompt(currentContent, 'text'), system: updateDocumentPrompt(currentContent, 'text'),
experimental_transform: smoothStream({ chunking: 'word' }),
prompt: description, prompt: description,
experimental_providerMetadata: { experimental_providerMetadata: {
openai: { openai: {

View file

@ -37,7 +37,7 @@
"@vercel/analytics": "^1.3.1", "@vercel/analytics": "^1.3.1",
"@vercel/blob": "^0.24.1", "@vercel/blob": "^0.24.1",
"@vercel/postgres": "^0.10.0", "@vercel/postgres": "^0.10.0",
"ai": "4.0.36", "ai": "4.1.1",
"bcrypt-ts": "^5.0.2", "bcrypt-ts": "^5.0.2",
"class-variance-authority": "^0.7.0", "class-variance-authority": "^0.7.0",
"classnames": "^2.5.1", "classnames": "^2.5.1",

64
pnpm-lock.yaml generated
View file

@ -66,8 +66,8 @@ importers:
specifier: ^0.10.0 specifier: ^0.10.0
version: 0.10.0 version: 0.10.0
ai: ai:
specifier: 4.0.36 specifier: 4.1.1
version: 4.0.36(react@19.0.0-rc-45804af1-20241021)(zod@3.23.8) version: 4.1.1(react@19.0.0-rc-45804af1-20241021)(zod@3.23.8)
bcrypt-ts: bcrypt-ts:
specifier: ^5.0.2 specifier: ^5.0.2
version: 5.0.2 version: 5.0.2
@ -255,12 +255,25 @@ packages:
zod: zod:
optional: true optional: true
'@ai-sdk/provider-utils@2.1.1':
resolution: {integrity: sha512-+FRXSAdzPJFJN6TpyvyGWLo7WJuoBKI1g66UL+sli1HrxlldXSwxRPeb8tMMmNcyi3VKQogg2VsoJjlt4ort5w==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.0.0
peerDependenciesMeta:
zod:
optional: true
'@ai-sdk/provider@1.0.4': '@ai-sdk/provider@1.0.4':
resolution: {integrity: sha512-lJi5zwDosvvZER3e/pB8lj1MN3o3S7zJliQq56BRr4e9V3fcRyFtwP0JRxaRS5vHYX3OJ154VezVoQNrk0eaKw==} resolution: {integrity: sha512-lJi5zwDosvvZER3e/pB8lj1MN3o3S7zJliQq56BRr4e9V3fcRyFtwP0JRxaRS5vHYX3OJ154VezVoQNrk0eaKw==}
engines: {node: '>=18'} engines: {node: '>=18'}
'@ai-sdk/react@1.0.11': '@ai-sdk/provider@1.0.5':
resolution: {integrity: sha512-ndBPA7dx2DqUr7s4zO1cRAPkFGS+wWvSri6OWfCuhfyTAADQ4vdd56vFP9zdTZl4cyL27Vh0hKLfFJMGx83MUQ==} resolution: {integrity: sha512-KATFp9CNXtMEzs8KBwLYK2+rGkkeED6p1+4koQveszyscIavObXIRW7vjr0MoZ9HFIHOUlrcak+3s/Xt3UXmAg==}
engines: {node: '>=18'}
'@ai-sdk/react@1.1.1':
resolution: {integrity: sha512-7LX/YF8sis8UM7p8ftUcu0xySG86/TBddcB42w/+mWOXL6hjYzcuGD8G121TobHsnxVxbsBlF/ykps/GYVvLNg==}
engines: {node: '>=18'} engines: {node: '>=18'}
peerDependencies: peerDependencies:
react: ^18 || ^19 || ^19.0.0-rc react: ^18 || ^19 || ^19.0.0-rc
@ -271,8 +284,8 @@ packages:
zod: zod:
optional: true optional: true
'@ai-sdk/ui-utils@1.0.10': '@ai-sdk/ui-utils@1.1.1':
resolution: {integrity: sha512-wZfZNH2IloTx5b1O8CU7/R/icm8EsmURElPckYwNYj2YZrKk9X5XeYSDBF/1/J83obzsn0i7VKkIf40qhRzVVA==} resolution: {integrity: sha512-lkTxGoebnEgs8HtKeWut0AglXN7zpWQwYmun4yuhpiup7DxPWTmt3vGiYvqQTBOFAmyoea3uzIKjHwRHuayr2w==}
engines: {node: '>=18'} engines: {node: '>=18'}
peerDependencies: peerDependencies:
zod: ^3.0.0 zod: ^3.0.0
@ -1613,8 +1626,8 @@ packages:
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
hasBin: true hasBin: true
ai@4.0.36: ai@4.1.1:
resolution: {integrity: sha512-KeXQe+eKQK57WYzN+K6VUBZqj/n70V+cCwrXAhXa7enbZCAsErvQKqrnxkF1qm9UfPuNKNEFV5BRoMKJ5gRfAw==} resolution: {integrity: sha512-oZTzQfrvrXuXnAJhoCsGcLUxSMWWYKkqrk2LfCzcukvB8us7ZUnFBgs9drhXuFP3JkWVbeIZHXjDexZIZcbi8g==}
engines: {node: '>=18'} engines: {node: '>=18'}
peerDependencies: peerDependencies:
react: ^18 || ^19 || ^19.0.0-rc react: ^18 || ^19 || ^19.0.0-rc
@ -3753,24 +3766,37 @@ snapshots:
optionalDependencies: optionalDependencies:
zod: 3.23.8 zod: 3.23.8
'@ai-sdk/provider-utils@2.1.1(zod@3.23.8)':
dependencies:
'@ai-sdk/provider': 1.0.5
eventsource-parser: 3.0.0
nanoid: 3.3.8
secure-json-parse: 2.7.0
optionalDependencies:
zod: 3.23.8
'@ai-sdk/provider@1.0.4': '@ai-sdk/provider@1.0.4':
dependencies: dependencies:
json-schema: 0.4.0 json-schema: 0.4.0
'@ai-sdk/react@1.0.11(react@19.0.0-rc-45804af1-20241021)(zod@3.23.8)': '@ai-sdk/provider@1.0.5':
dependencies: dependencies:
'@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) json-schema: 0.4.0
'@ai-sdk/ui-utils': 1.0.10(zod@3.23.8)
'@ai-sdk/react@1.1.1(react@19.0.0-rc-45804af1-20241021)(zod@3.23.8)':
dependencies:
'@ai-sdk/provider-utils': 2.1.1(zod@3.23.8)
'@ai-sdk/ui-utils': 1.1.1(zod@3.23.8)
swr: 2.2.5(react@19.0.0-rc-45804af1-20241021) swr: 2.2.5(react@19.0.0-rc-45804af1-20241021)
throttleit: 2.1.0 throttleit: 2.1.0
optionalDependencies: optionalDependencies:
react: 19.0.0-rc-45804af1-20241021 react: 19.0.0-rc-45804af1-20241021
zod: 3.23.8 zod: 3.23.8
'@ai-sdk/ui-utils@1.0.10(zod@3.23.8)': '@ai-sdk/ui-utils@1.1.1(zod@3.23.8)':
dependencies: dependencies:
'@ai-sdk/provider': 1.0.4 '@ai-sdk/provider': 1.0.5
'@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) '@ai-sdk/provider-utils': 2.1.1(zod@3.23.8)
zod-to-json-schema: 3.24.1(zod@3.23.8) zod-to-json-schema: 3.24.1(zod@3.23.8)
optionalDependencies: optionalDependencies:
zod: 3.23.8 zod: 3.23.8
@ -4870,12 +4896,12 @@ snapshots:
acorn@8.14.0: {} acorn@8.14.0: {}
ai@4.0.36(react@19.0.0-rc-45804af1-20241021)(zod@3.23.8): ai@4.1.1(react@19.0.0-rc-45804af1-20241021)(zod@3.23.8):
dependencies: dependencies:
'@ai-sdk/provider': 1.0.4 '@ai-sdk/provider': 1.0.5
'@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) '@ai-sdk/provider-utils': 2.1.1(zod@3.23.8)
'@ai-sdk/react': 1.0.11(react@19.0.0-rc-45804af1-20241021)(zod@3.23.8) '@ai-sdk/react': 1.1.1(react@19.0.0-rc-45804af1-20241021)(zod@3.23.8)
'@ai-sdk/ui-utils': 1.0.10(zod@3.23.8) '@ai-sdk/ui-utils': 1.1.1(zod@3.23.8)
'@opentelemetry/api': 1.9.0 '@opentelemetry/api': 1.9.0
jsondiffpatch: 0.6.0 jsondiffpatch: 0.6.0
optionalDependencies: optionalDependencies: