Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

 loom-py

import loom

model = loom.Model.from_pretrained("loom-ai-org/gemma-3-270m-it-loom")
print(model.text2text.chat("Who discovered Brazil?"))
# 'The discovery of Brazil was made by **Hernán Cortés**.'   (one sample: this
# checkpoint declares do_sample, so pass temperature=0.0 for the same answer twice)

Two APIs, and which one you want

The high-level API is one door per task, named for the modality pair it maps between. Every model carries all of them; the ones it does not answer to say so when called, naming what it actually is.

model.text2text.infer("The capital of France is")        # -> str, a raw completion
model.text2text.chat("Who discovered Brazil?")           # -> str, asked inside a turn
model.speech2text.infer(waveform, language="en")         # -> Transcription
model.text2speech.infer("hello world")                   # -> Audio
model.text2class.infer("Wolfgang lives in Berlin")       # -> Classification, a label per token
model.text2codes.infer("[S1] Hello world.")              # -> codec tokens, frame-major
model.codes2speech.infer(codes)                          # -> Audio, the other half of that pair

Which door a model answers is read off the file, not guessed from its name:

model.task            # 'automatic-speech-recognition'
model.capabilities    # ('speech2text',)
model.text2speech.infer("hi")
# UnsupportedTask: this model is speech2text (automatic-speech-recognition), not text2speech.

Each door does the whole job, including the parts you cannot do from outside. speech2text windows audio for a model whose graph is built at one clip length, decodes with the early stop armed, splits the output into timestamped segments and seeks to where the model closed its last segment — so an utterance straddling a window edge is re-decoded whole rather than arriving as two fragments:

r = model.speech2text.infer(audio, language="en", timestamps=True)
r.text                        # the joined transcript
r.segments[0].start, .end     # seconds, whole-file
r.timestamped                 # whether those are boundaries the model chose

text2speech returns audio with its rate attached, because a bare list of floats played at the wrong rate does not fail — it plays at the wrong speed:

audio = model.text2speech.infer("hello world", steps=8, seed=1)
audio.sample_rate             # 22050
audio.save("out.wav")

text2class returns the labelled pieces beside the label set they came from, because neither is recoverable from the other — a WordPiece encode splits words, so joining the pieces back up is a rule only you can make:

r = model.text2class.infer("Wolfgang lives in Berlin")
r.labels                      # ['O', 'B-MISC', 'I-MISC', 'B-PER', ...] — every class the model has
[(t.piece, t.label) for t in r]
# [('Wolfgang', 'B-PER'), ('lives', 'O'), ('in', 'O'), ('Berlin', 'B-LOC')]

The framing tokens the encode added ([CLS]/[SEP]) are dropped for you, on the ids the file declares rather than on their spelling; strip_special=False keeps them if you want the raw alignment.

A model that speaks through a codec is two files, and the codes are what joins them. An autoregressive codec LM emits discrete tokens, not audio; a neural codec turns those tokens into a waveform. They stay separate because one codec serves many LMs, and because the codes are worth having on their own — cache them, stream them, decode them at a different rate:

codes = dia.text2codes.infer("[S1] Hello world.")   # -> [[568, 778, ...], ...] frame-major rows
audio = dac.codes2speech.infer(codes)              # -> Audio

Nothing goes between the two calls. Both files declare loom.codec.n_codebooks, so a pair that does not fit says so instead of producing audio of the wrong duration:

dia.hparam("codec.n_codebooks", "u32") == dac.hparam("codec.n_codebooks", "u32")

text2codes counts max_new_tokens in audio frames, not decoder rows — the two differ by the model's delay pattern, which is an artefact of how codebooks are written rather than anything you asked for.

The low-level API is the driver's own entry point, and stays raw. infer passes your arguments straight through, so which ones a model takes is a property of the model rather than of this package:

model.tokenize("The capital of France is")   # [1, 1098, 5706, 803, 4481, 856]
model.detokenize([1, 1098, 5706])            # '<|startoftext|>The capital'
model.infer(tokens=[16, 40, 22, 30], n_steps=4, seed=1234)   # the driver's own inputs
print(model.driver_source)                   # the Lua that will run, and what it accepts

Use it when you want a knob the high-level door does not name — VITS's noise_scale_w, a specific voice vector, a model's own second entry point. That is the boundary between the two: a knob with no canonical role is reachable through infer and nowhere else.

Text to speech, and the one step that is not in the file

Every TTS model here takes text now, but two of them get there differently. Supertonic encodes graphemes itself. The other four consume phoneme ids — and the symbol table that turns phonemes into their ids ships in the GGUF, so model.tokenizer is a real vocabulary for all of them:

model.tokenizer                      # <loom.Tokenizer 'phonemes' size=159>
model.tokenize("h\u0259\u02c8lo\u028a")             # -> ids, with the model's own BOS/blank/EOS assembly

What is not in the file is grapheme-to-phoneme, because that is a property of the language rather than of any checkpoint. It is an optional extra:

pip install "loom-py-rt[phonemes]"

With it, text2speech.infer("hello world") works on all five. Without it, passing phonemes= or tokens= works exactly as before and only the text door is absent, with an error naming the install. loom.phonemizers.register("ipa", fn) substitutes your own.

Choosing a device

A wheel built with a GPU backend uses it by default; one built without has only a CPU to find, so nothing changes.

model = loom.Model.from_file("qwen3.gguf")                  # decide for me (or $LOOM_DEVICE)
model = loom.Model.from_file("qwen3.gguf", device="cpu")    # pin it
model = loom.Model.from_file("qwen3.gguf", device="gpu")    # demand one; raises if there is none
model.device, model.device_description   # ('Vulkan0', 'AMD Radeon Vega 3 Graphics (RADV RAVEN2)')

"gpu" raises rather than falling back, because a caller who spelled it out is asking a question about the machine and a silent CPU run is how a large slowdown goes unnoticed. "auto" — the default — is the one that falls back.

The base wheel is CPU-only, and an accelerator is a separate install rather than a different wheel:

pip install "loom-py-rt[vulkan]"

That adds one small package holding one libggml-vulkan.so, which this package finds at import; device="auto" then uses it and nothing about the base wheel changes. The reason it works this way — rather than a full wheel per accelerator, which is the more familiar shape — is that a Vulkan backend is 46.5 MB and CUDA is larger, so the per-accelerator matrix does not fit PyPI's 100 MB per-file ceiling. See packaging/README.md.

loom.devices()   # [{'name': 'Vulkan0', 'description': 'AMD Radeon Vega 3 Graphics (RADV RAVEN2)', ...}]

Worth calling after installing one, because a backend whose driver is too old — or which finds no supported device — loads without error and registers nothing, and the only other symptom is a model running at CPU speed. Note that with this build every backend is loaded at run time, the CPU included, so an empty device list means no backend library was found at all rather than no accelerator.

Which ops fall back to the CPU, and why some always will, is documented in loom.cpp's own build notes.

Why there is so little API

A loom GGUF carries its own graph topologies and its own driver script alongside its weights, so this package contains no per-architecture code at all. Loading a model registers whatever topologies the file declares and attaches a KV cache to the ones that say they need it; running one calls the driver the file shipped with. A model this library has never heard of works the day loom-exporter can produce it.

That is also why infer takes **kwargs: its arguments are the driver's arguments, and which ones a model takes is a property of the model. model.driver_source prints the Lua that will run, whose header comment documents its inputs — that is the authority.

model = loom.Model.from_file("granite_speech_mil.gguf")
model.architecture          # 'granite-speech'
model.topologies            # ['encoder', 'embed', 'decoder', 'lm_head']
model.hparam("samples_per_chunk")   # 192000
print(model.driver_source)  # what infer() will run, and what it accepts

Supported models

Seventeen, published at huggingface.co/loom-ai-org and loadable by id with from_pretrained (needs the [hub] extra). This package has no per-architecture code, so the list is a property of loom-exporter, not of anything here.

Language models

Model Exported from
loom-ai-org/qwen3-0.6b-base-loom Qwen/Qwen3-0.6B-Base
loom-ai-org/lfm2-350m-monolithic-loom LiquidAI/LFM2-350M
loom-ai-org/lfm2-350m-modular-loom LiquidAI/LFM2-350M
loom-ai-org/smollm2-360m-instruct-loom HuggingFaceTB/SmolLM2-360M-Instruct
loom-ai-org/gemma-3-270m-it-loom google/gemma-3-270m-it

These are the models text2text answers to; model.generate(...) is the same call under the name it shipped with.

infer and chat are different questions. infer CONTINUES a prompt, which is what a base model does; chat puts the prompt inside a turn using the checkpoint's own chat template and asks for a reply. An instruction-tuned model handed a raw prompt behaves like a base model and continues in the prompt's own format, which reads exactly like it is repeating you back — so use chat for the instruction-tuned rows above, and infer for the base ones. model.chat_roles says which a file is: empty means it carries no template, and Gemma 3's is ['user', 'assistant'] because its template folds a system message into the first user turn rather than emitting a block for it.

Decoding follows the checkpoint's own generation_config.json — Gemma 3 ships top_k 64, top_p 0.95 and is sampled; everything else here is greedy. Name temperature, top_k, top_p or seed to override it.

Speech recognition

Model Exported from
loom-ai-org/whisper-small-loom openai/whisper-small
loom-ai-org/conformer-ctc-small-loom nvidia/stt_en_conformer_ctc_small
loom-ai-org/parakeet-tdt-0.6b-loom nvidia/parakeet-tdt-0.6b-v3
loom-ai-org/parakeet-rnnt-0.6b-loom nvidia/parakeet-rnnt-0.6b
loom-ai-org/gigaam-v3-rnnt-loom ai-sage/GigaAM-v3
loom-ai-org/qwen3-asr-0.6b-loom Qwen/Qwen3-ASR-0.6B
loom-ai-org/granite-speech-4.0-1b-loom ibm-granite/granite-4.0-1b-speech

model.speech2text.infer(waveform, language="en") — the mel frontend is inside the graph, so a raw waveform is the input, and long audio is windowed and seeked for you.

Speech synthesis

Model Exported from
loom-ai-org/kokoro-82m-loom hexgrad/Kokoro-82M
loom-ai-org/matcha-tts-ljspeech-loom Matcha-TTS (LJSpeech checkpoint)
loom-ai-org/supertonic-2-loom Supertone/supertonic-2
loom-ai-org/vits-piper-en-gb-miro-loom OpenVoiceOS/pipertts_en-GB_miro
loom-ai-org/styletts2-ljspeech-loom yl4579/StyleTTS2-LJSpeech

All five take text through model.text2speech.infer(...); the four phoneme-input ones need the [phonemes] extra for the G2P step (see above), and every one of them accepts phonemes= or tokens= without it. Kokoro and Supertonic ship a default voice, so a published file speaks on its own. model.driver_source is the authority on what each driver accepts.

The three repos

loom.cpp the engine, vendored here as a submodule
loom-exporter produces the GGUFs this runs
loom-py this one

Installing

pip install loom-py-rt           # once published -- `loom-py` on PyPI clashes with `loompy`,
                                  # and `loom-engine` normalizes to the already-taken `loomengine`
pip install loom-py-rt[hub]      # + from_pretrained()

Supported platforms

CPython 3.10–3.13, on:

Platform Wheel tag Covers
Linux x86-64, glibc ≥ 2.28 manylinux_2_28_x86_64 anything not already EOL
Linux aarch64, glibc ≥ 2.28 manylinux_2_28_aarch64 Raspberry Pi 4 and 5 on 64-bit Raspberry Pi OS, Jetson/Grace, Graviton, Ampere
macOS on Apple Silicon, ≥ 14.0 macosx_14_0_arm64 M1 through M4, verified on an M1 Pro
macOS on Apple Intel, ≥ 14.0 macosx_14_0_x86_64 built and imported in CI — see below

There is no per-CPU choice to make. The wheel ships every libggml-cpu-*.so variant ggml builds for the architecture and picks one at import by scoring each against the CPU's own feature flags, so the same file serves the oldest and newest machine on its architecture. loom.devices() is how you check it worked.

Why macOS 14 and not 11. It is not an arbitrary floor and it is not the newest thing that happened to build. ggml's BLAS backend is compiled against Accelerate's new BLAS interface, whose symbols arrive in macOS 13.3 — and that backend is worth 1.80x on whisper-small, so dropping it was the worse trade. An 11.0-tagged wheel would install on macOS 11 or 12 and then quietly have no BLAS, because a backend that fails to dlopen is skipped silently. The floor is the honest version of what the binaries already require — 14 rather than 13.3 only because a wheel tag carries no minor version above macOS 11, so 13.3 is not a thing a wheel can say.

Apple Silicon and Apple Intel are not equally supported, and the table means two different things by "covers". The arm64 wheel is built, installed and exercised on a real M1 Pro — the apple_m1 rung, which is the lowest of ggml's three Apple rungs and so the one every arm64 wheel has to serve. Apple Intel is CI-only: it is built and imported by a runner and nobody here owns the hardware, so treat it as best-effort rather than as parity.

Metal is a separate package, not part of the macOS wheelpip install "loom-py-rt[metal]". It is only 0.87 MB, so that split is not about size: a GPU outranks the CPU when you let the library choose a device, and on unified memory that ranking is not reliably right. Measured on an M1 Pro, whisper-small is 1.76x faster on Metal and VITS is 1.79x slower — so which way it goes still depends on the model, and asking for the package is how you opt into that trade. loom.devices() shows what you got.

Raspberry Pi. A 64-bit OS is the requirement, and the only one: uname -m must say aarch64. On 32-bit Raspberry Pi OS pip reports armv7l, matches no wheel, and falls back to building the sdist, which does not work — the build enables GGML_CPU_ALL_VARIANTS, whose Linux-ARM variant list is AArch64-only. 32-bit is not a slower configuration here, it is an unsupported one.

Which variant a board loads, verified under QEMU on every release by raspberry-pi-check in .github/workflows/wheels.yml:

Board Core Loads Because
Pi 4 / 400 / CM4 Cortex-A72, ARMv8.0-A armv8.0_1 no dotprod, no FP16 arithmetic, no SVE — the other seven variants score 0
Pi 5 / CM5 Cortex-A76, ARMv8.2-A armv8.2_2 dotprod + FP16, no SVE

Nothing extra is installed on a Pi: the CPU is the backend. [vulkan] does resolve on aarch64 and a Pi 5's V3D exposes Vulkan through Mesa, but no measurement here says that is worth doing — the CPU path is the supported one.

Windows has no wheels, and a source install does not currently work there. macOS does: both Apple architectures build from a checkout as well as from a wheel — see Supported platforms above. (Epic-08)

From a checkout — note --recursive, since the engine is a submodule:

git clone --recursive https://github.com/loom-ai-org/loom-py
cd loom-py && pip install -e .

No runtime dependencies. Arrays cross the boundary as plain sequences of floats, so numpy is something you may use rather than something this package makes you install — list, array.array, numpy arrays and torch tensors all work.

Testing

pytest tests/ci      # the Python layer: coercion and error paths. No model. What CI runs.
pytest tests/gate    # a real exported GGUF, end to end.
export LOOM_TEST_MODEL=~/loom-fixtures/matcha_mil.gguf
export LOOM_TEST_MODEL_INPUTS='{"tokens":[16,40,22,30,12,3],"n_steps":4,"seed":1234}'
pytest tests/gate -q

The gate suite is written against no particular architecture on purpose: it asserts the shape of what a loom model is, which is the whole of what this package knows. A test that expected one model's inputs would be this package learning about a model, which is the thing the design exists to avoid.

Roadmap

Shared with loom.cpp, because three of the four are the engine's and this package inherits them by having no per-architecture code of its own.

1. GPUs and NPUs — the packaging is built; the backends beyond Vulkan are what remain. The engine schedules a graph across a device backend and a CPU fallback, this package exposes the choice as device= (above), and the wheel shape that lets an accelerator ship at all now exists.

The shape that is NOT wanted is a wheel per accelerator per architecture — PyPI's wheel tags have no accelerator dimension, so that is torch's cu121 arrangement, and it multiplies every future backend by every existing platform. GGML_BACKEND_DL makes the better shape possible and this package is now built that way: one arch-tagged base wheel, plus small backend packages that drop a .so where ggml looks for it, so pip install "loom-py-rt[cuda]" means "also fetch that backend", device="auto" finds it, and a Raspberry Pi installs nothing extra. packaging/rt-vulkan/ is the worked example; a CUDA package is that directory with two strings changed, waiting only on a machine with an NVIDIA GPU to build and test against. Tracked in Epic-04, along with which backends are reachable at all (CUDA, OpenVINO and Qualcomm's are already in the pinned ggml; CoreML and RKNPU2 are not).

2. Wheels for more platforms. Linux x86-64 and aarch64 and both Apple architectures today — see Supported platforms above, which is what pip install loom-py-rt resolves to. Windows is what remains, and it is behind the same kind of work macOS needed: not a missing CI row, but a symbol-visibility rule, a linker-path spelling and a build-system assumption that each differ (Epic-08, Retro-024).

3. More models — Epic-03, ordered by coverage per unit of effort: BERT token classifiers (the smallest possible template, and the first non-audio task) → codec decoders → CNN+CTC and SANM encoders → the remaining TTS families → text encoder-decoders → small classifiers → music. Each lands here for free: a model this package has never heard of works the day the exporter can produce it.

4. The follow-ups the docs already namedocs/backlog/active-index.md is the ledger for all three repos and the authority. The ones that would show up in this API: a permissively-licensed phonemiser, which is what would give the four phoneme-input TTS models a tokenize; and the KvCache memory redesign and quantized KV cache, which decide how large a model this can run on a given machine.

Licence

MIT — see LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

loom_py_rt-1.0.0rc8.tar.gz (2.5 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

loom_py_rt-1.0.0rc8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

loom_py_rt-1.0.0rc8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (4.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

loom_py_rt-1.0.0rc8-cp313-cp313-macosx_14_0_x86_64.whl (8.6 MB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

loom_py_rt-1.0.0rc8-cp313-cp313-macosx_14_0_arm64.whl (2.2 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

loom_py_rt-1.0.0rc8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

loom_py_rt-1.0.0rc8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (4.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

loom_py_rt-1.0.0rc8-cp312-cp312-macosx_14_0_x86_64.whl (8.6 MB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

loom_py_rt-1.0.0rc8-cp312-cp312-macosx_14_0_arm64.whl (2.2 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

loom_py_rt-1.0.0rc8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

loom_py_rt-1.0.0rc8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (4.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

loom_py_rt-1.0.0rc8-cp311-cp311-macosx_14_0_x86_64.whl (8.6 MB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

loom_py_rt-1.0.0rc8-cp311-cp311-macosx_14_0_arm64.whl (2.2 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

loom_py_rt-1.0.0rc8-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (8.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

loom_py_rt-1.0.0rc8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (4.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

loom_py_rt-1.0.0rc8-cp310-cp310-macosx_14_0_x86_64.whl (8.6 MB view details)

Uploaded CPython 3.10macOS 14.0+ x86-64

loom_py_rt-1.0.0rc8-cp310-cp310-macosx_14_0_arm64.whl (2.2 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

File details

Details for the file loom_py_rt-1.0.0rc8.tar.gz.

File metadata

  • Download URL: loom_py_rt-1.0.0rc8.tar.gz
  • Upload date:
  • Size: 2.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for loom_py_rt-1.0.0rc8.tar.gz
Algorithm Hash digest
SHA256 c5072e420f419b1c9004a9afd18866fdd4d9eb6204d766bd6e6fb6b3c602ea00
MD5 c89050b3db813eed910409344409494c
BLAKE2b-256 9fa40e3b68b113c36cbad580a2c591e46dbd766bda3f503b84e107b4f6bc6ecf

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8.tar.gz:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8c703390e5820c60803af75dc31c490b038ba7dd585100cb5848abcbe53c7952
MD5 0f61273effb42c6bff2b4126fe7f8d2e
BLAKE2b-256 e3fb46f12750ed41e99bc67ac1ff4ae7f052c7d4389d661858930315dcdeb46c

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 78891b5c3cbca0d03ef0185e357310cfa32ef22c4888d0cb9fa686a1bdfc1307
MD5 00999a5525033f1e187abb8732304b33
BLAKE2b-256 741681ab761c8e75a071cdcb49887841151a2db91eb65ff614af4412807dd207

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp313-cp313-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 ef39c02b51e9cebbe6aecc472c67279fed9eb5945f30d8af1a2f999a9a8144c2
MD5 d6ef01e56b0b1f9ecadcf89518ef5f0b
BLAKE2b-256 a8795b75eac3fa6a44e5a8d99f79f024bfa5c8c9fe861c90b1d86e7d07572877

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp313-cp313-macosx_14_0_x86_64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 e1283dc54a7085dc5793f998c6a194bb386b6aefb99e49860fc7cf208f05d40d
MD5 8552ffeb8329b1c0b66b707969c9b98b
BLAKE2b-256 23dc8e3683b02ba466a812c3363bdc8ab44b2c3d7a1693ba671ac6386402642e

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8a14fa85424f21215170082a0bf256d98a0d821db900779cce224f56a06ba990
MD5 8c690cfa9c71f1cb614803c4fc8e625d
BLAKE2b-256 e41a063878361c9948b8075a571750640f98a21cd330dae5758280bb24d709f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 791864238dc264c3809e71ba3b8dfefc2c4d234e9eab194371bcf40d3af5c9b8
MD5 bb86b39e718f7815a60d47c844543c4d
BLAKE2b-256 a87c026e3f58541ffdbf601709cc371d9905f213c44d4b2683f48492deb5db7a

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp312-cp312-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 77d59c7198518916206fc090d17e99de78881905f1c3f56d876fe94a08133815
MD5 e498f79a7058de18bd3b19c253028ce9
BLAKE2b-256 dae75fab04552c322d0ddc522555525ec438c6590f0a552ec95b947d57d7abe5

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp312-cp312-macosx_14_0_x86_64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 370c85f42b18d7cffa24bef423c2c4553d5c68034c4af43b53213ec354022671
MD5 d72ee896c1f3ea5e39b31a027dc5fc8f
BLAKE2b-256 bb22cde0770e36a56e4b28cef975ce6e0db5df76745b671c5a871f512e5a8f5d

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 165bd6b387726bc053850d6ca431c434497e01dd6b8d9d69f942220de21d3473
MD5 970506d7a760526dabd140ea2f892f33
BLAKE2b-256 f389e1ce6c8a3387a2fd9d937b7c667d7653bed2f1e30eeef3ee2c1629eb1976

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9e834d4aab445b7c65c82fa17e850ce2b2021badabdcfe6a29e8ce3a9989249b
MD5 661db5028c3eff217f6a30f4a90b41a3
BLAKE2b-256 04c4ceff31226075bbea3d322ee90b716d4e601136e6ea4669a8f4802f90aeb2

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp311-cp311-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 fa286c103b8a1e9062991e988fef2aa25945fe59db24659c8c312cfe4e8b7a55
MD5 aa96d081dbb007b3f479d81a0466e950
BLAKE2b-256 027b3a7053aedb4f73866f28aa708a042918a65ea51424d7ed5cb1e21648576b

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp311-cp311-macosx_14_0_x86_64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 d5d7fd030227845e49c7c7bef33c3144d28e3724d24a4735d0bb36b3e92af511
MD5 87fbccf999dde225f256a58c8644406b
BLAKE2b-256 b3440f72464fa0a09945aeb8035f8d67400975164cea4d959ffdbc801ea11bb3

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp311-cp311-macosx_14_0_arm64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5e1a2d87619a90b032e9a90667b8ffb88e98d2d553e5a30d84255dc4fbc202fb
MD5 f886a084497c62d535ae0c6bc465f148
BLAKE2b-256 9b41b228cac727061662b53fe56b2ae773973e1a973b6e2a4429514f5ba8e842

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 493458931686c6eea52363c96e7273bcee6fc28865d7bc8bf68c7420b9649367
MD5 7ecdc8fc21378271af81dd24d13f3f68
BLAKE2b-256 fd5d55c8a52389f5b6a884c85d9e88f730aa30b2229eeccee08a784bc88640ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp310-cp310-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp310-cp310-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 aeccecd022e163f0bcdda21e023a16142e8b26f83fc3cdcbffc9f2b3f0eea176
MD5 a9a65debf96c6b2693d241e68b46acb5
BLAKE2b-256 3007ede5c3bd57ce196b43be9f50b3def84542d739f43233526e2ea255c28d84

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp310-cp310-macosx_14_0_x86_64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file loom_py_rt-1.0.0rc8-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for loom_py_rt-1.0.0rc8-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 8184bd63ebdc412d20502b7e163c6fad27e9e0b9b150b7ee3b0655e8debe45c4
MD5 694ac7cf8b3f65b6a3e98d8458d110ea
BLAKE2b-256 d6f95c3aab176ecc2e19a5689906323d23960ead79f625653e49e3059d4ef23b

See more details on using hashes here.

Provenance

The following attestation bundles were made for loom_py_rt-1.0.0rc8-cp310-cp310-macosx_14_0_arm64.whl:

Publisher: wheels.yml on loom-ai-org/loom-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page