Skip to content

v1.4.2 - 2026-09-20

Choose a tag to compare

@github-actions github-actions released this 20 Sep 14:50
21deafe

Release Notes

A model that does not generate can be served. laya answers typed questions with calibrated probabilities and never emits a token, and getting it onto the shelf meant finishing the manifest runtimes: a recipe for a model nothing built in can run, which now loads, waits for an approval given from the terminal, and serves. On top of that the gateway speaks TypeSafe's System One, so a client written against the hosted API reaches the local model by changing two environment variables.

  • Manifest runtimes load. A directory under runtimes.d in the data dir, holding a manifest.toml beside its entrypoint and lockfile, becomes a runtime: a sidecar for [serve], a one-shot command for [invoke]. A manifest bids last, so it only ever takes a model nothing built in would. A manifest that fails to load is reported by hedos scan and hedos runtimes rather than dropped, and a [vm] manifest is refused with the reason, since this build has no VM to contain it and would otherwise have run it on the host. A model identification can say nothing about takes its modality and capabilities from the manifest that wins it, and gives them back when that manifest stops bidding.
  • hedos runtimes is the consent a manifest runtime waits on. A manifest runs code on this machine, so it neither bids nor serves until approved. Bare, the command lists every runtime, what it serves, where its approval stands and which models it would take; approve <id> shows what is being agreed to and asks, refusing a pipe without --yes; revoke <id> takes it back. The approval is bound to a hash of every file in the runtime's directory, so editing the Python asks again. What a manifest declares about paths and network is shown as its own account: nothing here sandboxes it, and the card says so. hedos ls names the command under the table when a model is waiting on one.
  • laya runs. convaiinnovations/laya is a ModernBERT encoder with a decision head that answers choice, score and noul questions in one forward pass; it sat on the shelf unresolved. A shipped python:laya runtime serves it, on the GPU where the model's own loader would have settled for the CPU, and it goes through the same approval as a runtime of your own. The runtime executes the inference code the model ships, but only the exact bytes it pins by hash, so a later snapshot cannot bring new code in under an old approval. Over chat the question is JSON in the user message and the judgment is JSON in the reply; prose is refused with what a question looks like.
  • The gateway serves TypeSafe's POST /v1/systemone. Set TYPESAFE_BASE_URL=http://127.0.0.1:43367 and TYPESAFE_DEFAULT_MODEL=laya and a TypeSafe SDK reaches the local model unchanged. The question reaches the model as the text the client wrote, never re-encoded: the order of a choice's options changes the probabilities it gets, and the same question measured 0.90 in the client's order and 0.84 sorted. Only a model declaring the new judge capability answers (hedos ls --capability judge); any other name, the SDK's default jev-latest included, is refused with the names that would do rather than answered by something else. Errors carry their reason in error.message, where the SDK reads it, and a bearer token is ignored as on every route. The SDK gives up after 10 seconds and a cold model takes longer to load, so hedos warm laya first.
  • A runtime can say a failure was the request's fault, and the gateway answers it as a 400 instead of a 500. Clients that retry server errors were sending a request the model had refused, such as a choice with more options than laya has room for, three times over.
  • The runtime bundles inside the binary no longer carry whatever a test run left beside them. Bytecode caches, coverage profiles and the linters' cache directories were being packed in and written out on every machine.
  • A paste into any prompt (hedos pull's search, the model picker, a yes/no question) is drawn once. The terminal dropped back to line mode between every two keys, so in tmux a pasted URL came out once per character, each copy a character shorter than the last. The prompt now holds the terminal for its whole life, and a Ctrl-C at one still leaves a shell that echoes.
  • hedos pull fetches the config and tokenizer of a repo that keeps them in subdirectories, which used to arrive as weights nothing could load at a full progress bar. A subtree carrying weights of its own is an alternative checkpoint and is left alone, which for laya is the difference between 816 MB and 2.5 GB. A model in a form nothing here runs (rust_model.ot, .onnx, .tflite) no longer rides along as a support file.

Install hedos 1.4.2

Install prebuilt binaries via Homebrew

brew install theiskaa/tap/hedos

Download hedos 1.4.2

File Platform Checksum
hedos-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
hedos-x86_64-apple-darwin.tar.xz Intel macOS checksum
hedos-aarch64-unknown-linux-gnu.tar.xz ARM64 Linux checksum
hedos-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum