Select
Score the full catalog and pass the model only the tools this turn needs.
Your agent carries 24 tools. This turn needs 2. Kerf makes the cut before the model call, on your own machine, with zero network on the path.
When the whole catalog reaches the model on every turn, the odds it grabs the wrong tool climb with each one you add — and some wrong tools move money or delete data. The deeper risk isn't just how many tools reach the model, but which ones: untrusted, changing, and colliding by name.
refund_orderAn unrequested refund goes out the door.
delete_accountA destructive action fires on a vague complaint.
areaYou pay for, and reason over, tools the turn never needed.
You can't ship an agent you don't trust to pick the right tool.
Tool schemas are embedded server-side into a versioned, signed artifact. At runtime the SDK scores your query against it, on-device, no round trip.
Tool schemas are embedded into a neural vector index with a bi-encoder, then serialized, encrypted, and signed into one versioned artifact.
Server · one-timeThe CLI or SDK pulls the artifact over a presigned URL and verifies its ECDSA P-256 signature before it ever loads. Fails closed.
Client · per releaseEvery turn, select() embeds the query and returns the 2 to 3 tools above threshold. No cloud on the critical path.
Client · every turnkerf-cli launches an interactive prompt. Log in once, then drive the whole pipeline. Shape your tools, train, eval, and pull.
Sharpen uses an LLM of your choice to rewrite vague tool descriptions, but never trusts it. Every proposal passes mechanical gates, enforced in code, not in a prompt.
Rejects any rewrite that adds a parameter, capability, or return value the original didn’t have. A diff check, not a judgment call.
Recomputes cosine similarity after the rewrite. If collision doesn’t measurably drop, the proposal is thrown out. Kerf verifies the claim.
Rejected proposals retry with the rejection as context, up to three attempts, then skip. Safe even with a local 7B model.
Run it against OpenAI, Anthropic, Bedrock, or a local Ollama model. The --llm flag is opt-in. Leave it off and sharpen is fully offline and CI-safe.
Agents now pull tools from everywhere. With MCP, those tools can change under you, collide by name, and show up without you noticing. Kerf is becoming the layer that verifies them, not just the one that picks them.
Score the full catalog and pass the model only the tools this turn needs.
Fingerprint every tool. Catch the ones that silently changed. Resolve name collisions. Pin what you trust.
Gate what the agent is allowed to run, before it runs. Signed and auditable end to end.
An LLM only ever touches two things in kerf: rewriting tool descriptions in sharpen, and generating eval queries. Selection itself, the thing that runs on every turn, is local math, not a model call, regardless of what you configure here.
Low latency, strong rewrite quality.
Low latency, strong rewrite quality.
Enterprise: data stays inside your AWS account.
Fully offline and private. Mechanical gates protect against weak output.
Every command that could use an LLM requires you to say so, explicitly, per invocation.
absentno LLM requested--llmuse your configured default--llm openaiuse this provider, just onceStructural offline guarantee. Commands like tools sharpen --fix and plain eval are policy-forbidden from calling an LLM. No code path in kerf reads your default provider, so the pipeline stays offline no matter what's configured.
Every artifact declares its strategy in a descriptor. The SDK runs exactly what's declared, with no guessing and no silent fallback, so you can score precision, recall, and set size against real queries.
Bi-encoder plus a cosine threshold. The default when you want selection to stay light on the turn.
SpeedBi-encoder retrieval, then cross-encoder reranking. Trades a little speed for selection quality when precision matters most.
QualityKerf returns standard OpenAI-format tool definitions, so the output slots straight into whatever your stack already speaks. No adapter layer.
Init once at startup, then select per turn. Use the returned names to narrow whatever tool set your framework manages, and pass only those to the model.
import kerf from '@kerf/sdk';
await kerf.init({ projectId: 'proj_x7k' });
// on every turn, runs locally, no network
const { tools } = await kerf.select(
"cancel my order and get a refund"
);
// tools: 2-3 relevant defs, not the full catalog
// [{ type: "function", function: { name: "cancel_order" }}]kerf-site gives you projects, tools, training status, and signed artifacts at a glance. No terminal required.
| Version | Status | Size | Signed | Created |
|---|---|---|---|---|
| v4 | training | now | ||
| v3 | ready | 1.9 MB | ✓ P-256 | 2m ago |
| v2 | ready | 1.8 MB | ✓ P-256 | 1d ago |
| v1 | failed | 3d ago |
Kerf works at the tool-selection layer beneath your agent loop, narrowing context before the framework's own reasoning kicks in.
AES-256-GCM envelope encryption with a per-project KMS key on every artifact.
ECDSA P-256 detached signatures, verified by the SDK and CLI at load and pull time.
A build-time key fingerprint is baked into the client. If it doesn’t match, load fails closed.
Once pulled, the agent runs entirely on-device. The cloud is a build pipeline, not a dependency.

Kerf is in private beta. Join the waitlist and we'll help you train your first artifact.
Selection is step one. Kerf is becoming the trust and control layer for agent tools.