| 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<ChatMessage>; |
| } |
|
|
| 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.', |
| }; |
| }, |
| }); |
|
|