gen-worker
Python SDK for writing endpoints that run on Cozy's worker pool. You write one decorated function or class; the SDK handles discovery, scheduling, model download + placement, cancellation, file I/O, streaming, and reporting back to the control plane.
Install
pip install gen-worker[torch] # for PyTorch inference/training
pip install gen-worker # plain Python (e.g. API-proxy endpoints)
Optional extras: [images] / [audio] / [video] for media I/O,
[vision] for torchvision.
Hello world
pyproject.toml — the one config value:
[tool.gen_worker]
main = "myendpoint.main"
main.py:
import msgspec
from gen_worker import RequestContext, endpoint
class Input(msgspec.Struct):
prompt: str
class Output(msgspec.Struct):
text: str
@endpoint
def echo(ctx: RequestContext, payload: Input) -> Output:
return Output(text=f"got: {payload.prompt}")
Run it locally, no orchestrator:
gen-worker run --payload '{"prompt": "hello"}'
cozyctl build / cozyctl deploy take it from here — the full path to a
deployed, billed endpoint is tensorhub docs/writing-endpoints.md.
Adding a model
Hold state in a class: setup() runs once, every public method is one
routable function. The worker downloads the binding, constructs the pipeline
from the setup() annotation, and owns device placement + low-VRAM offload —
endpoint code never touches .to("cuda") or offload config.
from diffusers import StableDiffusionXLPipeline
from gen_worker import HF, RequestContext, Resources, endpoint
@endpoint(
model=HF("stabilityai/stable-diffusion-xl-base-1.0", dtype="bf16"),
resources=Resources(gpu=True),
)
class Generate:
def setup(self, pipeline: StableDiffusionXLPipeline) -> None:
self.pipeline = pipeline
def generate(self, ctx: RequestContext, payload: Input) -> Output:
view = ctx.for_request(self.pipeline, seed=42)
image = view(payload.prompt, generator=view.generator).images[0]
return Output(text=ctx.save_image(image).ref)
Resources declares only what the endpoint CANNOT run without (gpu,
gpu_count, libraries, strict_vram, vcpus); VRAM requirements are
MEASURED by the platform's profiling gate, not declared (vram_gb_hint is
an optional first-build placement hint only). Handlers are exactly
(self, ctx, payload); per-request state (sampler, seed, scheduler) lives
in a ctx.for_request view over shared weights — never assigned onto the
instance.
Bindings: HF(id, revision=, dtype=, subfolder=, files=, storage_dtype=),
Hub(ref, tag=, flavor=, storage_dtype=), Civitai(id, version=), ModelScope(id, ...).
The slot name comes from the models={} key or the setup() parameter —
never a constructor argument. storage_dtype="fp8" keeps denoiser weights in
fp8-E4M3 storage with per-layer upcast to the compute dtype (half the VRAM
on any card); fp8-stored #fp8 flavors get the same treatment automatically.
Curated checkpoint selection is a runtime payload argument: a handler declares
model: SomeModelChoice (a ModelChoice enum of Model rows, each carrying a
ModelRef binding + typed per-model defaults) and reads payload.model.defaults
typed — one generate(model=) replaces N near-identical functions. model: SomeModelChoice | ModelRef opens BYOM. Streaming = an async-generator handler.
Engine-hosted endpoints declare runtime="vllm" and get a booted,
health-checked server subprocess injected into setup().
Slot(pipeline_cls, selected_by=, default_checkpoint=) is the hub-resolved
alternative to ModelChoice: the model SET lives in platform config, not
code, and the COMPONENT TREE (pipeline.unet, pipeline.vae, ...) is
derived from the pipeline class and published to the hub — parts are never
declared as sibling slots. The per-model config SCHEMA derives from the
handler's context annotation (ctx: RequestContext[SdxlDefaults], a
gen_worker.families.GenerationDefaults vocabulary); the catalog owns the
VALUES and ctx.defaults hands the resolved recipe to the handler typed.
Full reference: docs/endpoint-authoring.md.
Public surface
- The decorator + bindings:
endpoint,Resources,Compile,HF,Hub,Civitai,ModelScope,ModelRef - Model selection:
Model,ModelChoice,ModelDefaults,Slot,ResolvedSlot,gen_worker.families.GenerationDefaults - Compile contract:
Compile,CompileAxis,AxisClass,DynamicDim,pad_text_sequence; per-request views:ctx.for_request/gen_worker.view - Contexts:
RequestContext(≤15 members),ConversionContext,DatasetContext,TrainingContext - Errors:
ValidationError,RetryableError,CanceledError,FatalError - Streaming:
BatchItemDelta,IncrementalTokenDelta,Done,Error - Value types:
Asset,ImageAsset,AudioAsset,VideoAsset - I/O codecs:
gen_worker.io
The conversion ETL (hub ingest, dtype cast / quant, clone, Tensorhub
publish) is gen_worker.convert (see docs/convert.md).
Local development
gen-worker run --payload '{"prompt": "hello"}' # one-shot in-process
gen-worker run --list # describe functions (JSON)
gen-worker serve # warm local server
gen-worker invoke <fn> prompt=hello # client for serve
gen-worker prefetch # weights only, no GPU
stdout for results, stderr for events; exit 0 / 1 / 2 / 3 / 130 for success / user-exception / usage / model-resolution / SIGINT. Details: docs/local-dev.md; host contract: docs/host-integration.md.
Running tests
uv run --extra dev pytest
Plain uv run pytest would fall through to a global launcher — always pass
--extra dev. Never pip install gen-worker globally: a stale
~/.local install silently shadows the working tree (tests/conftest.py
hard-fails if gen_worker resolves outside src/).
Documentation
- docs/endpoint-authoring.md — the
@endpointreference: bindings, variants, Resources, contexts, streaming, runtimes. - docs/local-dev.md — the CLI:
run/serve/invoke/prefetch,field=valuegrammar,--offline, exit codes. - docs/dockerfile.md — bring-your-own-Dockerfile contract.
- docs/endpoint-envs.md — tenant envs/secrets.
Examples
examples/marco-polo/— minimal inference endpoint (sync, async, streaming)
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gen_worker-0.67.0.tar.gz.
File metadata
- Download URL: gen_worker-0.67.0.tar.gz
- Upload date:
- Size: 805.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e51faf96ab8381141653968f23a2a0b9470362673579897a773cddeb18a7dc3d
|
|
| MD5 |
cffaffad3e0bdc8c8163add3fdc90d3a
|
|
| BLAKE2b-256 |
e5a5a489dae0dbd9a158e8b32b4dbc4d68ac60b6b5092312caa8fb175cdfee84
|
Provenance
The following attestation bundles were made for gen_worker-0.67.0.tar.gz:
Publisher:
publish.yml on cozy-creator/python-gen-worker
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gen_worker-0.67.0.tar.gz -
Subject digest:
e51faf96ab8381141653968f23a2a0b9470362673579897a773cddeb18a7dc3d - Sigstore transparency entry: 2255433080
- Sigstore integration time:
-
Permalink:
cozy-creator/python-gen-worker@f5360fd837c153d996bc07d10bc8dbf957dcb2e7 -
Branch / Tag:
refs/tags/v0.67.0 - Owner: https://github.com/cozy-creator
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f5360fd837c153d996bc07d10bc8dbf957dcb2e7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file gen_worker-0.67.0-py3-none-any.whl.
File metadata
- Download URL: gen_worker-0.67.0-py3-none-any.whl
- Upload date:
- Size: 894.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
10cd1df42bb4fc72e7ce808a74e3f530c9b5778ad9225d04be07ab03914a75c2
|
|
| MD5 |
97fad665a8ecd51d23976c9c16340f7c
|
|
| BLAKE2b-256 |
c6de6dce3c77f519c849fbe8c980dfb1a96803d793bbbde9155fead0d520f4bd
|
Provenance
The following attestation bundles were made for gen_worker-0.67.0-py3-none-any.whl:
Publisher:
publish.yml on cozy-creator/python-gen-worker
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gen_worker-0.67.0-py3-none-any.whl -
Subject digest:
10cd1df42bb4fc72e7ce808a74e3f530c9b5778ad9225d04be07ab03914a75c2 - Sigstore transparency entry: 2255433089
- Sigstore integration time:
-
Permalink:
cozy-creator/python-gen-worker@f5360fd837c153d996bc07d10bc8dbf957dcb2e7 -
Branch / Tag:
refs/tags/v0.67.0 - Owner: https://github.com/cozy-creator
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f5360fd837c153d996bc07d10bc8dbf957dcb2e7 -
Trigger Event:
push
-
Statement type: