import { generateUUID } from '@/lib/utils'; import { tool, type UIMessageStreamWriter } from 'ai'; import { z } from 'zod'; import type { Session } from 'next-auth'; import { artifactKinds, documentHandlersByArtifactKind, } from '@/lib/artifacts/server'; import type { ChatMessage } from '@/lib/types'; interface CreateDocumentProps { session: Session; dataStream: UIMessageStreamWriter; } export const createDocument = ({ session, dataStream }: CreateDocumentProps) => tool({ description: '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.', inputSchema: z.object({ title: z.string(), kind: z.enum(artifactKinds), }), execute: async ({ title, kind }) => { const id = generateUUID(); dataStream.write({ type: 'data-kind', data: kind, transient: true, }); dataStream.write({ type: 'data-id', data: id, transient: true, }); dataStream.write({ type: 'data-title', data: title, transient: true, }); dataStream.write({ type: 'data-clear', data: null, transient: true, }); const documentHandler = documentHandlersByArtifactKind.find( (documentHandlerByArtifactKind) => documentHandlerByArtifactKind.kind === kind, ); if (!documentHandler) { throw new Error(`No document handler found for kind: ${kind}`); } await documentHandler.onCreateDocument({ id, title, dataStream, session, }); dataStream.write({ type: 'data-finish', data: null, transient: true }); return { id, title, kind, content: 'A document was created and is now visible to the user.', }; }, });