import { PurchaseList, purchaseListSchema } from './types'; import { Tool } from './tool'; import { BaseTool, makeRequest } from '../anthropicClient'; import { generatePrompt } from './prompt'; import { Consumer } from '../consumer/types'; import prisma from '../../prisma/prisma'; export async function generate( id: number | undefined, editedConsumer: Consumer, date: Date ) { const consumerPrompt = await generatePrompt( editedConsumer, parseInt(process.env.PURCHASE_REFLECTION_THRESHOLD ?? '50'), date, parseInt(process.env.NUMBER_OF_WEEKS ?? '4') ); const consumer = id ? await prisma.consumer.update({ where: { id }, data: { editedValue: editedConsumer } }) : await prisma.consumer.create({ data: { editedValue: editedConsumer } }); const newPurchaseList = await prisma.purchaseList.create({ data: { consumerId: consumer.id } }); console.info( `Generating purchase list with id ${newPurchaseList.id} for consumer with id ${consumer.id}` ); try { const result = (await makeRequest( consumerPrompt, Tool as BaseTool )) as PurchaseList; const validPurchases = purchaseListSchema.safeParse(result); if (validPurchases.error) { throw Error(`Invalid purchases: ${validPurchases.error.message}`); } const totalPurchases = validPurchases.data.weeks.reduce( (acc, week) => acc + week.purchases.length, 0 ); console.info( `Generated ${totalPurchases} purchases for purchase list with id ${newPurchaseList.id} for consumer wth id ${id}` ); await prisma.purchaseList.update({ where: { id: newPurchaseList.id }, data: { value: validPurchases.data } }); console.info( `Purchase list with id ${newPurchaseList.id} for consumer with id ${id} stored in database.` ); return validPurchases.data; } catch (error) { console.error('Error generating purchases:', error); throw error; } }