OvisOCR3 / stage1_cache.py
xxyyy123's picture
Fix region previews and restore both bundled Stage 1 parsers
e70c1c9
Raw History Blame Contribute Delete
2.74 kB
"""Frozen page parses for exact bundled examples, not a live-inference cache."""
import hashlib
import json
from catalog import ROOT, build_prompt, load_cases
def image_signature(image):
return {'mode': image.mode, 'size': list(image.size),
'sha256': hashlib.sha256(image.tobytes()).hexdigest()}
def cached_pages(images, parser, model_source):
metadata = {'state': 'bypass', 'hits': 0}
if model_source != 'ATH-MaaS/OvisOCR3':
return None, metadata | {'reason': 'different_model'}
signatures = [image_signature(image) for image in images]
for case in load_cases():
if case['task'] != 'crosspage_table':
continue
path = ROOT / 'examples' / case['id'] / 'stage1-cache.json'
try:
content = path.read_bytes()
bundle = json.loads(content)
if bundle['images'] != signatures:
continue
if bundle['version'] != 2 or bundle['case_id'] != case['id'] or bundle['model'] != model_source:
raise ValueError('Invalid example cache identity.')
entry = bundle['parsers'][parser]
prompt = build_prompt(parser)
records = entry['calls']
if entry['prompt'] != prompt or len(records) != 2:
raise ValueError('Cached parser contract changed.')
for index, record in enumerate(records):
if (record['stage'] != f'page-{index + 1}' or record['prompt'] != prompt
or record['finish_reason'] != 'stop' or not record['text'].strip()
or hashlib.sha256(record['text'].encode()).hexdigest() != entry['raw_sha256'][index]):
raise ValueError('Invalid cached page.')
source = {'artifact': str(path.relative_to(ROOT)),
'sha256': hashlib.sha256(content).hexdigest(), 'generated_at': entry['generated_at'],
'model': bundle['model'], 'weights_sha256': bundle['weights_sha256'],
'backend': entry['backend'], 'max_new_tokens': entry['max_new_tokens']}
calls = [record | {'cache_hit': True, 'cache_source': source, 'phase': 'Cached',
'cached_inference_seconds': record.get('seconds', 0), 'seconds': 0.0}
for record in records]
return calls, metadata | {'state': 'hit', 'hits': 2, 'case_id': case['id'], **source}
except FileNotFoundError:
continue
except (OSError, ValueError, KeyError, TypeError, IndexError, AttributeError):
return None, metadata | {'state': 'miss', 'reason': 'invalid_or_unavailable_cache'}
return None, metadata | {'reason': 'not_a_bundled_example'}