#!/usr/bin/env python3
import sys, json, base64, io
try:
    import torch
    import open_clip
    from PIL import Image
except Exception as e:
    print(json.dumps({"error":"deps_missing","message":str(e)}))
    sys.exit(0)

def load_image_from_input(data):
    if data.get('path'):
        return Image.open(data['path']).convert('RGB')
    if data.get('bytesBase64'):
        b = base64.b64decode(data['bytesBase64'])
        return Image.open(io.BytesIO(b)).convert('RGB')
    raise RuntimeError('no input provided')

def main():
    raw = sys.stdin.read()
    data = json.loads(raw) if raw.strip() else {}
    image = load_image_from_input(data)
    model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', pretrained='laion2b_s34b_b79k')
    model.eval()
    with torch.no_grad():
        img_t = preprocess(image).unsqueeze(0)
        emb = model.encode_image(img_t)
        emb = emb / emb.norm(dim=-1, keepdim=True)
        arr = emb.squeeze(0).cpu().numpy().astype('float32').tolist()
    print(json.dumps({"embedding": arr}))

if __name__ == '__main__':
    main()

