Skip to main content

Providers

AssertLens sends the same selected source, check status, and assertions to one provider. Jev is the default and the recommended option: it answers typed questions with calibrated probabilities. Select another provider in .assertlens.json:

{
"provider": "anthropic",
"files": ["src/auth.ts"],
"assertions": {
"expiry": "Expired tokens are rejected before protected data is returned."
}
}
ProviderDefault modelAPI key variableEndpointProbabilities
jev (default)jev-1.13.0TYPESAFE_API_KEYTypeSafe APICalibrated
layatyped-decisionsLAYA_API_KEYLaya Studio, or self-hosted with --endpointUncalibrated as shipped
anthropicclaude-opus-5-5ANTHROPIC_API_KEYAnthropic APIModel-reported
openainone; set modelOPENAI_API_KEYOpenAI, or any compatible server with --endpointModel-reported

System-1 models: Jev and Laya​

Jev and Laya share the /v1/systemone request format: typed choice questions answered with a probability per option. Laya is open source and can run locally with laya-serve, so source never leaves your machine:

node src/assertlens.ts --endpoint http://localhost:8000/v1/systemone --snapshot

Laya's context is small: 512 tokens for english and 1,024 for typed-decisions and multilingual, covering the state plus one question. Only very small scopes fit; larger ones fail before sending with their estimated tokens. Laya's shipped probabilities are over-confident until you fit temperatures on your own labelled data, so AssertLens labels them uncalibrated. AssertLens gates on Laya's answer_confidence when present.

LLMs: Claude and OpenAI-compatible​

LLM providers receive one request per scope with a JSON schema. For each assertion the model returns probabilities for supported, contradicted, and insufficient plus a short rationale naming the deciding files. The choice is the most probable option; ties go to the cautious one (insufficient, then contradicted). Probabilities must sum to 1 within 0.05 or the review is unavailable.

These probabilities are model-reported, not calibrated. Reports say so and show each rationale as Model rationale:. The 0.8 threshold is a rough signal here.

  • Claude defaults to claude-opus-5-5 at high effort, with server-side refusal fallbacks on current models. A refusal or truncated answer makes review unavailable.
  • OpenAI-compatible servers use Chat Completions with a strict JSON schema (response_format). Set model explicitly. Point --endpoint at OpenAI, OpenRouter, or a local server such as Ollama or vLLM; loopback servers may run without a key.
node src/assertlens.ts --endpoint http://localhost:11434/v1/chat/completions --snapshot --dry-run

Endpoints and keys​

--endpoint (or the action's endpoint input) points laya, anthropic, or openai at a self-hosted or compatible server, such as a gateway that serves Claude models through the Messages API. It must use HTTPS or HTTP on localhost and cannot contain credentials. It comes from whoever runs the CLI, never from .assertlens.json, so a reviewed repository cannot redirect your source or API key. Jev always uses the TypeSafe endpoint.

Each provider reads only its own key variable. All four keys, plus GITHUB_TOKEN and GH_TOKEN, are removed from check commands, and the Bubblewrap sandbox starts with an empty environment. --dry-run prints the exact request bodies and their destination without sending anything.

Choosing a provider decides where your selected source is sent. Confirm that the provider fits your data-sharing policy before enabling it.