48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
import os
|
|
from dotenv import load_dotenv
|
|
from .ai import gemini, claude
|
|
|
|
# Load environment variables from the directory where this file resides
|
|
base_dir = os.path.dirname(os.path.abspath(__file__))
|
|
dotenv_path = os.path.join(base_dir, ".env")
|
|
load_dotenv(dotenv_path)
|
|
|
|
def extract_label_info(image_bytes: bytes):
|
|
"""
|
|
Orchestrates extraction across multiple AI providers.
|
|
Order: Gemini (Flash/Pro) -> Claude (Haiku/Sonnet)
|
|
"""
|
|
prompt = """
|
|
Extract technical inventory information from this label image.
|
|
|
|
CRITICAL INSTRUCTIONS:
|
|
1. Look at the most prominent text (usually top 1-2 rows). This is the product NAME and MODEL.
|
|
2. Extract the PART NUMBER (P/N, Model No, Type). If no explicit Part Number is found, synthesize one from the most unique identifier in the header (e.g. 'OM4-MMF-DX').
|
|
3. Separate the COLOR (e.g. Turquoise, Yellow, Black).
|
|
4. Extract CATEGORY based on the item type (e.g. Patchcord, SFP, Connector).
|
|
5. Extract technical SPECS (e.g. '2.0mm', '10G', '850nm').
|
|
|
|
Return ONLY a valid JSON object:
|
|
{
|
|
"name": "Full descriptive name from header",
|
|
"part_number": "Unique identifier for fast scanning",
|
|
"category": "Broad category",
|
|
"color": "Color if present",
|
|
"specs": "Brief tech specs list",
|
|
"barcode": "Barcode value if visible",
|
|
"quantity": 1
|
|
}
|
|
"""
|
|
|
|
# 1. Try Gemini
|
|
result = gemini.extract(image_bytes, prompt)
|
|
if result:
|
|
return result
|
|
|
|
# 2. Try Claude (Fallback)
|
|
result = claude.extract(image_bytes, prompt)
|
|
if result:
|
|
return result
|
|
|
|
return {"error": "All AI providers failed or no API keys configured. Check your .env file."}
|