Download tiny_computer_agent/demo.py from hkblockchaintechnology/tiny-computer-agent: direct link, hf CLI and curl.
- Browser
- Download file 2.39 kB
-
https://huggingface.co/hkblockchaintechnology/tiny-computer-agent/resolve/main/tiny_computer_agent/demo.py
- Command line
-
hf download hf://hkblockchaintechnology/tiny-computer-agent/tiny_computer_agent/demo.py
-
curl -L -o demo.py https://huggingface.co/hkblockchaintechnology/tiny-computer-agent/resolve/main/tiny_computer_agent/demo.py
2.39 kB
| """Synthetic screens for offline demos and tests. | |
| No display required: this module draws a small fake desktop - a top bar with Files | |
| and Terminal, plus a Save dialog with a file-name field and Save/Cancel buttons - so | |
| the whole pipeline (pixels, OCR, index, menu, model, action) can be exercised on a | |
| headless machine, in CI, or before you let an agent near your real desktop. | |
| """ | |
| from __future__ import annotations | |
| import glob | |
| from pathlib import Path | |
| from typing import Any | |
| def _font(size: int) -> Any: | |
| from PIL import ImageFont | |
| candidates = [ | |
| "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", | |
| "/System/Library/Fonts/Supplemental/Arial.ttf", | |
| "C:/Windows/Fonts/arial.ttf", | |
| ] + glob.glob("/usr/share/fonts/**/*Regular*.ttf", recursive=True) | |
| for path in candidates: | |
| try: | |
| return ImageFont.truetype(path, size) | |
| except Exception: | |
| continue | |
| return ImageFont.load_default() | |
| def fake_desktop(width: int = 720, height: int = 460) -> Any: | |
| """Draw a screenshot-like image: a desktop with an unsaved Save dialog.""" | |
| from PIL import Image, ImageDraw | |
| image = Image.new("RGB", (width, height), (245, 246, 248)) | |
| draw = ImageDraw.Draw(image) | |
| draw.rectangle([0, 0, width, 28], fill=(38, 40, 48)) | |
| draw.text((12, 7), "Files", fill="white", font=_font(15)) | |
| draw.text((90, 7), "Terminal", fill="white", font=_font(15)) | |
| draw.rectangle([180, 90, 540, 330], fill="white", outline=(120, 120, 130), width=2) | |
| draw.text((200, 108), "Untitled document - unsaved changes", | |
| fill=(30, 30, 30), font=_font(16)) | |
| draw.text((200, 170), "File name", fill=(60, 60, 60), font=_font(15)) | |
| draw.rectangle([200, 195, 520, 225], fill=(252, 252, 252), | |
| outline=(120, 120, 130), width=2) | |
| draw.rectangle([200, 265, 380, 300], fill=(66, 111, 220), | |
| outline=(40, 70, 160), width=2) | |
| draw.text((275, 274), "Save", fill="white", font=_font(16)) | |
| draw.rectangle([400, 265, 520, 300], fill=(230, 230, 235), | |
| outline=(120, 120, 130), width=2) | |
| draw.text((440, 274), "Cancel", fill=(30, 30, 30), font=_font(16)) | |
| return image | |
| def write_fake_desktop(path: str | Path) -> Path: | |
| """Save :func:`fake_desktop` to a PNG (handy for ``--image``).""" | |
| target = Path(path) | |
| fake_desktop().save(target) | |
| return target | |