A library used to build custom functions in Cozy Creator's serverless function platform.
Project description
gen-worker
Python SDK for writing endpoints that run on Cozy's worker pool. You write a decorated function, the SDK handles discovery, scheduling, model loading, cancellation, file I/O, streaming, and reporting back to the control plane.
Three endpoint kinds:
- Inference — request/response, optionally streaming.
- Training — long-running, stateful, periodic checkpoints.
- Conversion — produces weight artifacts on a destination repo.
Install
pip install gen-worker[torch] # for inference with PyTorch
pip install gen-worker # plain Python (e.g. API-proxy endpoints)
Optional extras: [images] for gw.io.read_image / write_image,
[audio] for gw.io.read_audio, [trainer] for trainer-class endpoints.
Minimum viable endpoint
Three files. Any base image. No model injection, no fancy decorators.
endpoint.toml (5 lines for CUDA, 4 for CPU):
schema_version = 1
main = "myendpoint.main"
[[build.profiles]]
name = "default"
accelerator = "none"
Dockerfile (your choice of base, your build steps):
FROM python:3.12-slim
WORKDIR /app
COPY . /app
RUN pip install -e .
RUN mkdir -p /app/.tensorhub \
&& python -m gen_worker.discovery > /app/.tensorhub/endpoint.lock
ENTRYPOINT ["python", "-m", "gen_worker.entrypoint"]
main.py:
import msgspec
from gen_worker import RequestContext, inference_function
class Input(msgspec.Struct):
prompt: str
class Output(msgspec.Struct):
text: str
@inference_function
def run(ctx: RequestContext, payload: Input) -> Output:
return Output(text=f"got: {payload.prompt}")
That's it. cozyctl endpoint deploy (or the platform UI) takes it from here.
Adding a model
Declare model dependencies on the decorator's models={...} kwarg. The worker
loads and caches each binding; your function receives the live instance.
from diffusers import StableDiffusionXLPipeline
from gen_worker import Repo, Resources, inference_function
sdxl = Repo("stabilityai/stable-diffusion-xl-base-1.0")
@inference_function(
resources=Resources(requires_gpu=True, min_vram_gb=12.0),
models={"pipe": sdxl.flavor("bf16")},
)
def generate(ctx, pipe: StableDiffusionXLPipeline, payload: Input) -> Output:
images = pipe(payload.prompt).images
return Output(image=gw_io.write_image(ctx, "out", images[0]))
Resources is the per-function hardware envelope plus dynamic cost shape (used
by the orchestrator for placement and admission). Repo(ref).flavor(name) is
the binding — see docs/endpoint-authoring.md for
the full grammar.
Three binding shapes
Fixed pick — function pins one specific (repo, flavor?, tag?):
models={"pipe": Repo("acme/flux").flavor("bf16")}
Dispatch pick — payload-driven, keyed by a Literal[...]-typed field:
from typing import Literal
class Input(msgspec.Struct):
variant: Literal["nf4", "int8"]
prompt: str
@inference_function(
resources=Resources(requires_gpu=True, min_vram_gb=14.0),
models={"pipe": dispatch(
field="variant",
table={
"nf4": flux.flavor("nf4"),
"int8": flux.flavor("int8"),
},
)},
)
def generate(ctx, pipe, payload: Input) -> Output: ...
Override-allowed — caller may substitute the default, subject to a pipeline-class allowlist the tenant declares:
models={"pipe": flux.flavor("bf16").allow_override(StableDiffusionXLPipeline)}
The caller then sends {"prompt": "...", "_models": {"pipe": "acme/my-finetune:prod#bf16"}}
to substitute. Class mismatch → request rejected before dispatch.
Public surface
Top-level gen_worker exports only what endpoint authors need:
- Decorators + bindings:
inference_function,Resources,Repo,Dispatch,dispatch - Context types:
RequestContext,ConversionContext,DatasetContext,TrainingContext - Value types:
Asset,Tensors,Compute,LoraSpec - Errors:
ValidationError,RetryableError,FatalError,ResourceError,AuthError,CanceledError,OutputTooLargeError,InputTooLargeError,WorkerError - Helpers:
Clamp,iter_transformers_text_deltas,load_loras,apply_low_vram_config,with_oom_retry - I/O codecs:
gen_worker.io(read_image,read_audio,write_image,read_bytes,open,exists)
Training and conversion live in their own submodules: gen_worker.trainer,
gen_worker.conversion, gen_worker.clone.
Documentation
- docs/endpoint-authoring.md — full reference: the
three layers,
Resources, bindings,dispatch,allow_override, multi-param injection, the_modelsenvelope, atomic substitution. - docs/endpoint-toml.md —
endpoint.tomlreference: build modes, placement fields, build hints,BASE_IMAGEinjection. - docs/dockerfile.md — the three Dockerfile contract
points, when
ARG BASE_IMAGEmatters, multi-profile builds. - docs/scaling-hints.md —
Resourcescost-shape fields used by the orchestrator for admission and scheduling. - docs/endpoint-envs.md — tenant-defined envs/secrets attached to a deployed endpoint at runtime.
Examples
Working endpoints to copy from in examples/:
marco-polo/— minimal inference endpointmedasr-transcribe/— audio transcription with a Hugging Face modelopenai-codex/— text generationtraining-smoke/— minimal trainerfrom-scratch/— boilerplate template
Project details
Release history Release notifications | RSS feed
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.7.4.tar.gz.
File metadata
- Download URL: gen_worker-0.7.4.tar.gz
- Upload date:
- Size: 421.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4824ca77ebcc1ebd616ce00038e855bd80d9e89786cf570d31f9a72955577a5d
|
|
| MD5 |
9066a3e6041680ff030f9730f1330ac1
|
|
| BLAKE2b-256 |
2b11c0fc9c90638a6c80105cc8d673c55bb4358f0dca7816a825bc3c0e340a28
|
File details
Details for the file gen_worker-0.7.4-py3-none-any.whl.
File metadata
- Download URL: gen_worker-0.7.4-py3-none-any.whl
- Upload date:
- Size: 477.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
06554ef5a69f7281876d90e4f0090fb5bef62e57e2a1116d9abc16aefe3545c8
|
|
| MD5 |
ad0e9715c8db98ef37660ea00a50328e
|
|
| BLAKE2b-256 |
58def081dd949343d94d872feed0bdb124a5d2109051ba0172a1639b2d6097ac
|