2025-01-23 01:19:48 +05:30
import { generateUUID } from '@/lib/utils' ;
import {
DataStreamWriter ,
experimental_generateImage ,
2025-01-23 01:53:41 +05:30
smoothStream ,
2025-01-23 01:19:48 +05:30
streamObject ,
streamText ,
tool ,
} from 'ai' ;
import { z } from 'zod' ;
2025-02-03 13:33:48 +05:30
import { codePrompt , sheetPrompt } from '../prompts' ;
2025-01-23 01:19:48 +05:30
import { saveDocument } from '@/lib/db/queries' ;
import { Session } from 'next-auth' ;
2025-02-03 20:33:15 +05:30
import { myProvider } from '../models' ;
2025-01-23 01:19:48 +05:30
interface CreateDocumentProps {
session : Session ;
dataStream : DataStreamWriter ;
}
2025-02-03 20:33:15 +05:30
export const createDocument = ( { session , dataStream } : CreateDocumentProps ) = >
2025-01-23 01:19:48 +05:30
tool ( {
description :
2025-02-03 13:33:48 +05:30
'Create a document for a writing or content creation activities. This tool will call other functions that will generate the contents of the document based on the title and kind.' ,
2025-01-23 01:19:48 +05:30
parameters : z.object ( {
title : z.string ( ) ,
2025-02-03 13:33:48 +05:30
kind : z.enum ( [ 'text' , 'code' , 'image' , 'sheet' ] ) ,
2025-01-23 01:19:48 +05:30
} ) ,
execute : async ( { title , kind } ) = > {
const id = generateUUID ( ) ;
let draftText = '' ;
dataStream . writeData ( {
type : 'id' ,
content : id ,
} ) ;
dataStream . writeData ( {
type : 'title' ,
content : title ,
} ) ;
dataStream . writeData ( {
type : 'kind' ,
content : kind ,
} ) ;
dataStream . writeData ( {
type : 'clear' ,
content : '' ,
} ) ;
if ( kind === 'text' ) {
const { fullStream } = streamText ( {
2025-02-03 20:33:15 +05:30
model : myProvider.languageModel ( 'block-model' ) ,
2025-01-23 01:19:48 +05:30
system :
'Write about the given topic. Markdown is supported. Use headings wherever appropriate.' ,
2025-01-23 01:53:41 +05:30
experimental_transform : smoothStream ( { chunking : 'word' } ) ,
2025-01-23 01:19:48 +05:30
prompt : title ,
} ) ;
for await ( const delta of fullStream ) {
const { type } = delta ;
if ( type === 'text-delta' ) {
const { textDelta } = delta ;
draftText += textDelta ;
dataStream . writeData ( {
type : 'text-delta' ,
content : textDelta ,
} ) ;
}
}
dataStream . writeData ( { type : 'finish' , content : '' } ) ;
} else if ( kind === 'code' ) {
const { fullStream } = streamObject ( {
2025-02-03 20:33:15 +05:30
model : myProvider.languageModel ( 'block-model' ) ,
2025-01-23 01:19:48 +05:30
system : codePrompt ,
prompt : title ,
schema : z.object ( {
code : z.string ( ) ,
} ) ,
} ) ;
for await ( const delta of fullStream ) {
const { type } = delta ;
if ( type === 'object' ) {
const { object } = delta ;
const { code } = object ;
if ( code ) {
dataStream . writeData ( {
type : 'code-delta' ,
content : code ? ? '' ,
} ) ;
draftText = code ;
}
}
}
dataStream . writeData ( { type : 'finish' , content : '' } ) ;
} else if ( kind === 'image' ) {
const { image } = await experimental_generateImage ( {
2025-02-03 20:33:15 +05:30
model : myProvider.imageModel ( 'small-model' ) ,
2025-01-23 01:19:48 +05:30
prompt : title ,
n : 1 ,
} ) ;
draftText = image . base64 ;
dataStream . writeData ( {
type : 'image-delta' ,
content : image.base64 ,
} ) ;
2025-02-03 13:33:48 +05:30
dataStream . writeData ( { type : 'finish' , content : '' } ) ;
} else if ( kind === 'sheet' ) {
const { fullStream } = streamObject ( {
2025-02-03 20:33:15 +05:30
model : myProvider.languageModel ( 'block-model' ) ,
2025-02-03 13:33:48 +05:30
system : sheetPrompt ,
prompt : title ,
schema : z.object ( {
csv : z.string ( ) . describe ( 'CSV data' ) ,
} ) ,
} ) ;
for await ( const delta of fullStream ) {
const { type } = delta ;
if ( type === 'object' ) {
const { object } = delta ;
const { csv } = object ;
if ( csv ) {
dataStream . writeData ( {
type : 'sheet-delta' ,
content : csv ,
} ) ;
draftText = csv ;
}
}
}
dataStream . writeData ( {
type : 'sheet-delta' ,
content : draftText ,
} ) ;
2025-01-23 01:19:48 +05:30
dataStream . writeData ( { type : 'finish' , content : '' } ) ;
}
if ( session . user ? . id ) {
await saveDocument ( {
id ,
title ,
kind ,
content : draftText ,
userId : session.user.id ,
} ) ;
}
return {
id ,
title ,
kind ,
content : 'A document was created and is now visible to the user.' ,
} ;
} ,
} ) ;