diff --git a/transaction_parser/parser_benchmark/doctype/parser_benchmark_dataset/parser_benchmark_dataset.json b/transaction_parser/parser_benchmark/doctype/parser_benchmark_dataset/parser_benchmark_dataset.json index 778e370..2a2914b 100644 --- a/transaction_parser/parser_benchmark/doctype/parser_benchmark_dataset/parser_benchmark_dataset.json +++ b/transaction_parser/parser_benchmark/doctype/parser_benchmark_dataset/parser_benchmark_dataset.json @@ -31,6 +31,8 @@ "column_break_zgpf", "google_gemini_flash_25", "google_gemini_pro_25", + "column_break_clde", + "claude_haiku_45", "pdf_processor_section", "pdftotext", "ocrmypdf", @@ -183,6 +185,17 @@ "fieldtype": "Check", "label": "Google Gemini Flash-2.5" }, + { + "fieldname": "column_break_clde", + "fieldtype": "Column Break" + }, + { + "allow_on_submit": 1, + "default": "0", + "fieldname": "claude_haiku_45", + "fieldtype": "Check", + "label": "Claude Haiku-4.5" + }, { "fieldname": "pdf_processor_section", "fieldtype": "Section Break", @@ -301,7 +314,7 @@ "link_fieldname": "dataset" } ], - "modified": "2026-04-13 09:37:12.298195", + "modified": "2026-04-15 12:00:20.190290", "modified_by": "Administrator", "module": "Parser Benchmark", "name": "Parser Benchmark Dataset", @@ -326,4 +339,4 @@ "sort_field": "modified", "sort_order": "DESC", "states": [] -} +} \ No newline at end of file diff --git a/transaction_parser/parser_benchmark/doctype/parser_benchmark_dataset/parser_benchmark_dataset.py b/transaction_parser/parser_benchmark/doctype/parser_benchmark_dataset/parser_benchmark_dataset.py index 55fba2a..4e5aad9 100644 --- a/transaction_parser/parser_benchmark/doctype/parser_benchmark_dataset/parser_benchmark_dataset.py +++ b/transaction_parser/parser_benchmark/doctype/parser_benchmark_dataset/parser_benchmark_dataset.py @@ -15,6 +15,7 @@ "openai_gpt_5_mini": "OpenAI gpt-5-mini", "google_gemini_pro_25": "Google Gemini Pro-2.5", "google_gemini_flash_25": "Google Gemini Flash-2.5", + "claude_haiku_45": "Claude Haiku-4.5", } PDF_PROCESSOR_FIELD_MAP = { @@ -43,6 +44,7 @@ class ParserBenchmarkDataset(Document): ) amended_from: DF.Link | None + claude_haiku_45: DF.Check company: DF.Link | None country: DF.Literal["India", "Other"] deepseek_chat: DF.Check diff --git a/transaction_parser/parser_benchmark/doctype/parser_benchmark_log/parser_benchmark_log.json b/transaction_parser/parser_benchmark/doctype/parser_benchmark_log/parser_benchmark_log.json index 05681e6..4eda80f 100644 --- a/transaction_parser/parser_benchmark/doctype/parser_benchmark_log/parser_benchmark_log.json +++ b/transaction_parser/parser_benchmark/doctype/parser_benchmark_log/parser_benchmark_log.json @@ -102,7 +102,7 @@ "fieldtype": "Select", "in_list_view": 1, "label": "AI Model", - "options": "DeepSeek Chat\nDeepSeek Reasoner\nOpenAI gpt-4o\nOpenAI gpt-4o-mini\nOpenAI gpt-5\nOpenAI gpt-5-mini\nGoogle Gemini Pro-2.5\nGoogle Gemini Flash-2.5", + "options": "DeepSeek Chat\nDeepSeek Reasoner\nOpenAI gpt-4o\nOpenAI gpt-4o-mini\nOpenAI gpt-5\nOpenAI gpt-5-mini\nGoogle Gemini Pro-2.5\nGoogle Gemini Flash-2.5\nClaude Haiku-4.5", "read_only": 1 }, { @@ -423,7 +423,7 @@ "in_create": 1, "index_web_pages_for_search": 1, "links": [], - "modified": "2026-04-13 09:38:44.604789", + "modified": "2026-04-15 12:00:33.722723", "modified_by": "Administrator", "module": "Parser Benchmark", "name": "Parser Benchmark Log", diff --git a/transaction_parser/parser_benchmark/doctype/parser_benchmark_log/parser_benchmark_log.py b/transaction_parser/parser_benchmark/doctype/parser_benchmark_log/parser_benchmark_log.py index a244130..2053285 100644 --- a/transaction_parser/parser_benchmark/doctype/parser_benchmark_log/parser_benchmark_log.py +++ b/transaction_parser/parser_benchmark/doctype/parser_benchmark_log/parser_benchmark_log.py @@ -28,6 +28,7 @@ class ParserBenchmarkLog(Document): "OpenAI gpt-5-mini", "Google Gemini Pro-2.5", "Google Gemini Flash-2.5", + "Claude Haiku-4.5", ] ai_parse_time: DF.Float ai_response: DF.Code | None diff --git a/transaction_parser/parser_benchmark/doctype/parser_benchmark_token_cost/parser_benchmark_token_cost.json b/transaction_parser/parser_benchmark/doctype/parser_benchmark_token_cost/parser_benchmark_token_cost.json index ce0da61..5b1b51e 100644 --- a/transaction_parser/parser_benchmark/doctype/parser_benchmark_token_cost/parser_benchmark_token_cost.json +++ b/transaction_parser/parser_benchmark/doctype/parser_benchmark_token_cost/parser_benchmark_token_cost.json @@ -16,7 +16,7 @@ "fieldtype": "Select", "in_list_view": 1, "label": "AI Model", - "options": "DeepSeek Chat\nDeepSeek Reasoner\nOpenAI gpt-4o\nOpenAI gpt-4o-mini\nOpenAI gpt-5\nOpenAI gpt-5-mini\nGoogle Gemini Pro-2.5\nGoogle Gemini Flash-2.5", + "options": "DeepSeek Chat\nDeepSeek Reasoner\nOpenAI gpt-4o\nOpenAI gpt-4o-mini\nOpenAI gpt-5\nOpenAI gpt-5-mini\nGoogle Gemini Pro-2.5\nGoogle Gemini Flash-2.5\nClaude Haiku-4.5", "reqd": 1 }, { @@ -56,7 +56,7 @@ ], "istable": 1, "links": [], - "modified": "2026-03-27 10:36:00.699499", + "modified": "2026-04-15 12:01:24.501498", "modified_by": "Administrator", "module": "Parser Benchmark", "name": "Parser Benchmark Token Cost", diff --git a/transaction_parser/parser_benchmark/doctype/parser_benchmark_token_cost/parser_benchmark_token_cost.py b/transaction_parser/parser_benchmark/doctype/parser_benchmark_token_cost/parser_benchmark_token_cost.py index 68ac63b..5908440 100644 --- a/transaction_parser/parser_benchmark/doctype/parser_benchmark_token_cost/parser_benchmark_token_cost.py +++ b/transaction_parser/parser_benchmark/doctype/parser_benchmark_token_cost/parser_benchmark_token_cost.py @@ -22,6 +22,7 @@ class ParserBenchmarkTokenCost(Document): "OpenAI gpt-5-mini", "Google Gemini Pro-2.5", "Google Gemini Flash-2.5", + "Claude Haiku-4.5", ] currency: DF.Link input_cost_per_million: DF.Currency diff --git a/transaction_parser/parser_benchmark/report/transaction_parser_accuracy_analysis/transaction_parser_accuracy_analysis.js b/transaction_parser/parser_benchmark/report/transaction_parser_accuracy_analysis/transaction_parser_accuracy_analysis.js index b39587a..8d21f3d 100644 --- a/transaction_parser/parser_benchmark/report/transaction_parser_accuracy_analysis/transaction_parser_accuracy_analysis.js +++ b/transaction_parser/parser_benchmark/report/transaction_parser_accuracy_analysis/transaction_parser_accuracy_analysis.js @@ -10,6 +10,7 @@ const AI_MODELS = [ "OpenAI gpt-5-mini", "Google Gemini Pro-2.5", "Google Gemini Flash-2.5", + "Claude Haiku-4.5", ]; const PDF_PROCESSORS = ["PDFtoText", "OCRMyPDF", "Docling"]; diff --git a/transaction_parser/parser_benchmark/report/transaction_parser_accuracy_analysis/transaction_parser_accuracy_analysis.py b/transaction_parser/parser_benchmark/report/transaction_parser_accuracy_analysis/transaction_parser_accuracy_analysis.py index aa85f96..49b28a0 100644 --- a/transaction_parser/parser_benchmark/report/transaction_parser_accuracy_analysis/transaction_parser_accuracy_analysis.py +++ b/transaction_parser/parser_benchmark/report/transaction_parser_accuracy_analysis/transaction_parser_accuracy_analysis.py @@ -25,8 +25,9 @@ "OpenAI gpt-4o-mini": 3, "Google Gemini Pro-2.5": 4, "Google Gemini Flash-2.5": 5, - "DeepSeek Reasoner": 6, - "DeepSeek Chat": 7, + "Claude Haiku-4.5": 6, + "DeepSeek Reasoner": 7, + "DeepSeek Chat": 8, } _PDF_PROCESSOR_ORDER = { diff --git a/transaction_parser/parser_benchmark/report/transaction_parser_benchmark_log_detail/transaction_parser_benchmark_log_detail.js b/transaction_parser/parser_benchmark/report/transaction_parser_benchmark_log_detail/transaction_parser_benchmark_log_detail.js index 7333d27..505575e 100644 --- a/transaction_parser/parser_benchmark/report/transaction_parser_benchmark_log_detail/transaction_parser_benchmark_log_detail.js +++ b/transaction_parser/parser_benchmark/report/transaction_parser_benchmark_log_detail/transaction_parser_benchmark_log_detail.js @@ -10,6 +10,7 @@ const AI_MODELS = [ "OpenAI gpt-5-mini", "Google Gemini Pro-2.5", "Google Gemini Flash-2.5", + "Claude Haiku-4.5", ]; const PDF_PROCESSORS = ["OCRMyPDF", "Docling"]; diff --git a/transaction_parser/parser_benchmark/report/transaction_parser_version_comparison/transaction_parser_version_comparison.js b/transaction_parser/parser_benchmark/report/transaction_parser_version_comparison/transaction_parser_version_comparison.js index a75a66a..254b4fd 100644 --- a/transaction_parser/parser_benchmark/report/transaction_parser_version_comparison/transaction_parser_version_comparison.js +++ b/transaction_parser/parser_benchmark/report/transaction_parser_version_comparison/transaction_parser_version_comparison.js @@ -10,6 +10,7 @@ const AI_MODELS = [ "OpenAI gpt-5-mini", "Google Gemini Pro-2.5", "Google Gemini Flash-2.5", + "Claude Haiku-4.5", ]; const PDF_PROCESSORS = ["PDFtoText", "OCRMyPDF", "Docling"]; diff --git a/transaction_parser/parser_benchmark/report/transaction_parser_version_comparison/transaction_parser_version_comparison.py b/transaction_parser/parser_benchmark/report/transaction_parser_version_comparison/transaction_parser_version_comparison.py index 4af603e..459a2d7 100644 --- a/transaction_parser/parser_benchmark/report/transaction_parser_version_comparison/transaction_parser_version_comparison.py +++ b/transaction_parser/parser_benchmark/report/transaction_parser_version_comparison/transaction_parser_version_comparison.py @@ -21,8 +21,9 @@ "OpenAI gpt-4o-mini": 3, "Google Gemini Pro-2.5": 4, "Google Gemini Flash-2.5": 5, - "DeepSeek Reasoner": 6, - "DeepSeek Chat": 7, + "Claude Haiku-4.5": 6, + "DeepSeek Reasoner": 7, + "DeepSeek Chat": 8, } _PDF_PROCESSOR_ORDER = { diff --git a/transaction_parser/transaction_parser/ai_integration/models.py b/transaction_parser/transaction_parser/ai_integration/models.py index 65dfd58..7ff408c 100644 --- a/transaction_parser/transaction_parser/ai_integration/models.py +++ b/transaction_parser/transaction_parser/ai_integration/models.py @@ -18,6 +18,7 @@ class Model: base_url: str response_format: str supports_temperature: bool = True + supports_response_format: bool = True ### DeepSeek Models @@ -111,6 +112,27 @@ class GeminiFlash(Model): response_format: str = ResponseFormat.JSON.value +### Anthropic Models + + +@dataclass +class ClaudeHaiku(Model): + """Anthropic Claude Haiku 4.5 model configuration. + + - `response_format` is not sent because Anthropic's compatibility layer + rejects `json_object` and silently ignores other values. + - JSON output is not guaranteed. + + - https://platform.claude.com/docs/en/api/openai-sdk + """ + + name: str = "claude-haiku-4-5" + service_provider: str = "Anthropic" + base_url: str = "https://api.anthropic.com/v1/" + response_format: str = ResponseFormat.TEXT.value + supports_response_format: bool = False + + ### Model Registry MODELS = { @@ -122,4 +144,5 @@ class GeminiFlash(Model): "OpenAI gpt-5-mini": OpenAIGPT5Mini(), "Google Gemini Pro-2.5": GeminiPro(), "Google Gemini Flash-2.5": GeminiFlash(), + "Claude Haiku-4.5": ClaudeHaiku(), } diff --git a/transaction_parser/transaction_parser/ai_integration/parser.py b/transaction_parser/transaction_parser/ai_integration/parser.py index bdd24f4..101aa55 100644 --- a/transaction_parser/transaction_parser/ai_integration/parser.py +++ b/transaction_parser/transaction_parser/ai_integration/parser.py @@ -129,10 +129,12 @@ def _build_request_params(self, messages: tuple) -> dict: request_params = { "model": self.model.name, "messages": messages, - "response_format": {"type": self.model.response_format}, "stream": False, } + if self.model.supports_response_format: + request_params["response_format"] = {"type": self.model.response_format} + # Only include temperature if the model supports it if self.model.supports_temperature: request_params["temperature"] = 0.7 diff --git a/transaction_parser/transaction_parser/doctype/transaction_parser_api_key_item/transaction_parser_api_key_item.json b/transaction_parser/transaction_parser/doctype/transaction_parser_api_key_item/transaction_parser_api_key_item.json index fc433db..f34b525 100644 --- a/transaction_parser/transaction_parser/doctype/transaction_parser_api_key_item/transaction_parser_api_key_item.json +++ b/transaction_parser/transaction_parser/doctype/transaction_parser_api_key_item/transaction_parser_api_key_item.json @@ -7,6 +7,7 @@ "engine": "InnoDB", "field_order": [ "service_provider", + "column_break_ogyu", "api_key" ], "fields": [ @@ -15,7 +16,7 @@ "fieldtype": "Select", "in_list_view": 1, "label": "Service Provider", - "options": "DeepSeek\nOpenAI\nGoogle", + "options": "DeepSeek\nOpenAI\nGoogle\nAnthropic", "reqd": 1 }, { @@ -24,18 +25,23 @@ "in_list_view": 1, "label": "API Key", "reqd": 1 + }, + { + "fieldname": "column_break_ogyu", + "fieldtype": "Column Break" } ], "grid_page_length": 50, "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2025-04-01 13:08:21.049741", + "modified": "2026-04-15 12:02:09.481616", "modified_by": "Administrator", "module": "Transaction Parser", "name": "Transaction Parser API Key Item", "owner": "Administrator", "permissions": [], + "row_format": "Dynamic", "sort_field": "modified", "sort_order": "DESC", "states": [] diff --git a/transaction_parser/transaction_parser/doctype/transaction_parser_api_key_item/transaction_parser_api_key_item.py b/transaction_parser/transaction_parser/doctype/transaction_parser_api_key_item/transaction_parser_api_key_item.py index ec25069..3cc8d23 100644 --- a/transaction_parser/transaction_parser/doctype/transaction_parser_api_key_item/transaction_parser_api_key_item.py +++ b/transaction_parser/transaction_parser/doctype/transaction_parser_api_key_item/transaction_parser_api_key_item.py @@ -6,4 +6,18 @@ class TransactionParserAPIKeyItem(Document): + # begin: auto-generated types + # This code is auto-generated. Do not modify anything in this block. + + from typing import TYPE_CHECKING + + if TYPE_CHECKING: + from frappe.types import DF + + api_key: DF.Password + parent: DF.Data + parentfield: DF.Data + parenttype: DF.Data + service_provider: DF.Literal["DeepSeek", "OpenAI", "Google", "Anthropic"] + # end: auto-generated types pass diff --git a/transaction_parser/transaction_parser/doctype/transaction_parser_settings/transaction_parser_settings.json b/transaction_parser/transaction_parser/doctype/transaction_parser_settings/transaction_parser_settings.json index bbbfdde..f95482f 100644 --- a/transaction_parser/transaction_parser/doctype/transaction_parser_settings/transaction_parser_settings.json +++ b/transaction_parser/transaction_parser/doctype/transaction_parser_settings/transaction_parser_settings.json @@ -92,7 +92,7 @@ "fieldtype": "Select", "label": "Default AI Model", "mandatory_depends_on": "eval: doc.enabled", - "options": "DeepSeek Chat\nDeepSeek Reasoner\nOpenAI gpt-4o\nOpenAI gpt-4o-mini\nOpenAI gpt-5\nOpenAI gpt-5-mini\nGoogle Gemini Pro-2.5\nGoogle Gemini Flash-2.5" + "options": "DeepSeek Chat\nDeepSeek Reasoner\nOpenAI gpt-4o\nOpenAI gpt-4o-mini\nOpenAI gpt-5\nOpenAI gpt-5-mini\nGoogle Gemini Pro-2.5\nGoogle Gemini Flash-2.5\nClaude Haiku-4.5" }, { "default": "PDFtoText", @@ -175,7 +175,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2026-04-13 09:09:13.061580", + "modified": "2026-04-15 12:02:29.008840", "modified_by": "Administrator", "module": "Transaction Parser", "name": "Transaction Parser Settings", diff --git a/transaction_parser/transaction_parser/doctype/transaction_parser_settings/transaction_parser_settings.py b/transaction_parser/transaction_parser/doctype/transaction_parser_settings/transaction_parser_settings.py index 87aac33..0a931f6 100644 --- a/transaction_parser/transaction_parser/doctype/transaction_parser_settings/transaction_parser_settings.py +++ b/transaction_parser/transaction_parser/doctype/transaction_parser_settings/transaction_parser_settings.py @@ -42,6 +42,7 @@ class TransactionParserSettings(Document): "OpenAI gpt-5-mini", "Google Gemini Pro-2.5", "Google Gemini Flash-2.5", + "Claude Haiku-4.5", ] enabled: DF.Check incoming_email_accounts: DF.Table[TransactionParserEmailAccount]