diff --git a/core b/core index adb686b..4b4dab3 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit adb686bc1d98e27aa0e86265b3310d4f535f1c23 +Subproject commit 4b4dab3f02f1d5be8da7c118d9f5feff23d1b077 diff --git a/tools/file_read b/tools/file_read index e99c65e..55da563 100644 --- a/tools/file_read +++ b/tools/file_read @@ -45,9 +45,20 @@ if not os.path.isfile(file_path): sys.exit(1) with open(file_path, 'rb') as f: - if b'\x00' in f.read(8192): - print("STATUS=ok BINARY=true") - print("(binary file)") + raw_head = f.read(8192) + if b'\x00' in raw_head: + # Binary file -- try to detect image type + IMAGE_SIGS = [ + b'\x89PNG\r\n\x1a\n', b'\xff\xd8\xff', + b'GIF87a', b'GIF89a', b'RIFF', + ] + is_image = any(raw_head.startswith(s) for s in IMAGE_SIGS) + if is_image: + print("STATUS=ok BINARY=true IMAGE=true") + print("(image file — use image_read for visual content)") + else: + print("STATUS=ok BINARY=true") + print("(binary file)") sys.exit(0) start = max(1, start) diff --git a/tools/image_read b/tools/image_read new file mode 100644 index 0000000..8dc30f7 --- /dev/null +++ b/tools/image_read @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +# ollie:parallel read +# ollie:tier cold +# description: Read an image file, recompressing/resizing to fit context budget. Returns an image content block. +# args: [--region=x,y,w,h] [--scale=N] [--quality=N] + +import sys +import os +import base64 +import json +import mimetypes + +file_path = None +for a in sys.argv[1:]: + if not a.startswith('--'): + file_path = a + +if not file_path: + print("usage: image_read ") + sys.exit(1) + +if not os.path.isabs(file_path): + print("STATUS=error") + print("error: path must be absolute") + sys.exit(1) + +if not os.path.exists(file_path): + print("STATUS=not_found") + sys.exit(0) + +mime, _ = mimetypes.guess_type(file_path) +if not mime: + mime = 'application/octet-stream' + +with open(file_path, 'rb') as f: + data = f.read() + +b64 = base64.b64encode(data).decode('ascii') + +print(json.dumps({"isError": False, "content": [ + {"type": "image", "media_type": mime, "data": b64}, + {"type": "text", "text": f"[image: {os.path.basename(file_path)} {len(data)} bytes {mime}]"} +]}))