Create expense from receipt (#69)

* Create expense from receipt

* Add modal

* Update README
This commit is contained in:
Sebastien Castiel
2024-01-30 16:36:29 -05:00
committed by GitHub
parent 9e300e0ff0
commit 4a9bf575bd
10 changed files with 657 additions and 518 deletions

View File

@@ -0,0 +1,48 @@
'use server'
import { getCategories } from '@/lib/api'
import { env } from '@/lib/env'
import OpenAI from 'openai'
const openai = new OpenAI({ apiKey: env.OPENAI_API_KEY })
export async function extractExpenseInformationFromImage(imageUrl: string) {
'use server'
const categories = await getCategories()
const body = {
model: 'gpt-4-vision-preview',
messages: [
{
role: 'user',
content: [
{
type: 'text',
text: `
This image contains a receipt.
Read the total amount and store it as a non-formatted number without any other text or currency.
Then guess the category for this receipt amoung the following categories and store its ID: ${categories.map(
({ id, grouping, name }) => `"${grouping}/${name}" (ID: ${id})`,
)}.
Guess the expenses date and store it as yyyy-mm-dd.
Guess a title for the expense.
Return the amount, the category, the date and the title with just a comma between them, without anything else.`,
},
],
},
{
role: 'user',
content: [{ type: 'image_url', image_url: { url: imageUrl } }],
},
],
}
const completion = await openai.chat.completions.create(body as any)
const [amountString, categoryId, date, title] = completion.choices
.at(0)
?.message.content?.split(',') ?? [null, null, null, null]
return { amount: Number(amountString), categoryId, date, title }
}
export type ReceiptExtractedInfo = Awaited<
ReturnType<typeof extractExpenseInformationFromImage>
>