Probelock – lockfile for LLM tool calling Probelock, a new open-source tool, provides a lockfile for LLM tool calling that records model capabilities and fails CI when a model or quant swap lowers scores. It derives probes from existing tool schemas and uses code-based scoring instead of LLM judges, enabling reproducible comparisons across model variants. A capability lockfile for local models. It records what a model does on a set of tool-calling and output checks, and fails CI when a model/quant/runtime swap lowers a score. llama-3.1-8b @ Q8 0 ollama → llama-3.1-8b @ Q4 K M ollama Capability Baseline Candidate Δ Status arg validity 1.00 0.67 -0.33 REGRESSION arity robustness 1.00 0.67 -0.33 REGRESSION format adherence 1.00 1.00 +0.00 ok needle in tools 1.00 0.33 -0.67 REGRESSION no hallucinated tool 1.00 0.67 -0.33 REGRESSION required args 1.00 1.00 +0.00 ok structured output 1.00 0.33 -0.67 REGRESSION tool discrimination 1.00 0.33 -0.67 REGRESSION tool permission 1.00 0.67 -0.33 REGRESSION tool restraint 1.00 0.67 -0.33 REGRESSION tool selection 1.00 0.67 -0.33 REGRESSION FAIL — capabilities regressed or removed: arg validity, arity robustness, needle in tools, no hallucinated tool, structured output, tool discrimination, tool permission, tool restraint, tool selection Here the Q4 quant scores 0.33–0.67 on several capabilities where Q8 scored 1.00. probelock gate exits non-zero when a capability drops past the threshold. promptfoo is a test framework you author. probelock is a lockfile you commit. Probes are derived from your tool schemas. Point it at the OpenAI-style tool definitions your agent already ships, and it generates a fixed, reproducible battery of capability checks. You write no test cases. No LLM judge. Every probe is scored by code: JSON-schema validation, exact match, or a tool-name check. Run it twice on the same model and the numbers match. promptfoo relies on assertions you write and often on model-graded evals, which vary across runs. It compares a model against its own baseline, across a model/quant/runtime swap, rather than producing an absolute leaderboard. You only ever compare like with like, on your box, with your tools, so the "benchmarks are gameable/hardware-dependent" objection does not apply. Install & run only needs uv https://docs.astral.sh/uv/ Run it without installing, or install it into the current environment: uvx probelock --help run the latest release pip install probelock or install it To run an unreleased revision straight from git: uvx --from git+https://github.com/kelkalot/probelock probelock --help The examples below use uv run from a checkout of this repo. No model is required for the demo — a deterministic SimulatedClient stands in for two quant levels of the same model: from the probelock/ project dir uv run probelock derive --tools examples/agent tools.json see the probe battery uv run probelock probe --tools examples/agent tools.json --simulate fixtures/profile q8.json -o q8.lock uv run probelock probe --tools examples/agent tools.json --simulate fixtures/profile q4.json -o q4.lock uv run probelock diff q8.lock q4.lock uv run probelock gate --baseline q8.lock --candidate q4.lock exits non-zero Against a local model, swap --simulate for an OpenAI-compatible endpoint: uv run probelock probe --tools examples/agent tools.json \ --endpoint http://localhost:11434/v1 --model llama3.1:8b-instruct-q4 K M \ --quant Q4 K M --runtime ollama --timeout 120 -o q4.lock A probe the model rejects e.g. "model does not support tools" or that times out scores 0 for that capability and the run continues, so a model that cannot tool-call still produces a lockfile. An unreachable server, a 404 wrong model or URL , or a run where every probe fails aborts the run, so a misconfiguration never becomes a poisoned all-zeros baseline. examples/agent tools.json is a 3-tool schema for the walkthrough above, not a sensitivity benchmark — validation testing found it insensitive to real capability drift that a 10-tool schema with overlapping tool names and richer argument constraints caught cleanly see VALIDATION.md /kelkalot/probelock/blob/main/VALIDATION.md . A schema with too few tools, or arguments with no real constraints to violate, under-reports regressions. Point --tools at your own agent's actual tool definitions before trusting gate in CI.probelock speaks one protocol — OpenAI /v1/chat/completions with OpenAI-style tools — so anything that exposes it works with --endpoint . For providers that do not Anthropic, Gemini, … , route through a unified SDK with --via . Every path is deterministic; none of them put an LLM in the loop. | You have… | Use | |---|---| Ollama, vLLM, llama.cpp server, LM Studio, HF TGI, OpenAI, OpenRouter, Together… | --endpoint