hugpy-tools
hugpy_tools is a standalone set of tools for autonomous agents. Its core
uses only the standard library. Optional backends add document extraction,
model-specific token counting, rendering, media, image, desktop and VM tools.
It does not import Toolserver, and it needs no running service, database or
fleet.
Distribution hugpy-tools 0.2.11, import hugpy_tools. It has no runtime
dependencies.
Status: LIVE. It is installed as a library in the Core, Agent and Harness
environments, and in the Toolserver host venv at
/opt/abstract-toolserver/venv-0.0.99. Toolserver uses the staged 0.2.11
source for its media tools. It runs no service of its own. Its consumers:
abstract_toolserver0.0.98 and later: the tool registryhugpy-agenthugpy-harness:hugpy_harness.tools.portable- the media, video and agent toolsets:
hugpy_tools.schema.build_parameters, imported lazily
The live 7004_toolserver service runs abstract_toolserver 0.0.99. See
docs/packages.md.
Standalone use
pip install hugpy-tools
hugpy-tools list [--optional] # every tool: name, description, inputSchema (JSON)
hugpy-tools call text_estimate_tokens --arguments '{"text":"hello world"}'
# The same CLI is available as python -m hugpy_tools.
from hugpy_tools import call_tool, get_toolset, list_tools
result = call_tool("fs_read_lines", {"path": "/tmp/example.txt", "start": 1, "end": 20})
schemas = list_tools() # name, description, inputSchema
tools = get_toolset() # category -> route -> callable; fresh mappings per call
Direct module functions remain available. include_optional=True adds backend
tools to each registry API, or use --optional with the CLI. Discovery imports
no optional backend; an unavailable dependency fails when that tool is called.
Install only the extras needed: files, text, web, legacy (all three),
render, images, vision, media, or desktop. Rendering also needs a
Playwright browser installation; VM operations require host libvirt/LXD tools.
Toolserver integration
The dependency runs one way: abstract_toolserver imports hugpy_tools.
The optional media tools call the authoritative hugpy-media API through
backends.media_proxy (default http://127.0.0.1:7340/api, overridable with
HUGPY_MEDIA_API_URL). Toolserver and /media therefore share the same Media
routes for Whisper, vision, extraction, summaries and the other inference
operations; model placement and task selection stay in Hugpy Media/Core.
| This package owns | Toolserver adds |
|---|---|
| Portable implementations, backend adapters, registry, and input schemas | HTTP/MCP transport, authentication, and discovery |
| Local screenshot rendering, image operations, grid math, and aiming helpers | Hosted screenshot URLs, cleanup, and fleet vision routing |
| Explicit local execution | Command allowlist, node delegation, and session context |
Boards, handoffs, credentials, database records, and managed browser/VM sessions
remain Toolserver services. process.run_command(argv) is available directly;
Toolserver exposes it through its allowlist-gated sys_run_cmd adapter.
compat.py preserves established Toolserver arguments and backend results where
the native helpers have different contracts. For example, text_estimate_tokens
is approximate and dependency-free; optional text_count_tokens retains the
model_name argument and model-specific backend. fs_read_text returns metadata
and text; fs_read_file retains the text-only result. Old Toolserver visual
imports alias the portable modules, so there is one implementation to maintain.
The imports/ layer
hugpy_tools/imports/ is the reference for the workspace-wide imports/
layout (docs/packages.md).
Importing it performs no I/O and loads no optional backend:
| module | contents |
|---|---|
constants.py |
static defaults: DEFAULT_COMMAND_TIMEOUT, DEFAULT_VM_URI, DEFAULT_RENDER_TIMEOUT_MS |
functions.py |
lazy("module:attr") (import on first call, so a missing backend raises ToolError instead of breaking startup), first_lazy(*paths), strip_remote_kwargs(kwargs) |
classes.py |
ToolError |
init_imports.py |
one-stop: json, logging, os, re, sys, time, C (the constants) and the shared names |
from hugpy_tools.imports import constants as C
from hugpy_tools.imports.functions import lazy
from hugpy_tools.imports.classes import ToolError
from hugpy_tools.imports.init_imports import * # the house one-stop surface
Other shared modules: schema.build_parameters(func) builds a JSON-schema
inputSchema from a function signature, and toolset.get_toolset(),
list_tools() and call_tool() are the registry.
Built-in tools
Every fs function takes an already-confined absolute path — call
paths.confine(root, path) first to enforce a workspace jail (rejects ..,
absolute-outside, and symlink escapes in one check).
| Module | Function | What it does |
|---|---|---|
paths |
confine(root, path, for_write=False) |
Resolve a path under root; raise PathEscape on any escape. |
paths |
file_parts(path) |
Decompose into dir/base/name/ext + two enclosing dir levels. |
paths |
sanitize_filename(name) |
Reduce to one safe path component, length-bounded. |
fs |
read_text(path, max_bytes=None) |
Read with encoding detection (BOM → utf-8 → cp1252). |
fs |
read_lines(path, start, end, number=False) |
1-based inclusive line-range read. |
fs |
atomic_write(path, content, append=False) |
Durable write (temp file + os.replace); append supported. |
fs |
edit_replace(path, old, new, count=None) |
Exact string replace with an occurrence-count contract; atomic. |
fs |
file_info(path, hash_files=False) |
Size, mtime, type, symlink flag, optional sha256. |
fs |
list_dir(path, glob=None, ...) |
Immediate entries (dirs first), optional fnmatch. |
fs |
tree(path, max_depth=3, max_entries=500) |
Bounded recursive tree text (never follows dir symlinks). |
hashkit |
sha256_text / sha256_file / quick_hash |
Content hashing (files streamed in 1 MiB windows). |
text |
count_tokens(text) |
Dependency-free approximate BPE token count. |
text |
chunk_by_lines / chunk_by_tokens |
Chunk on line or token budgets (paragraph-aware). |
text |
unified_diff(before, after) |
Unified diff between two texts. |
data |
read_data(path, fmt=None) |
Parse JSON always, TOML via stdlib tomllib, YAML if PyYAML present. |
data |
write_json(path, obj) / safe_json_dumps(obj) |
Atomic JSON write / non-exploding dumps. |
timekit |
now_iso / now_epoch / epoch_to_iso / iso_to_epoch |
UTC time conversions. |
web |
assess_webpage(url, ...) |
assessManager-parity structured page assessment over urllib + html.parser. |
web |
prescreen_webpage(url, ...) |
Cheap title + description + lede relevance pre-screen. |
Web assessment
assess_webpage returns the same dict shape as
abstract_webtools.assessManager.assess_webpage
({url, title, description, text, metadata, jsonld, links, truncated, render})
plus additive keys final_url, status, canonical, lang, headings, and
error. The fetch is http(s)-only, refuses redirects to other schemes,
disables file:// / ftp://, caps the body, times out, handles gzip/deflate,
and detects charset (Content-Type → BOM → <meta charset> → utf-8 → cp1252).
JS rendering is opt-in and lazy: force_render=True (or an automatic fall-back
when the cheap fetch yields almost no text) drives a headless browser only if
Playwright or Selenium is installed, and raises a clear "install X" error
otherwise. The default path never needs a browser.
Layer
Foundation. Core imports use only the standard library. Optional integrations
are loaded on use from compat, backends, and visual; they must not import
abstract_toolserver. The host owns authorization and resource lifecycle.
Metadata
Release files for hugpy-tools 0.2.12
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| hugpy_tools-0.2.12.tar.gz | 82.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hugpy_tools-0.2.12-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 160.1 kB
Release files / hugpy_tools-0.2.12.tar.gz
| Download URL | hugpy_tools-0.2.12.tar.gz |
|---|---|
| Size | 82.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ae7054cb050a452459c01924d2075d244168f90e6d60eede9de307ebaf42068e
|
|
BLAKE2b-256 checksum How to use checksums |
8b827c9337a870087eda827578c7c6150043f7c05766454cf4c180286dc5356e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / hugpy_tools-0.2.12-py3-none-any.whl
| Download URL | hugpy_tools-0.2.12-py3-none-any.whl |
|---|---|
| Size | 77.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
be74b25b73c8d3625cb498b726089c7cb48b4abc837cddc031728d118b16eee9
|
|
BLAKE2b-256 checksum How to use checksums |
420e4416133a652882d7cd1e96e0cc30a2be0a38607c70d64edb33b02975f25e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Security for hugpy-tools 0.2.12
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.