Files
odoo_ocr/AGENTS.md
T
fegger 3661831221 Add review skill and make review stage mandatory in AGENTS.md
- Add .agents/skills/review/SKILL.md with a required review checklist covering
  project rules, model client rules, pipeline rules, XML rules, and test rules.
- Update AGENTS.md with a dedicated 'Review Stage Rules' section that makes
  review mandatory and maps confidence thresholds to XML generation behavior.
- Add review skill to the skills reference.
- Add .ruff_cache/ to .gitignore and keep agent XML templates out of the '*.xml' ignore rule.
2026-08-21 14:06:48 +02:00

5.5 KiB

AGENTS.md — Odoo OCR Project

This file provides context and rules for AI agents working on odoo_ocr, a local-first invoice OCR pipeline that reads scanned, printed, handwritten, and native-PDF invoices and produces Odoo Enterprise-ready XML.

Project Goal

Build a Python application that:

  1. Classifies incoming invoice files by type (native PDF, scanned print, handwritten, mixed image).
  2. Routes each file to a specialized processing branch.
  3. Runs OCR using local vision-language models (Ollama or llama.cpp).
  4. Extracts a structured invoice representation.
  5. Reviews extracted data against the original image using a second vision model.
  6. Emits valid Odoo XML for import into Odoo Enterprise.

Tech Stack

  • Language: Python 3.11+
  • Dependency management: pyproject.toml (PEP 621); use uv or pip.
  • Core libraries:
    • pydantic v2 for all data schemas and settings.
    • pymupdf and pdf2image for PDF ingestion.
    • Pillow and opencv-python-headless for image preprocessing.
    • httpx for HTTP model clients.
    • lxml for XML generation and validation.
    • pytest and pytest-asyncio for tests.
  • Local inference:
    • Primary runtime: Ollama for fast iteration.
    • Optimized/runtime path: llama.cpp server (custom GGUF quants).
  • Models:
    • Document classifier: Qwen2.5-VL-3B or heuristics.
    • OCR / extraction: Qwen2.5-VL-7B or GLM-OCR (preferred for handwriting).
    • Review / validation: Qwen2.5-VL-7B or larger (72B if available).

Architecture

Input File
  → Classifier (heuristic + small VLM)
    → Branch: digital_pdf      → text/layout extraction
    → Branch: scanned_print    → preprocess → VLM OCR
    → Branch: handwritten      → preprocess → GLM-OCR / handwriting OCR
    → Branch: mixed_unknown    → preprocess → ensemble OCR
      → Structured Extraction VLM
      → Review VLM (image vs extracted JSON)
        → Confidence check
          → XML Builder
            → Odoo XML + sidecar JSON

Code Conventions

  1. Project layout: keep application code under src/odoo_ocr/.
  2. Schemas first: define Pydantic models before writing business logic.
  3. Type hints: use typing everywhere; run mypy in strict mode where practical.
  4. Error handling: never swallow exceptions; return structured Result objects or raise domain exceptions.
  5. Configuration: use pydantic-settings with config.yaml and env var overrides.
  6. Logging: use Python standard logging; log every model call latency and token usage.
  7. No hardcoded secrets: model endpoints, credentials, and paths come from settings.
  8. Tests: every module must have tests under tests/. Use fixtures from tests/fixtures/.

Model Client Rules

  1. Support both Ollama and llama.cpp with a unified interface (BaseVLMClient).
  2. Always emit JSON from VLMs when doing extraction/review. Use constrained prompts, not regex scraping.
  3. Retry on transient failures with exponential backoff.
  4. Cache model responses by content hash to avoid re-running expensive inference during development.
  5. Record per-call metrics (model name, tokens, latency, prompt hash).

Data Flow Rules

  1. Every invoice must pass through the review stage before XML generation. The review model compares the original image with the extracted JSON and produces a ReviewResult.
  2. Every invoice must produce:
    • A Pydantic ExtractedInvoice object.
    • A review result (ReviewResult) with confidence score and issue list.
    • An Odoo XML file (unless blocked by low confidence).
    • A sidecar JSON file with metadata, timings, and confidence.
  3. If review confidence is below the configured threshold, mark the invoice for human review and do not generate final XML (or generate a draft with a warning flag).
  4. Never send invoice data outside the local model endpoints.

Review Stage Rules

  1. The review stage is mandatory, not optional.
  2. The review VLM must receive both the original invoice image and the extracted ExtractedInvoice JSON.
  3. The review prompt asks the model to verify field presence, arithmetic, and consistency.
  4. The ReviewResult must include a confidence score between 0.0 and 1.0 and a list of issues.
  5. XML generation must respect the confidence thresholds in config.yaml:
    • confidence >= 0.90: generate final XML.
    • 0.75 <= confidence < 0.90: generate XML with a human-review flag.
    • confidence < 0.75: do not generate final XML; emit sidecar JSON only.
  6. See skill review for the full review checklist.

Odoo XML Target

Generate Odoo data-import XML compatible with Odoo Enterprise vendor bills:

  • res.partner (vendor)
  • account.move (vendor bill header)
  • account.move.line (invoice lines)
  • account.tax references by percentage/name

See skill odoo-xml-import for detailed field mapping and a sample XML template.

When to Ask the User

Ask for clarification when:

  • The requested change would alter the model stack.
  • The change affects the Odoo target schema or import method.
  • You are unsure whether a file should be committed or a dependency added.
  • A requested feature conflicts with the local-only / privacy constraint.

Skills Reference

Agents should load the relevant project skills from .agents/skills/:

  • odoo-ocr-pipeline — when implementing classifier, branches, OCR, extraction, or review.
  • odoo-xml-import — when generating or validating Odoo XML.
  • local-vlm-client — when writing model clients or prompts.
  • review — when reviewing code, tests, or design decisions before approving changes.