Shipping today
Model IDkai
Checkpointkai-1.3 (pin @551f1990…)
Parameters~850M (multimodal decision architecture)
Latency (GPU)<1 ms p50 (one question, CUDA bf16)
Context reach32,768 tokens (YaRN; trained: 1,024)
ModalityText and structured state
Output tokens0 (typed probability distribution)
EndpointPOST /v1/decisions
ArchitectureProprietary Decision Transformer + factorized cross-attention
Safety qualificationNot yet qualified: a sealed evaluation is being authored
Price…
In development
Kai-1.7 targetParameters~850M (text, vision, audio, video)
Resident memoryUnder 2.0 GiB
Text latency<1 ms p50 (GPU), multi-pass adaptive refinement
Image latency360–400 ms (image + text state)
EncodersVision · Audio · Video
Reasoningreasoning: "auto" | "fast" | "deep"
Quick start
Get an API key →TypeScript
// npm install hanzoai
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: { incident: 'checkout 5xx at 14%' },
questions: {
severity: {
type: 'choice',
instructions: 'How severe is this incident?',
criteria: {
low: 'cosmetic or internal; no customer is affected',
high: 'some customers are blocked from finishing a task',
critical: 'every customer is blocked and no revenue comes in',
},
},
},
},
})
const { choice, probabilities } = decision.answers.severity
console.log(choice, probabilities)Python
# pip install hanzoai
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": {"incident": "checkout 5xx at 14%"},
"questions": {
"severity": {
"type": "choice",
"instructions": "How severe is this incident?",
"criteria": {
"low": "cosmetic or internal; no customer is affected",
"high": "some customers are blocked from finishing a task",
"critical": "every customer is blocked and no revenue comes in",
},
},
},
}))
severity = decision.answers["severity"]
print(severity.choice, severity.probabilities)cURL
curl -sS --fail-with-body https://api.hanzo.ai/v1/decisions \
-H "Authorization: Bearer $HANZO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kai",
"state": { "incident": "checkout 5xx at 14%" },
"questions": {
"severity": {
"type": "choice",
"instructions": "How severe is this incident?",
"criteria": {
"low": "cosmetic or internal; no customer is affected",
"high": "some customers are blocked from finishing a task",
"critical": "every customer is blocked and no revenue comes in"
}
}
}
}'Go
// net/http: the Go SDK refuses a choice question with named criteria.
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
func main() {
if err := run(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
func run() error {
body, err := json.Marshal(map[string]any{
"model": "kai",
"state": map[string]string{"incident": "checkout 5xx at 14%"},
"questions": map[string]any{
"severity": map[string]any{
"type": "choice",
"instructions": "How severe is this incident?",
"criteria": map[string]string{
"low": "cosmetic or internal; no customer is affected",
"high": "some customers are blocked from finishing a task",
"critical": "every customer is blocked and no revenue comes in",
},
},
},
})
if err != nil {
return err
}
req, err := http.NewRequest("POST", "https://api.hanzo.ai/v1/decisions", bytes.NewReader(body))
if err != nil {
return err
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
out, err := io.ReadAll(resp.Body)
if err != nil {
return err
}
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("HTTP %d: %s", resp.StatusCode, out)
}
var decision struct {
Answers map[string]struct {
Choice string `json:"choice"`
Probabilities map[string]float64 `json:"probabilities"`
} `json:"answers"`
}
if err := json.Unmarshal(out, &decision); err != nil {
return err
}
severity := decision.Answers["severity"]
fmt.Println(severity.Choice, severity.Probabilities)
return nil
}Limits
- Reads text and structured state. Images, audio and video are the Kai-1.7 target.
- Reaches 32,768 tokens by position; accuracy at that length is qualified for kai-1.4 and kai-1.5 only.
- At most 100 questions a request. More questions, or a state past 32,768 tokens, is refused with 422.
- The reasoning field is the Kai-1.7 target: the API refuses it today (400).
More from Hanzo
Enso
Hanzo's proprietary frontier model — Opus-class reasoning by default with 1M-context overflow.
Enso (enso-auto)
Routes each request to one tier by the reasoning depth it asks for: enso-flash at off, none, minimal, low, default; enso-pro at medium, high; enso-ultra at xhigh, max. It bills at the price of the tier that answers; the price shown is a request's that states no depth. When nothing pays for that tier it answers on enso-free, at no charge, and says so.
Enso Flash
Fast, economical Enso tier for high-volume, low-latency everyday work, with 1M-context overflow.
enso-free
enso-pro
Enso Ultra
Adaptive fan-out — probes a task-appropriate model, escalates to a top-K panel only when needed, then verifies-then-selects the best answer.