
Decidealot
io.github.psyb0tPublished by GitHub account psyb0tv0.7.1Updated Oct 24, 2026
Local Laya and Von typed decisions over TypeSafe-compatible MCP.
Overview
Decidealot runs local Laya, Von or CLM decision models, or hosted Jev, behind one MCP endpoint that returns typed choices, scores and probabilities.
- What you can do
- Run a single typed decision against a chosen model, returning choice, score or noul answers with probabilities and token usage (system_one). Submit several independent decisions in one ordered batch (system_one_batch). List the supported model selectors and the model behind each (list_models). Release loaded local model memory (unload_models). The same container also serves a REST API with matching endpoints.
- When to use it
- Use it when an agent needs a small, bounded classification or routing decision with inspectable probabilities, such as triage, approval or policy checks, and you want the model to run locally or through TypeSafe's hosted Jev. It is not meant to perform the action itself; the caller applies its own threshold.
- Requirements
- Docker on the host; the server runs as a local container and serves MCP Streamable HTTP on loopback port 8080. A host directory mounted at /models for downloaded model bundles, which are fetched and verified at first startup and can take several minutes. Optional Bearer token via DECIDEALOT_API_KEY. Hosted Jev needs DECIDEALOT_TYPESAFE_API_KEY; CLM needs DECIDEALOT_CLM_EMBEDDINGS_URL pointing at a Qwen3-8B compatible embeddings endpoint. CUDA image needs an NVIDIA driver and Container Toolkit.
Installation
In SourceWeft
- Open Decidealot in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Decidealot
[CI] [coverage] [version] [license] [Docker Pulls]
Your hardware or TypeSafe's hosted Jev. Run Laya, Von, a CLM projection head, or Jev through one TypeSafe-compatible HTTP and MCP endpoint.
At startup Decidealot downloads and verifies every enabled local bundle. It then loads only the provider selected by a request, unloads it after the configured idle period, and returns typed choice, score, and noul answers with model probabilities. CLM adds a small local projection head over one configured Qwen3-8B embeddings endpoint. It exposes the TypeSafe HTTP API and MCP Streamable HTTP from the same local container.
Contents
- Quick start
- Use hosted Jev
- Use the API
- Use MCP
- Expose MCP through a proxy
- Pick a model
- Configuration
- CLM embeddings and caching
- CUDA
- Model storage and unloading
- Agent integrations
- Docs
Quick start
You need Docker. This starts the CPU image on loopback, stores downloaded model files in one narrow host directory, and gives the container no capabilities or writable root filesystem.
Check the service, then ask Laya to make one typed decision:
The first service startup downloads the enabled pinned model bundles and can take several minutes. The default configuration enables Laya and Von. Wait for /health before sending a decision. Later service starts reuse the same host directory.
An example response looks like this. The answer, probabilities, and token count vary with the model call:
For that result, your application queues the action for human review instead of running it. Decidealot does not perform the action. Your caller checks the chosen label and applies its own probability threshold, for example allowing an action only when choice is allow and probabilities.allow is at least 0.95.
Use hosted Jev
Set DECIDEALOT_TYPESAFE_API_KEY in a private environment file or secret store. Jev enables automatically when the key is present. Call GET /v1/models and select a hosted name returned by TypeSafe, such as jev-latest. Decidealot caches the authenticated TypeSafe catalog for 60 seconds and refreshes it on the next model-listing or hosted-model request after expiry. New hosted model names need no Decidealot release. It sends the complete state and questions to TypeSafe's fixed HTTPS API, not to a local model. The key never belongs in the request body, a tracked file, or a client-side application.
For a Jev-only container, disable all local models so startup downloads no model bundles. Pass the upstream key as an environment variable from your secret store, then use the same REST or MCP endpoint shown below:
The variable must already be set in the shell or supplied by your container manager. GET /v1/models confirms which Jev selectors are enabled. The API guide has a complete request and response example. TypeSafe charges for its API calls; model probabilities still need your own action thresholds.
Use the API
Send the state to judge and a bounded question. Decidealot returns typed results with probabilities.
choice questions need named criteria. score questions need an ordered criteria array whose position is the score. noul questions return a probability between zero and one. The API guide has the request rules, response shape, validation failures, aliases, authentication, and lifecycle behavior.
Put the subject in state, the question and decision rules in each question's instructions, and explicit descriptions in criteria. A label like review does not explain what should be reviewed. For noul, write the statement whose probability you want in instructions.
CLM accepts optional flat request configuration. The selected model already identifies which settings apply:
CLM temperature defaults to 1 and accepts finite numbers greater than 0 and at most 100. Lower values sharpen its probability distribution; they do not make the answer more correct. Laya, Von, and hosted Jev currently accept only omitted or empty config. Unsupported keys and values return 422, never silently disappear. The same config belongs in MCP tool arguments or each individual batch request. Request configuration covers the contract.
Use MCP
The same container serves MCP Streamable HTTP at http://127.0.0.1:8080/mcp. The system_one tool takes the same model, state, and questions fields as POST /v1/systemone. system_one_batch takes a requests list, each item with those same fields. list_models returns the live catalog. unload_models releases local model memory. Direct loopback clients and containers using the decidealot Docker service name work by default.
Point an MCP client at that exact URL. Its configuration format varies, but the connection values are always equivalent to this:
Omit the Authorization header only when DECIDEALOT_API_KEY is empty. The MCP tools return structured output matching the HTTP result bodies, so an agent can inspect probabilities before it chooses the next action. A client that only supports local stdio can use the optional OpenClaw bridge described in Agent integrations. The API guide has tool inputs, output shapes, session behavior, and failure behavior.
Expose MCP through a proxy
The MCP server keeps DNS-rebinding protection enabled. A proxy, tunnel, or public DNS name must be allowed explicitly. Add the exact public Host value to DECIDEALOT_MCP_ALLOWED_HOSTS. Browser-based MCP clients must also add their exact origin, including the scheme, to DECIDEALOT_MCP_ALLOWED_ORIGINS.
For a proxy that publishes https://mcp.example.net/mcp, put these values in the Compose .env file before docker compose up -d, or pass the same variables with docker run --env:
Keep --publish 127.0.0.1:8080:8080 when a local reverse proxy terminates TLS. The proxy forwards the request unchanged with Host: mcp.example.net. After bearer authentication, Decidealot returns 421 for an untrusted host and 403 for an untrusted browser origin. Invalid or missing bearer credentials return 401 first. Do not disable this protection or allow a broad wildcard for an internet-facing endpoint.
Pick a model
Every request must name a selector. GET /v1/models returns the same catalog at runtime.
What differs
Laya is one model family with three checkpoints. Its automatic selectors choose English or multilingual checkpoints from the input script and a language heuristic. Use laya-multilingual for known non-English short Latin-script messages. laya-typed-decisions targets repeated structured decision work.
Von is a separate English-only decision model for short questions with clear criteria. CLM is a local 75 MB projection head, not a text encoder. It calls one configured OpenAI-compatible /v1/embeddings URL and requires its configured model to return Qwen3-8B last-token vectors with exactly 4096 float values. All providers take the same TypeSafe state and questions shape and return typed choice, score, and noul answers with probabilities. Your application applies the threshold and action that follow.
Decidealot keeps one local provider resident by default. Set DECIDEALOT_MAX_RESIDENT_LOCAL_PROVIDERS=2 or 3 only when the host has enough RAM or VRAM to hold that many processes. A batch can name more local model families than the resident limit; those calls wait for a slot and switch models as needed. Repeated requests to one underlying model run sequentially. Local CUDA models also run sequentially, even with multiple resident slots. CLM and its Qwen embeddings calls share the local serial lane by default, including on CPU. Set DECIDEALOT_CLM_PARALLEL_WITH_LOCAL_MODELS=true only when that workload can safely overlap other local models, such as when Qwen runs on another machine. Hosted Jev can overlap local work. A Jev call uses HTTPS and does not load, switch, or unload a local provider.
Set DECIDEALOT_PROVIDER_IDLE_UNLOAD_SECONDS to choose when an idle provider releases its model and Torch memory.
Configuration
Pass configuration with --env-file or your container manager. The image uses fixed internal ports. Docker port publishing controls where the service is reachable.
The container always stores local bundles under /models. Its only model storage setting is the host directory mounted there. To run only CLM, set DECIDEALOT_LAYA_ENABLED=false, DECIDEALOT_VON_ENABLED=false, and configure DECIDEALOT_CLM_EMBEDDINGS_URL. To run only Jev, disable Laya and Von, leave CLM unconfigured, and supply DECIDEALOT_TYPESAFE_API_KEY; no /models mount is needed. CLM's embeddings endpoint and TypeSafe's Jev API receive decision state and criteria, so use them only when that data may leave your host. Keep the loopback bind for one-host use. Before putting Decidealot behind a proxy, tunnel, or public address, set DECIDEALOT_API_KEY to a real secret, require Authorization: Bearer <your-key> from every caller, and configure the precise MCP host and origin allowlists above.
CLM embeddings and caching
CLM normalizes encoder vectors before applying its projection heads. Repeated candidate texts reuse a bounded process-local cache; raw decision state is never cached. Unloading CLM clears that cache. usage.input_tokens reports only tokens charged by the embeddings calls actually made. The byte limit is not a token limit: configure your encoder to reject inputs beyond its context instead of silently truncating. A quantized Qwen encoder is not equivalent to upstream's full-precision encoder, and matching vector width alone does not establish equivalent accuracy.
CUDA
psyb0t/decidealot:latest-cuda uses CUDA 12.6 and needs a compatible NVIDIA driver, NVIDIA Container Toolkit, and --gpus all. CUDA images are amd64-only. The CPU image is the right default unless inference speed and model memory justify the GPU setup.
CUDA needs one writable executable cache because Triton compiles and loads short-lived CUDA helpers there. The rest of the container remains read-only and noexec. Deployment has the complete CPU, CUDA, authentication, persistent-storage, and host-directory recipes.
Model storage and unloading
Mount one narrow host directory at /models. Decidealot creates and manages /models/laya, /models/von, and, when enabled, /models/clm inside it. The Docker commands run as your current host UID and GID, so a directory you create yourself is writable without an image-specific chown. The image falls back to non-root 1000:1000 only when no runtime user is supplied.
Unload the loaded local runtime when you are done with it:
The endpoint reports each configured local provider and stops every loaded idle provider. It refuses to unload any while a local request is active. Stopping a provider process releases its model weights, Torch allocations, worker threads, and CUDA context. It does not affect TypeSafe's hosted Jev. A later local request starts its provider again.
Agent integrations
Install the Decidealot skill from the psyb0t marketplace after the release that contains it. The skill tells an agent how to deploy the Docker image, choose Laya, Von, CLM, or Jev, submit typed decisions, read probabilities, use direct MCP, and use the stdio bridge only when its client needs one.
OpenClaw can install the skill or its stdio bridge. The bridge forwards stdio traffic to a Decidealot container you already run.
Docs
License
Decidealot code is WTFPL. Laya, Von, CLM, PyTorch, Transformers, and each downloaded model keep their own upstream licenses. Read those before putting a model into a commercial product.
Source: README.md at commit 5e76993
Tools
0Version history
6- v0.7.1LatestOct 7, 2026
- v0.6.0Oct 2, 2026
- v0.5.0Sep 29, 2026
- v0.4.1Sep 24, 2026
- v0.4.0Sep 24, 2026
- v0.3.1Sep 24, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts