Files
tfm_ainventory/config/ai_prompt.md
Daniel Bedeleanu ada3669217 test: add tests for image_processing field from AI extraction
- Added 11 comprehensive tests for image_processing parsing
- Tests validate crop_bounds structure: {x, y, width, height} all ints >= 0
- Tests validate rotation_degrees: int/float, -360 to +360
- Tests validate confidence: float, 0.0 to 1.0
- Tests graceful handling when image_processing field is missing
- Tests multiple items with image_processing data
- Tests partial data handling (optional fields)
- Tests with both Gemini and Claude providers
- Updated extract_label_info() to preserve and validate image_processing field
- All tests passing, no regressions
2026-04-21 18:53:04 +03:00

5.5 KiB

Technical Inventory Hardware Extraction Protocol

Extract ALL relevant hardware items from the image with precise, standardized formatting.

Filtering Rules

  • INCLUDE: Physical hardware, modules, cables, servers, storage, transceivers
  • EXCLUDE: Generic mounting hardware (screws, brackets, rails), paper licenses, empty packaging
  • Multi-item labels: Treat each SKU/variant as a separate item (e.g., "5m cable" and "7m cable" = 2 items)

Item Field Format (CRITICAL)

[]

Component Rules:

  • <size_or_length>:

    • STORAGE CAPACITY - HUMAN READABLE: Convert to largest unit (TB/MB).
      • Examples: "1600GB" → "1.6TB", "256GB" → "256GB", "512MB" → "512MB"
      • Rule: If ≥1000GB, use TB. If ≥1000MB, use GB. Otherwise use MB.
    • CABLE/WIRE LENGTH: Meters only. Examples: "5m", "10m", "50m"
    • RAM DIMM: Capacity in GB. Examples: "128GB", "32GB", "8GB"
  • <type>: Asset class. One of: DDR3/DDR4/DDR5, SSD/HDD/NVMe, SATA/SAS, Patchcord/Fiber/Cable, SFP/Transceiver, DIMM, etc.

  • <vendor>: Manufacturer (HP, HPE, Dell, Samsung, Cisco, Hynix, Intel, Broadcom)

  • <connector>: Physical interface (RJ45, LC-LC, MPO, U.3, SATA, SAS, ST, SC). Omit if N/A.

  • <part_number>: Part number ONLY if visible. Omit serial numbers.

Item Examples (WITH HUMAN-READABLE SIZES):

  • 1.6TB NVMe HPE U.3 P66093-002 (not 1600GB)
  • 256GB SSD Dell SATA SK-8765 (already human-readable)
  • 5m Patchcord LC-LC
  • 128GB DDR4 Hynix
  • 512MB Cache Samsung SATA (stays MB if under 1GB)

Size Conversion Examples:

  • 1600GB → 1.6TB
  • 2048GB → 2TB
  • 512GB → 512GB (under 1TB threshold)
  • 256MB → 256MB
  • 1024MB → 1GB

Restrictions:

  • No comments in parenthesis
  • No measurement units in Item field (e.g., "1.6TB" not "1.6TB Storage")
  • No secondary vendors
  • No diameter/mm in Item field
  • ONE vendor only (primary manufacturer)

Other Fields

  • Type: Repeat the asset class (DDR4, SSD, NVMe, Patchcord, etc.)
  • Description: Technical summary, max 5 words. Examples: "High-speed fiber optic", "Enterprise Gen4 storage"
  • Category: Memory, Storage, Network, Cabling, Compute, Optical, Transceiver
  • Connector: Interface type from Item field. Examples: "LC-LC", "RJ45", "U.3"
  • Size: HUMAN-READABLE capacity or length. Examples: "1.6TB", "256GB", "5m" (NOT "1600GB")
  • Color: Physical color if distinguishing
  • PartNr: Part number only (no serial numbers)
  • OCR: Robust matching key for OCR tolerance

OCR Field Rules (CRITICAL)

Generate a SHORT, clean matching key:

  • Format: UPPERCASE space-separated, NO special chars, NO duplicates
  • Include ONLY: Type + Size + Primary Vendor + Connector + Part Number
  • EXCLUDE: Serial numbers, secondary vendors, duplicate tokens, EMC/SK labels
  • USE HUMAN-READABLE SIZE: Use TB/GB from Item field, not original notation

OCR Format: TYPE SIZE VENDOR CONNECTOR PARTNUMBER

OCR Examples (WITH HUMAN-READABLE SIZES):

  • Item: 1.6TB NVMe HPE U.3 P66093-002 → OCR: NVME 1.6TB HPE U3 P66093002
  • Item: 5m Patchcord LC-LC → OCR: PATCHCORD 5M LC LC
  • Item: 256GB SSD Samsung SAS SK-8765 → OCR: SSD 256GB SAMSUNG SAS SK8765
  • Item: 128GB DDR4 Hynix → OCR: DDR4 128GB HYNIX

OCR Constraints:

  • NO duplicate part numbers
  • NO secondary vendor names
  • NO extraneous labels
  • Each token appears ONE time only
  • Remove hyphens/special chars for fuzzy matching
  • Use HUMAN-READABLE sizes (1.6TB not 1600GB)

Image Processing Guidance (NEW)

Analyze the image layout and return crop/rotation metadata to optimize photo storage:

Crop Bounds Analysis

  • Identify the PRIMARY ITEM in the image (main object, not background/clutter)
  • Return bounding box: {x, y, width, height} in pixel coordinates
  • Rules:
    • x, y: top-left corner of item (pixel offset from image top-left)
    • width, height: dimensions of item bounding box
    • Include minimal padding (10-15 pixels) around item edges
    • Ignore background clutter, other items, hands, reflections

Rotation Analysis

  • Check if item labels/text are readable
  • If text is rotated (not horizontal), calculate rotation needed
  • Return rotation_degrees: degrees to rotate CLOCKWISE to make text readable
  • Examples:
    • Text rotated 90° counter-clockwise → return 90 (rotate 90° clockwise)
    • Text rotated 45° clockwise → return -45 (rotate 45° counter-clockwise)
    • Text already readable → return 0

Confidence Score

  • Return confidence: 0.0-1.0 indicating reliability of crop/rotation analysis
  • 0.9+ = High confidence (clear item, readable text)
  • 0.7-0.89 = Medium confidence (some ambiguity or text partially obscured)
  • <0.7 = Low confidence (cluttered image, unclear item boundaries)

Output Format (Extended)

{
  "items": [
    {
      "Item": "[size] type vendor connector partnumber",
      "Type": "type",
      "Description": "technical details (max 5 words)",
      "Category": "category",
      "Connector": "connector_type",
      "Size": "human_readable_size",
      "Color": "color",
      "PartNr": "part_number",
      "OCR": "TYPE SIZE VENDOR CONNECTOR PARTNUMBER",
      "image_processing": {
        "crop_bounds": {
          "x": 50,
          "y": 100,
          "width": 300,
          "height": 200
        },
        "rotation_degrees": 15,
        "confidence": 0.92
      }
    }
  ]
}

Return ONLY JSON. No markdown. No text.