From a7c54ca61c1f1ad038b509447fb064ad955caff9 Mon Sep 17 00:00:00 2001 From: megaproxy Date: Wed, 22 Apr 2026 20:36:43 +0000 Subject: [PATCH] Add raw AI response to parse result for debugging - Backend returns raw AI text alongside parsed fields - Drawer shows expandable "Raw AI response" section when result has empty fields - Scan Receipt shows raw response inline if no fields were extracted - Helps diagnose model output issues without needing server logs Co-Authored-By: Claude Sonnet 4.6 --- backend/app/api/v1/transactions.py | 1 + frontend/src/api/settings.ts | 1 + .../src/pages/transactions/TransactionDetailDrawer.tsx | 9 +++++++++ frontend/src/pages/transactions/TransactionList.tsx | 9 +++++++-- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/backend/app/api/v1/transactions.py b/backend/app/api/v1/transactions.py index 1fc2e5d..1de9ada 100644 --- a/backend/app/api/v1/transactions.py +++ b/backend/app/api/v1/transactions.py @@ -363,6 +363,7 @@ async def _call_ai_parse(file_bytes: bytes, mime_type: str, user_row) -> dict: "date": parsed.get("date"), "description": parsed.get("description"), "category": parsed.get("category"), + "raw": text, } diff --git a/frontend/src/api/settings.ts b/frontend/src/api/settings.ts index 4ab3c35..1c23fd1 100644 --- a/frontend/src/api/settings.ts +++ b/frontend/src/api/settings.ts @@ -21,6 +21,7 @@ export interface ParsedReceipt { date: string | null; description: string | null; category: string | null; + raw: string | null; } export async function getAiSettings(): Promise { diff --git a/frontend/src/pages/transactions/TransactionDetailDrawer.tsx b/frontend/src/pages/transactions/TransactionDetailDrawer.tsx index 01f1909..01e7f75 100644 --- a/frontend/src/pages/transactions/TransactionDetailDrawer.tsx +++ b/frontend/src/pages/transactions/TransactionDetailDrawer.tsx @@ -260,7 +260,16 @@ export default function TransactionDetailDrawer({ transaction, accountName, cate {parseResult.data.date &&
Date{parseResult.data.date}
} {parseResult.data.description &&
Description{parseResult.data.description}
} {parseResult.data.category &&
Category hint{parseResult.data.category}
} + {!parseResult.data.merchant && !parseResult.data.amount && !parseResult.data.description && ( +
No fields detected.
+ )} + {parseResult.data.raw && ( +
+ Raw AI response +
{parseResult.data.raw}
+
+ )}