All posts

Introducing Krun One: A Decision Model Built for AI Systems

Krun··5 min read

Introducing Krun One: A Decision Model Built for AI Systems

Large language models are excellent at generating text.

But many production AI systems do not need more text.

They need a decision.

Which tool should run?

Which agent should handle a request?

Which intent best matches the user?

Should the system retrieve more context?

Should it act — or abstain?

That is the problem Krun is built to solve.

Today, we are introducing Krun One, our first decision model for AI systems.

Krun One is designed to take structured context, evaluate a set of possible decisions, and return a calibrated answer with probabilities and confidence.

Instead of generating a long sequence of tokens, Krun returns a decision.


Decisions, not completions

A traditional LLM workflow often looks like this:

context
→ prompt
→ generate text
→ parse the response
→ validate it
→ hope the model followed the schema

Krun is designed around a different primitive:

context
+
questions
+
runtime options
→
structured decisions

A request can look like this:

{
  "context": "Customer wants to return an item and asks about the refund.",
  "questions": {
    "department": {
      "type": "choice",
      "options": {
        "shipping": "Shipping and delivery issues",
        "returns": "Returns and refunds",
        "billing": "Billing and payment issues"
      }
    }
  }
}

And Krun One returns:

{
  "model": "krun-one-v0",
  "answers": {
    "department": {
      "type": "choice",
      "choice": "returns",
      "confidence": 0.984087,
      "probabilities": {
        "shipping": 0.005228,
        "returns": 0.98943,
        "billing": 0.005342
      },
      "abstain": false,
      "abstention_status": "advisory"
    }
  },
  "usage": {
    "input_tokens": 54
  }
}

There is no generated prose to parse.

The output is already the decision.


One request, multiple decisions

Krun One can evaluate multiple structured questions in a single model call.

For example, the same customer message can be evaluated for department and priority at once:

{
  "context": "Customer wants to return an item and asks about the refund.",
  "questions": {
    "department": {
      "type": "choice",
      "options": {
        "shipping": "Shipping and delivery issues",
        "returns": "Returns and refunds",
        "billing": "Billing and payment issues"
      }
    },
    "priority": {
      "type": "choice",
      "options": {
        "low": "Can wait",
        "normal": "Normal priority",
        "high": "Needs quick attention"
      }
    }
  }
}

Krun returns both answers in one response.

This matters for agent systems, where a single observation can require several decisions before execution.


Knowing when not to decide

A useful decision model should not be forced to choose.

Krun One can abstain when the decision signal is not strong enough.

A response may look like:

{
  "choice": null,
  "confidence": 0.713767,
  "probabilities": {
    "low": 0.101997,
    "normal": 0.815764,
    "high": 0.082239
  },
  "abstain": true
}

The probability distribution is still available, but the model explicitly tells the application not to treat the top option as a confident decision.

This is particularly useful for systems that can fall back to a larger model, ask the user for clarification, or escalate to a human.

Krun's confidence value is the margin between the two highest-probability options. It is not a direct estimate of the probability that the model is correct.


From Laya to Krun One

Krun One v0 started from the open Laya decision-model architecture.

We kept the architecture and fully fine-tuned the model on 172,430 decision examples focused on the workloads we care about:

  • intent routing
  • tool routing
  • multilingual decisions
  • hard negative selection
  • out-of-distribution cases
  • option-order robustness

The training mixture included public datasets such as:

  • Banking77
  • MASSIVE
  • xLAM-60k
  • ToolACE
  • xlam-irrelevance

BFCL was kept out of training and used as an external evaluation set.

The goal was not to make the model larger.

The goal was to make the same class of model significantly better at real decision workloads.


The results

Krun One improved substantially over the original Laya checkpoint across the benchmarks we use for product validation.

BenchmarkLayaKrun One
Intent routing — validation64.04%96.01%
Intent routing — KrunBench final66.98%96.09%
Hard-negative intent routing49.45%91.29%
Tool routing — validation68.05%94.86%
Tool routing — holdout69.74%96.42%
BFCL83.39%92.33%
Option-order consistency67.8%98.9%

Krun One also improved out-of-distribution detection:

EvaluationLayaKrun One
KrunBench OOD AUROC0.6690.947
Tool holdout OOD AUROC0.7240.993

And calibration improved as well:

Laya ECE:      0.0327
Krun One ECE: 0.0072

These results do not imply that Krun One is better at every possible decision task.

They show that targeted training can dramatically improve a specialized decision model on the workloads we are building Krun for.


Tool routing

Tool selection is one of the main areas we are focused on.

For example:

{
  "context": "Find my meetings tomorrow.",
  "questions": {
    "tool": {
      "type": "choice",
      "task_type": "tool",
      "options": {
        "calendar_search": "Search calendar events",
        "send_email": "Send an email"
      }
    }
  }
}

Instead of asking a generative model to reason in text and then parsing its answer, Krun directly scores the available tools.

This pattern can be used for:

  • function calling
  • agent routing
  • RAG routing
  • model routing
  • workflow branching
  • escalation
  • classification

Tool abstention is still marked as advisory in the current version. In real-world BFCL irrelevance cases, it is not yet as reliable as our internal tool holdout. Improving this with production traffic is one of our priorities for the next Krun One iteration.


Built for production systems

Krun One is already running behind the Krun API.

The current stack is:

Developer
   ↓
Krun API
Rust / Axum
   ↓
RunPod Serverless
   ↓
Krun One

The API supports:

  • API keys
  • rate limits
  • quotas
  • usage tracking
  • structured errors
  • feedback
  • request IDs
  • multiple decisions per request

The model itself takes roughly 40 ms per decision on the current serverless GPU environment when warm.

End-to-end request latency is higher because serverless scheduling, networking, and cold starts add overhead.

For now, we intentionally keep the infrastructure scale-to-zero during the Closed Beta.


Python SDK

The official Python SDK is available today:

pip install krun-ai

Example:

from krun import Krun

client = Krun()

result = client.decide(
    context="Customer wants to return an item.",
    questions={
        "department": {
            "type": "choice",
            "options": {
                "shipping": "Shipping and delivery issues",
                "returns": "Returns and refunds",
                "billing": "Billing and payment issues",
            },
        }
    },
)

answer = result.answers["department"]

print(answer.choice)
print(answer.confidence)
print(answer.probabilities)

A TypeScript SDK is also on the way.


Where we are going

Krun One v0 is the beginning, not the final model.

Our next iterations will focus on:

  • better real-world tool abstention
  • harder tool-routing cases
  • feedback-driven training
  • improved calibration
  • better serving efficiency
  • stronger decision quality on production workloads

The important part is that the feedback loop is now live:

real usage
→ difficult decisions
→ feedback
→ better training data
→ better Krun One

That is how we intend to make the model meaningfully better over time.


Closed Beta

Krun is currently in Closed Beta.

We are looking for developers building:

  • AI agents
  • tool-calling systems
  • routing layers
  • support automation
  • RAG pipelines
  • multi-agent applications
  • systems that currently use large generative models for small structured decisions

If that sounds like your stack, we would like to hear from you.

Krun is built for the decisions between the generations.