from abc import ABC, abstractmethod SYSTEM_PROMPT = ( "You are a financial document analysis assistant. " "Given the text extracted from a PDF document, return ONLY a JSON object " "with no markdown, no code fences, and no explanation." ) USER_PROMPT_TEMPLATE = """Analyze the following document text and return a JSON object with exactly these keys: document_type (one of: invoice, bill, receipt, order, expense, revenue, unknown), total_amount (string or null), currency (string or null), vendor_name (string or null), customer_name (string or null), billing_address (string or null), customer_address (string or null), invoice_number (string or null), invoice_date (string or null), due_date (string or null), tags (array of strings), line_items (array of objects, each with keys: description, amount). Document text: {text}""" class AIProvider(ABC): @abstractmethod async def classify_document(self, text: str) -> dict: """Return structured extraction dict from document text.""" ...