The page put X-Routed-Model on every Enso answer. The gateway sets it only
when it resolves auto (or zen-router) to a model; an enso-* id keeps its own
name in the body, and the gateway names the Hanzo model that answered in
X-Hanzo-Served, which is what the live answer carries.
Keys resolve through IAM's keys endpoint with the console's client, which
only mainnet's cloud holds; on testnet and devnet a key authenticates
nobody.
API keys live in each network's own books, so an hk- key from
production is unknown on testnet and devnet; the hanzo.id token is
accepted by all three.
api-test.hanzo.ai runs production's release, api-dev.hanzo.ai the dev
branch; both take only Square sandbox cards, route free models, and keep
their own books under one Hanzo identity. The page says which to pick,
how to point a client at one, and the sandbox cards to pay with.
The section rendered /v1/pricing's frozen Enso rows: no enso-pro, enso
as a paid tier, a fan-out description of enso-ultra, and GPQA scores
copied from hanzo.ai/enso. Read the ids and rates from the catalogue,
keep them in the snapshot for an offline build, and link the Enso page
for cache rates and chains.
Print a rate as exactly as the gateway states it, so enso-ultra reads
$5.236 and not $5.24. The free-model line no longer holds two dollar
signs in one paragraph, which remark-math typeset as an equation.
Claude-Session: https://claude.ai/code/session_01M8RoubcPN71KgJuZ8LdBUL
Chat, the glossary, the models index, the workspace sheet and the
coding guides named enso as a paid tier and enso-flash at a 262K
window, and none named enso-pro. Name enso-auto and the three paid
tiers, and link the Enso page for prices. The workspace sheet's
escalation and savings figures were computed on the old prices; they
go.
The Claude Code guide and settings example fill the Haiku, Sonnet and
Opus slots the way hanzo --claude --cloud does.
Claude-Session: https://claude.ai/code/session_01M8RoubcPN71KgJuZ8LdBUL
The page listed reasoning settings and called enso-pro the same path as
enso. Lead with the tiers production serves: the job each is for, its
input, output and cache rates beside the Claude tiers it stands in for,
the chain behind it, the depth lift that serves enso-auto, Claude
Code's slots, and one agent turn priced with cached tokens. The router
keeps its sections below.
The chains follow the Artificial Analysis Coding Agent Index (v1.5),
labelled as third-party. X-Hanzo-Served names the Enso id, not the
model behind it, so the page says that.
The Enso paper moved to a private repository; link the public Hanzo
Router paper in its place, here and on Smart routing.
Claude-Session: https://claude.ai/code/session_01M8RoubcPN71KgJuZ8LdBUL
The pages name only endpoints the API document has, and /v1/research is
not in it, so the build refused the five run links. hanzo.ai/benchmarks
draws the same runs live.
Claude-Session: https://claude.ai/code/session_01M8RoubcPN71KgJuZ8LdBUL
A page for Claude Desktop, Cursor, VS Code, Windsurf, Zed, JetBrains and
the Codex, Claude Code and Continue apps: hanzo-mcp as an MCP server, and
the app's own model on api.hanzo.ai with an OpenAI- or Anthropic-
compatible setting. Cursor, Grok, Antigravity and Gemini take the toolset
once in their own configuration. Windows installs through npm and
`hanzo upgrade`. The coding page states the measured runs, each linked.
Claude-Session: https://claude.ai/code/session_01M8RoubcPN71KgJuZ8LdBUL
Four migration guides: the Anthropic Messages API at /v1/messages with a
bearer key, Gemini models on the OpenAI-compatible routes as google/*,
OpenRouter's provider/model names at api.hanzo.ai/v1 with Enso to pick,
and keeping whatever coding agent you run under `hanzo --<agent>`. Each
was checked against the gateway. OpenHands joins the agent pages. The
coding hub links its measurements through hanzo.ai/benchmarks, since the
research API is not in the document the endpoint gate reads.
Claude-Session: https://claude.ai/code/session_01M8RoubcPN71KgJuZ8LdBUL
The coding pages taught `hanzo code claude` and `--no-route`, which the
CLI retired, and named five agents. They now follow CLI 8.5.703:
`hanzo --<agent>` for Claude Code, Codex, Cursor, Antigravity, Gemini,
Qwen, OpenCode, Kilo, Crush, Goose, Aider, Hermes, Pi, Copilot, Amp,
Grok Build, Cline, Continue, Kimi, Oh My Pi, Letta and Kode, each with
how the Hanzo toolset reaches it and whether --cloud moves its model
calls onto Hanzo. The hub page covers signing up through hanzo.id,
plans and payment, handing work to Enso and Kai, reading the session
summary, `hanzo upgrade`, and the research runs behind every number.
The quickstart installs from hanzo.sh first and links the guide, and the
index lists it.
Claude-Session: https://claude.ai/code/session_01M8RoubcPN71KgJuZ8LdBUL
Production serves kai-1.2 (kai-1 with arm Z2's yes/no reader) on v0.4.5.
Kai reads 32,768 tokens, marks a read past its trained 1,024 extrapolated,
and refuses only past 32,768. A noul answer is its probability alone, and
kai-1.2 does not read a noul's criteria. The kai-1 harness and the v0.3.14
answers stay, labelled as kai-1's. Latency is production's: 38 ms p50 for
one yes/no question, 13.9 s for 100.
Once these pages compile they are rendered, and React refuses a string
style prop: the prerender of /docs/projects/hanzoai/esign stopped the
export. Each style attribute is now the object form of the same
declarations.
The build skips a page its MDX fails to compile and still exits 0, so the
s3, kv, ci, ml, datastore and nine more project pages were not on the site.
Void tags (img, source, br) are self-closed, unquoted attribute values quoted,
HTML comments written as MDX comments, a stray </div> and an unclosed
<details> dropped, and the lowercase {name} placeholders in datastore's JSX
spaced so the project loader's escape leaves them alone.
One page per tool: install, sign in, what the wrapper routes and what it does
not (Cursor and Antigravity keep their own backend and are neither routed nor
metered), how to read a session's usage and savings, and how to keep the tool's
own plan with --no-route. coding.mdx now lists all five agents.
zen-embedding-2 serves on api.hanzo.ai: text in 768 dimensions, shorter
by `dimensions`, prefixes in the text, its own vector space. It is
EmbeddingGemma 2 by Google DeepMind (Apache-2.0), which the License &
attribution section names and zen.upstream keeps out of the rest.
Claude-Session: https://claude.ai/code/session_01SCPMGSQsLNF2YtHFL4bwyp
The API keys page teaches PATCH and DELETE /v1/account/keys/KEY_ID, and
the pinned document (ec340375a) has no /v1/account/keys/{id}, so the
endpoint guard stopped every publish since that page landed. Cloud
e2d5eae3c (v8.5.647) serves it.
That document states the key classes on the `type` field a caller sends
and reads back, two levels under the schema, and the key-type reader
walked six deep and stopped at the schema. It walks eight now, enough to
reach a field's own sentence.
It also serves `train`, which files under Intelligence beside `ml`.
The theme is codeTheme from @hanzo/ui/core: Dracula on dark, GitHub
Light on light, the one every Hanzo surface draws. lib/shiki.ts and each
app's source.config.ts import it rather than naming a theme, so vesper
and github-dark are gone. @hanzo/ui moves to 8.27.83, the first release
that carries it.
A block's code area paints the theme's own ground and ink from the pre
shiki wrote, #282a36 in the dark, rather than the site's panel.
The docs home drew its hero and its eight domain snippets as plain text,
and so did the models page's fallback request. The hero highlights its
three doors in a server part (components/hero.tsx); the snippets and the
fallback are Example props in the MDX. No highlighter reaches the
browser.
A person holds as many keys as they like and creating one never touches
another. Document the new shape of /v1/account/keys (PATCH to edit,
DELETE /{id} to revoke one), the product/read permission entries and
read-only keys, budgets, rates and expiry, what an org admin sees, and
the corrected CSRF address and cache window.
models/kai: the results are kai-1's on the frozen harness, with
calibration error beside accuracy, the device the runs were measured
on, where Kai is behind, and the cardinality suite. The held-out
comparison named stage a5 only; kai-1 has not been run on held-out
rows, and the page says so. The architecture is described as built:
a factorized two-tower reader with a cross-attention head, and a
retrieval dual encoder above 160 options; score is a choice over the
levels, not an ordinal link. The paper link pointed at no public page.
decisions: 1 to 100 questions; a question and its state read 1,024
tokens together; checkpoint kai-1 and the routing fields v0.3.14 sends;
a noul's confidence; unrounded probabilities; Jev at $0.042 per million
input tokens; the errors with v0.3.14's statuses and messages.
guides/migrate/jev: the same limits; an over-long state is refused, not
truncated; options read to 512 tokens; Kai counts the request's text
once; kai-1's figures and an answer from its runtime; no latency until
one of the served build is published; Jev through Hanzo can answer 503
upstream_unavailable.
Cookbook: the recipes call api.hanzo.ai with a key, and the answers
they quote are kai-1's. models/index: Kai is served by API only.
Co-authored-by: Hanzo Dev <[email protected]>
Zen's verb is reasons, not generates or writes, and the trio reads in the
order a request meets it. The docs hero, the Models section's description,
its role table and its sidebar order, and the cookbook now say so, and the
Zen page drops "generative" from what the family is.
Co-authored-by: Hanzo Dev <[email protected]>
The landing opened on a pill and the CLI install; the three model families
and the catalogue they sit in were four screens down. They now follow the
headline: Enso routes, Kai decides, Zen reasons, each with its docs page
and its hanzo.ai page, and beneath them one full-width banner with the
model count, the maker count and a link to /docs/models.
The three cards are one row when three fit at 220px and one column
otherwise, never two and an orphan: the track floor is a third of the row
above 692px and the whole row below it, so the width alone picks.
Nothing on them is typed. gen-pricing-page already reads GET /v1/models for
the rates; it now also records the distinct ids, the distinct makers and
Kai's rate under `catalogue` in openapi-specs/pricing.json, and keeps the
committed copy when the catalogue does not answer. The count is floored to
the hundred so it stays true between builds, and the two "Over 400 models"
lines on the page read the same figure.
Co-authored-by: Hanzo Dev <[email protected]>
One page for Hanzo Dev in the browser, first in the Dev section: the composer's
choices, Templates (filters, the sheet, the copy published at <project>.hanzo.app,
a failed build's reason with Publish again and Fix it with Dev), Machines (install,
hanzo login, hanzo beat free, hanzo link for a shared shell paid from the balance,
and runs only on a machine whose runner claims them), and what needs a plan or credit.
Co-authored-by: Hanzo Dev <[email protected]>
On the forge runner the checkout carries the hanzo-docs/studio-docs submodule,
whose pages name its own /api/ paths, so no-api-prefix.test skips studio/ as it
skips the projects/ mirror. The runner's sandbox parses the API document slower
than vitest's 5s default, so the docs project allows a minute per test.
Co-authored-by: Hanzo Dev <[email protected]>
hanzoai/ci's certclaims check refuses a framework named beside a certificate word
(attestation, here) unless the line says compatible with, compliant with or built to.
Co-authored-by: Hanzo Dev <[email protected]>
420b65d80 put a curl call on the landing hero, /docs, /docs/quickstart and
/docs/api-keys that sends `Authorization: Bearer guest_temp_key` with model
`zen-free`. /v1/chat/completions answers that key 401, and /v1/models lists no
`zen-free`. apps/docs/scripts/quickstart.test.ts refuses a first-call page that
names a model the catalogue does not list, so the docs test failed on it.
Co-authored-by: Hanzo Dev <[email protected]>
Every conversion CTA reads "Try Hanzo" and goes to sign-in; payment comes
after it. The landing's close now does that in place of "Choose plan".
It no longer fires plan_clicked: it is not a plan choice, and the page view
and the $click that <Hanzo> autocaptures already record it. That leaves the
EVENTS re-export in @hanzo/docs-analytics with no caller, so it goes too.
GA4 and the Meta Pixel went into the root layout's <head> and into
@hanzo/docs-analytics, loaded on every page before any consent was asked,
beside a second and third Hanzo stream with their own keys. A vendor tag
loads only through the @hanzo/event tag manager, after consent, so both go,
and the docs report on the one @hanzo/event stream again.
This reverts 81733ecc4a and 6f0e2b2533.