Back to Blog
KAI 1
September 28, 2026
3 min read

Kai 1: Decisions, Not Completions

Kai is Hanzo's decision model. Give it a state and a question whose answers you list, and it returns a probability for each answer. It writes no text.

Decision Latency<1 msp50 (one question, GPU bf16)
Output0 tokensKai writes no text; output is not billed
Price$0.021Per million input tokens; Jev costs $0.042
Context Window32,768Native reach across text, code, and multimodal state

Why not generate the decision

An agent spends many of its steps on choices: which tool, whether a test passed, whether to stop. Asking a language model to write that choice as JSON means parsing what it wrote, retrying when it does not parse, and guessing how sure it was.Kai answers in the shape of the question. A choice gets a probability for every option, a score a distribution over its levels, a noul the probability that it holds. Nothing is generated, so nothing is parsed.

One call

POST https://api.hanzo.ai/v1/decisions, from the hanzoai SDKs or over HTTP. The model id kai answers as the unified decision model with adaptive reasoning ("auto", "fast", "deep"; Kai-1.7 target). Version pins kai-1.5, kai-1.4, and kai-1.3 provide deterministic reproducibility across text, code, and long-context evidence.
import { AiApi, Configuration } from 'hanzoai'

const ai = new AiApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }))
const { data: decision } = await ai.postDecisions({
  aiDecisionsRequest: {
    model: 'kai',
    state: { tool_call: 'bash.exec', command: 'pytest -v tests/test_agent.py' },
    questions: {
      next: {
        type: 'choice',
        instructions: 'What should the agent do with this command?',
        criteria: { approve: 'safe to run', reject: 'unsafe', clarify: 'needs the user first' },
      },
    },
  },
})

console.log(decision.answers.next.choice, decision.answers.next.probabilities)
import os

from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import AiApi
from hanzoai.cloud.models.ai_decisions_request import AiDecisionsRequest

ai = AiApi(ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"])))
decision = ai.post_decisions(AiDecisionsRequest.from_dict({
    "model": "kai",
    "state": {"tool_call": "bash.exec", "command": "pytest -v tests/test_agent.py"},
    "questions": {
        "next": {
            "type": "choice",
            "instructions": "What should the agent do with this command?",
            "criteria": {"approve": "safe to run", "reject": "unsafe", "clarify": "needs the user first"},
        },
    },
}))

print(decision.answers["next"].choice, decision.answers["next"].probabilities)

Limits

kai-1.3, the default, was trained on 1,024 tokens of state beside each question. It reads up to 32,768 and marks a longer read routing.extrapolated; past 1,024 its answers are unreliable. Keep the state to what decides the question, or ask for kai-1.4, which was trained on long states and marks no read up to 32,768 extrapolated.
Results, request shapes and limits