§ P.02 · Hub

Content-addressed model hub.
Uploaders own the attribution.

Upload any ONNX, GGUF, or safetensors file to /hub/upload — the bytes are keccak256-addressed, stored on the filesystem or S3, and indexed by hash. A second call to /hub/models/:hash/register publishes the(hash, uploader) tuple to HubRegistry on Base Sepolia. Usage revenue can now be attributed to the uploader's address.

Hub inference (/v1/chat/completions with amodel that matches a registered hash) runs the model locally via onnxruntime (for ONNX) or a provider shim (for GGUF/safetensors). The same receipt pipeline applies — signed response, on-chain checkpoint.

There is no size cap beyond what your storage backend accepts. Models are public by default (hash is opaque but not secret); private-by-ACL support is an optional future extension.

EX.02

Upload + register

example · curl · hub upload
# 1. upload raw bytes (Content-Type: application/octet-stream)
curl -X POST https://api.plumbtech.xyz/hub/upload \
  -H "Authorization: Bearer $PLUMB_SESSION" \
  -H "Content-Type: application/octet-stream" \
  -H "X-Plumb-Model-Name: my-classifier" \
  -H "X-Plumb-Model-Framework: onnx" \
  --data-binary @my-classifier.onnx

# → {"hash":"0x75770...","sizeBytes":1023,"storageUrl":"..."}

# 2. register on-chain
curl -X POST https://api.plumbtech.xyz/hub/models/0x75770.../register \
  -H "Authorization: Bearer $PLUMB_ADMIN_TOKEN"
GUIDE

HubRegistry addresses + ABI
Python SDK hub client