[ADD] ai_document_extraction - #96
Conversation
|
Updated the documentation (commit |
|
Hi @etobella and @angelmoya 👋 Just a friendly ping — when you have a moment, could you take a look at this PR whenever convenient? All CI checks are green (pre-commit, Odoo/OCB tests, codecov, runboat). Happy to adjust anything based on your feedback. Thanks so much for your time and all the maintenance work! |
|
Interesting, however, why don't you use https://github.com/OCA/ai/tree/18.0/ai_connection ? This way we can reuse code and so on. |
…ted files, external deps) - Drop cv2 from external_dependencies.python (not a valid PyPI name and not in manifestoo EXTERNAL_DEPENDENCIES_MAP; would break OCA CI pip install). Documented in readme/INSTALL.md instead. - Replace per-module requirements.txt with readme/INSTALL.md (19.0 CI generates a repo-level requirements.txt from external_dependencies). - Commit files generated by pre-commit: pyproject.toml (whool), README.rst, static/description/index.html, repo requirements.txt. - Prettier reformat of empty view XMLs; add development_status Alpha.
…help, USAGE wording)
…k, accurate comment)
- _parse_json_response uses raw_decode to find the first valid JSON object, ignoring trailing prose with extra braces and markdown code fences. - Add tests for extract_invoice_data (mocked requests) covering the Authorization header behavior.
- _ai_prepare_image cleans up the temp file on render failure - _ai_set_untaxed_line scopes account lookup to the move's company (company_ids) - Add tests for action_extract_with_ai guards (non-draft, wrong move_type, missing attachment) and the enqueue path
… flow tests - Add ir.model.access rules for extraction.wizard (Odoo 19 removed the transient-model bypass, so explicit ACLs are required). - Pre-fill partner_id from the move in action_review_extraction and guard action_apply against clearing an existing partner with an empty selection. - Add tests for the empty-partner guard and the review wizard flow.
- Ignore expected AI-extraction error logs in checklog-odoo.cfg - Robust amount coercion (string amounts from the LLM) - Drop license header from readme INSTALL fragment
OCA CI images lack libGL, so importing cv2 (pulled transitively by paddleocr) fails. Detect availability with find_spec and skip the pre-processor test; ocr_engine imports cv2 only when image_height is not provided.
The 'Extract with AI' button could not run on a freshly uploaded vendor bill because the web client saves the form before executing the button and invoice_date is required in the vendor bill form arch. Defaulting invoice_date to today makes the form always saveable; the extracted date still overrides it when the AI returns one.
- Fix AI Extraction section layout: state badge in the header, extracted amounts and raw JSON moved to a dedicated notebook page (the previous nested group rendered the fields stacked and misaligned). - Add immediate feedback: chatter message when the extraction starts and a badge showing the processing state; hide the button while processing/done. - Store the OCR-ready processed image as an attachment on the move so both the original upload and the processed PNG are kept. - Allow customer invoices (out_invoice/out_receipt) in addition to vendor bills. - Improve the LLM prompt: extract the real issuer name (legal-suffix company names in the header are the partner, standalone logos are ignored) and extract invoice line items. - Apply extracted line items as invoice lines (falling back to a single untaxed line when no lines are visible).
- Feed the LLM the list of available taxes (id/name/rate) and active currency codes so it can pick the exact tax per invoice line and report the invoice currency instead of guessing. - Extract a 'description' field and structured 'lines' (name, quantity, price_unit, tax_id); create real invoice lines with their tax applied. The generic 'AI extracted amount' line name is removed: when no lines are visible a single line is created using the extracted description. - Apply the extracted currency to the move when it differs from the company currency; keep the company currency when the extraction has no currency. - Add anti-hallucination validation: reject hash-like/URL invoice numbers, model names or bare logos as partner, invalid/out-of-range dates, unknown currencies and tax ids. - Post a chatter warning when no invoice date could be extracted.
3f64a21 to
0c759e6
Compare
|
Hi @etobella, thanks for the suggestion! Following up on your feedback: We ported
All 85 tests pass across |
…instead of General Settings
|
Quick update on the final UX since my previous comment (relevant for review):
All green: 78 local tests, CI (pre-commit, Odoo/OCB, codecov, runboat). |
Add the
ai_document_extractionmodule: local OCR (PaddleOCR) + LLM (Ollama) invoice data extraction into draftaccount.moverecords.Features
[HEADER]/[BODY]/[FOOTER]from bounding boxes)qwen3:4bvia Ollama) with a strict JSON schema, logo/header guard and hallucination controls (no math, null for unknown)queue_job(non-blocking UI)res.config.settings(API base URL, model, OCR language, match threshold)Notes
paddleocr,rapidfuzz, etc.) are declared in the manifest / reporequirements.txt;cv2is imported lazily and documented inreadme/INSTALL.mdsincecv2is not a valid PyPI distribution name for CI.queue_job(OCA/queue, 19.0).