feat(ai): refine extraction prompt with human-readable size conversions

- Add SIZE CONVERSION RULES section (critical) with explicit thresholds
- Convert ≥1600GB to TB format (e.g., 1600GB → 1.6TB)
- Convert memory ≥1024MB to GB format
- Update Item field examples with human-readable sizes
- Update Size field definition to emphasize HUMAN-READABLE format
- Update OCR key definition with size conversion examples
- Apply rules consistently across all size-related fields

This ensures AI-extracted items display sizes in user-friendly format
and improves OCR matching accuracy with normalized size representations.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-04-17 12:57:06 +03:00
parent da83c91a5b
commit 6aabf3eac1
3 changed files with 108 additions and 40 deletions

View File

@@ -105,25 +105,32 @@ def startup_event():
default_prompt = (
"Extract hardware specifications with PRECISE formatting.\n"
"For any field, do not add comments in parenthesis or measurement units in Item name.\n\n"
"SIZE CONVERSION RULES (CRITICAL - Apply to all size fields):\n"
" Convert sizes to HUMAN-READABLE format:\n"
" • Storage ≥1600GB: convert to TB (e.g., '1600GB''1.6TB', '2048GB''2TB', '8192GB''8TB')\n"
" • Storage 512GB-1599GB: keep as GB (e.g., '512GB', '1TB' if labeled as 1000GB)\n"
" • Memory ≥1024MB: convert to GB (e.g., '1024MB''1GB')\n"
" • Cables/length: express in meters (e.g., '5m', '30m')\n"
" Apply this rule to: Item field size prefix, Size field, and OCR key sizes.\n\n"
"ITEM FIELD FORMAT (Critical):\n"
"[<size_or_length>] <type> <vendor> <connector> <part_number>\n"
" <size_or_length>: GB/TB for storage, meters for cables (e.g., '2m', '256GB', '2TB'). Omit diameter/mm measurements.\n"
" <size_or_length>: HUMAN-READABLE format - GB/TB for storage, meters for cables (e.g., '2m', '256GB', '1.6TB'). Omit diameter/mm measurements.\n"
" <type>: DDR3/DDR4/DDR5/SSD/HDD/NVMe/SAS/SATA/Patchcord/Fiber/Cable/Transceiver etc.\n"
" <vendor>: HP/HPE/Dell/Samsung/Cisco/Lenovo/Hynix etc.\n"
" <connector>: RJ45/LC-LC/MPO/U.3/SATA/SAS/LC/ST etc. Omit if N/A.\n"
" <part_number>: PN only if visible on label. Omit serial numbers.\n"
"Examples: '5m Patchcord LC-LC' / '256GB SSD Samsung SAS' / '128GB DDR4 Hynix SK-234' / '2TB NVMe HP U.3'\n\n"
"Examples: '5m Patchcord LC-LC' / '256GB SSD Samsung SAS' / '128GB DDR4 Hynix SK-234' / '1.6TB NVMe HP U.3' / '8TB HDD Seagate SATA'\n\n"
"TYPE: Item asset class (DDR3/SSD/NVMe/Patchcord/SFP etc.)\n"
"DESCRIPTION: Technical details max 5 words (e.g., 'High speed fiber optic cable'). Omit size/length here.\n"
"CATEGORY: Broad ecosystem (Memory, Storage, Network, Cabling, etc.)\n"
"CONNECTOR: Physical interface type (e.g., 'LC', 'RJ45', 'U.3')\n"
"SIZE: Capacity or length ONLY (e.g., '256GB', '2m')\n"
"SIZE: HUMAN-READABLE capacity or length ONLY (e.g., '256GB', '1.6TB', '2m'). No serial numbers or comments.\n"
"COLOR: Physical color if distinguishing.\n"
"PartNr: Part number only (no serial numbers)\n"
"OCR: Robust matching key. Include: core type + vendor + key identifiers + common variations.\n"
" Example for '5m Patchcord LC-LC': 'PATCHCORD 5M LC LC CAT6 FIBER'\n"
"OCR: Robust matching key. Include: core type + vendor + key identifiers + HUMAN-READABLE size + common variations.\n"
" Examples: 'PATCHCORD 5M LC LC CAT6 FIBER' / '256GB SSD SAMSUNG' / '1.6TB NVME HP' / '128GB DDR4 HYNIX'\n"
" Include abbreviations: 'DDR4'/'DDR' or 'SSD'/'SSDS' or 'HP'/'HPE' or 'NVMe'/'NVME'\n"
" Format: ALL UPPERCASE, space-separated tokens, NO special chars. Skip serial numbers."
" Format: ALL UPPERCASE, space-separated tokens, NO special chars. Skip serial numbers. Use human-readable sizes."
)
# Wrap in JSON instructions for reliable parsing

View File

@@ -1,37 +1,98 @@
# Technical Inventory Multi-Label Extraction Protocol
# Technical Inventory Hardware Extraction Protocol
Your goal is to extract precise hardware specifications for ALL relevant inventory items found in the image.
Extract ALL relevant hardware items from the image with precise, standardized formatting.
## Intelligence Rules:
1. **Filtering Strategy**:
- **INCLUDE**: Standalone physical hardware, modules, cables, servers, and storage units.
- **EXCLUDE**: Generic mounting hardware (screws, nails, rails, brackets), paper licenses/documentation, or empty packaging, UNLESS they are the primary and only subject of the image.
- In cases like image labels listing multiple SKUs (e.g., 5m cable and 7m cable), TREAT EACH LINE AS A SEPARATE ITEM.
## 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)
2. **Field Definitions**:
- **Item**: Primary identity (Manufacturer + Core Class). Max 3 words (e.g., "Cisco SFP Module").
- **Type**: Asset classification (e.g., "SFP", "patch cords", "NVMe").
- **Description**: Technical summary emphasizing speed/capacity. Max 5 words.
- **Category**: Broad ecosystem (e.g., "Network", "Storage").
- **Connector**: Physical interface (e.g., "LC/UPC", "RJ45").
- **Size**: Capacity or Length (e.g., "1.6TB", "5m").
- **Color**: Physical distinguish color.
- **PartNr**: Absolute technical identifier (P/N, SKU). Omit Serial Numbers.
- **OCR**: Concise technical string for local heuristic matching. **EXCLUDE ALL SERIAL NUMBERS.**
## Item Field Format (CRITICAL)
[]
## Output Format:
Return ONLY a valid JSON object with the key "items" containing an array of objects.
Example:
{
**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)
## Output Format
```json
{
"items": [
{
"Item": "SFP Module",
"Type": "SFP",
"Description": "64G Gen7 Fibre Channel",
"Category": "Network",
"Connector": "LC",
"PartNr": "SFP-64G-G7",
"OCR": "SFP 64G GEN7 FC"
"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"
}
]
}
}
Return ONLY JSON. No markdown. No text.

File diff suppressed because one or more lines are too long