Skip to content
NewBun 1.4.5 is out. Release notes
AphrodyBun

Runtime · Utilities

Typed decision boundaries

Confidence, abstention, provider limits and the Python SDK for bun:yolo typed decisions.

bun:yolo adapts application-supplied judgments into Noul booleans, named Choice keys and finite Score values. Bun validates the request, provider response and primitive conversion natively. A judgment is a proposal; application permission rules still authorize any subsequent operation.

import { decide, noul, choice, score, type Provider } from "bun:yolo";

export async function selectSource(provider: Provider) {
  return await decide(
    {
      state: { query: "How do Bun.Video frames become images?", passage: "A curated source excerpt." },
      questions: {
        relevant: noul("Does `passage` help answer `query`?"),
        route: choice("Which source fits?", { docs: "API documentation", graph: "Source relationships" }),
        support: score("How directly does `passage` support `query`?", ["None", "Partial", "Direct"]),
      },
    },
    { provider, timeout: 10000, maxRetries: 0 },
  );
}
// relevant: boolean; route: "docs" | "graph"; support: number in 0..2

One named batch shares one provider request. inspect, also exported as systemOne, keeps the validated probabilities, model and usage. decide returns primitives. A Noul becomes true only when its probability is greater than threshold, which defaults to 0.5; equality returns false. Score can be fractional. Unknown answers, choice keys, distributions or legends are rejected.

Confidence and abstention

Choice abstention is a separate operation. Validate the minimum with confidenceThreshold(minimum) before calling the provider, then call selections(request, result, minimum) on an inspected response. It returns only Choice entries: the winning key when its confidence is at or above the minimum, otherwise null. Answers, distributions, model and usage stay unchanged. This confidence minimum is distinct from the Noul probability threshold.

Providers and limits

Supply your own Provider, or use the default remote() provider configured with the server-side TYPESAFE_API_KEY environment variable. code adapts deterministic or asynchronous callbacks through the same validation; local borrows a caller-owned bun-llama context without downloading weights. Local outputs are raw model judgments and are not calibrated. The full type definitions are in packages/bun-types/yolo.d.ts.

Batches contain 1–64 questions; Choice has 2–255 options and Score has 2–10 criteria. Request and response JSON are each limited to 1 MiB. timeout bounds the complete operation, including retries, to 1–120000 ms. maxRetries is 0–3, default 0. A caller AbortSignal cancels pending work. Typed judgments do not generate an explanatory answer: an application may generate text separately and then check its grounding against cited evidence.

Python SDK

The runtime SDK in packages/bun-runtime-sdk/python/ctypes provides bun_yolo.Yolo, noul, choice and score. It has no Python HTTP client or model engine. Each call sends a JSON envelope over stdin to a Bun worker, which calls inspect, decide or value from bun:yolo. Converted values return as Python bool, str or float. client.inspect(..., minimum_confidence=0.8) (alias system_one) returns the raw model, answers and usage, plus the computed selections. inspect_async and decide_async are the asynchronous variants.

import os
from pathlib import Path
from bun_yolo import Yolo, noul
from yolo_runtime import Runtime

with Runtime() as runtime:
    client = Yolo(runtime, Path(os.environ["BUN_EXECUTABLE"]))
    result = client.value({"type": "noul", "noul": 0.8}, noul("Fixture answer"))
    assert result is True

This example validates a supplied answer without model inference. Provider credentials come from the caller's configuration; no key is embedded in source. Yolo borrows the Runtime, accepts one active call per instance and never closes the borrowed handle. Each child process has at most 1 MiB of input and captured output. transport_timeout_ms bounds the wait for the worker (1–130000 ms, default 130000); options.timeout still bounds inference. cancel() cancels the pending operation, stops the child process and releases its handles. When the Python task running await client.decide_async(...) is cancelled, the call waits for native cleanup.

The runtime library must support the process.stdin and process.wait capabilities (C ABI 1.6 or later); older installations are refused before a process is created. State, tokens and provider bodies are never passed in argv, temporary files or diagnostics. Native errors return bounded names and codes without raw messages.