84 lines
2.0 KiB
TypeScript
84 lines
2.0 KiB
TypeScript
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;
|
|
}
|
|
}
|