| import { smoothStream, streamText } from 'ai'; | |
| import { myProvider } from '@/lib/ai/providers'; | |
| import { createDocumentHandler } from '@/lib/artifacts/server'; | |
| import { updateDocumentPrompt } from '@/lib/ai/prompts'; | |
| export const textDocumentHandler = createDocumentHandler<'text'>({ | |
| kind: 'text', | |
| onCreateDocument: async ({ title, dataStream }) => { | |
| let draftContent = ''; | |
| const { fullStream } = streamText({ | |
| model: myProvider.languageModel('artifact-model'), | |
| system: | |
| 'Write about the given topic. Markdown is supported. Use headings wherever appropriate.', | |
| experimental_transform: smoothStream({ chunking: 'word' }), | |
| prompt: title, | |
| }); | |
| for await (const delta of fullStream) { | |
| const { type } = delta; | |
| if (type === 'text-delta') { | |
| const { text } = delta; | |
| draftContent += text; | |
| dataStream.write({ | |
| type: 'data-textDelta', | |
| data: text, | |
| transient: true, | |
| }); | |
| } | |
| } | |
| return draftContent; | |
| }, | |
| onUpdateDocument: async ({ document, description, dataStream }) => { | |
| let draftContent = ''; | |
| const { fullStream } = streamText({ | |
| model: myProvider.languageModel('artifact-model'), | |
| system: updateDocumentPrompt(document.content, 'text'), | |
| experimental_transform: smoothStream({ chunking: 'word' }), | |
| prompt: description, | |
| providerOptions: { | |
| openai: { | |
| prediction: { | |
| type: 'content', | |
| content: document.content, | |
| }, | |
| }, | |
| }, | |
| }); | |
| for await (const delta of fullStream) { | |
| const { type } = delta; | |
| if (type === 'text-delta') { | |
| const { text } = delta; | |
| draftContent += text; | |
| dataStream.write({ | |
| type: 'data-textDelta', | |
| data: text, | |
| transient: true, | |
| }); | |
| } | |
| } | |
| return draftContent; | |
| }, | |
| }); | |