mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-30 14:58:08 +00:00
Every import, the catalog pin and the docs name @hanzo/app and github.com/hanzoai/app. lib/rooms.ts is lib/app.ts and components/rooms.tsx is components/app.tsx.
701 lines
29 KiB
TypeScript
701 lines
29 KiB
TypeScript
/**
|
||
* /zen — the open-weight family, marketed as two releases: Zen 6, what you can
|
||
* run today, and Zen 7, a research preview with nothing to call and nothing to
|
||
* download. Every earlier Zen model is a link to its own page under /models,
|
||
* not a section here. The generations are one program, read from
|
||
* components/zen/line.ts.
|
||
*
|
||
* A server component. The rail and the packing motion are the client pieces.
|
||
*/
|
||
import Link from 'next/link'
|
||
import { SiteFooter, SiteHeader } from '@/components/home/shell'
|
||
import { Siblings } from '@/components/family/Hero'
|
||
import { Splash } from '@/components/family/Splash'
|
||
import { Read } from '@/components/family/Read'
|
||
import { Band, Card, Head } from '@/components/marketing/band'
|
||
import { Sample } from '@/components/models/kit'
|
||
import { Code } from '@/components/code'
|
||
import { Box, Text, View, XStack, YStack } from '@/components/ui'
|
||
import { Action, More, Run } from '@hanzo/ui/marketing'
|
||
import { Grid } from '@hanzo/ui/grid'
|
||
import { signUp } from '@hanzo/app/lib/destination'
|
||
import { formatContext, modelPagePath, type ModelData } from '@/lib/models'
|
||
import { fetchModels } from '@/lib/models/served'
|
||
import { FLASH, NEXT, NOW, USES } from '@/lib/zen'
|
||
import { ModelCardSection } from '@/components/product/ModelCardSection'
|
||
import { AgentPrompt } from '@/components/product/AgentPrompt'
|
||
import Closing from '@/components/marketing/Closing'
|
||
import { product } from '@/lib/product'
|
||
import { CURL, DOWNLOAD_FLASH, DOWNLOAD_ZEN, LLAMA, PYTHON, SGLANG } from './commands'
|
||
import { DESKS, MEASURED, type Desk } from './desks'
|
||
import { SERVED } from './line'
|
||
import { Lineage } from './lineage'
|
||
import { Compress } from './compress'
|
||
import { CopyText } from './copy'
|
||
import { FAMILY, SOURCE, WEIGHTS } from './weights'
|
||
|
||
const INK = '$ink'
|
||
const DIM = 'var(--muted-foreground)'
|
||
const SECOND = 'var(--text-secondary)'
|
||
|
||
const OWNS = ['Download', 'Inspect', 'Fine-tune', 'Deploy', 'Fork'] as const
|
||
|
||
const COMPARE: readonly { label: string; zen: string; flash: string }[] = [
|
||
{ label: 'Parameters', zen: '27.3 billion, dense, plus a vision encoder', flash: '26,895,998,464 language-model weights' },
|
||
{ label: 'Weight format', zen: 'NVFP4 on the MLP and LM head, FP8 on attention', flash: 'Ternary, 1.77 bits per weight, 5.95 GB packed' },
|
||
{ label: 'Native context', zen: '262,144', flash: '262,144' },
|
||
{ label: 'Extended context', zen: '1,048,576 with YaRN', flash: '—' },
|
||
{ label: 'Text', zen: 'Yes', flash: 'Yes' },
|
||
{ label: 'Images', zen: 'Yes', flash: 'Yes' },
|
||
{ label: 'Video', zen: 'Yes', flash: '—' },
|
||
{ label: 'Runs on', zen: 'A GPU, with SGLang. Measured on one DGX Spark.', flash: 'A laptop or one GPU, with llama.cpp and Metal' },
|
||
]
|
||
|
||
export default async function ZenLanding() {
|
||
const { models } = await fetchModels()
|
||
const live = models.filter((m) => (SERVED as readonly string[]).includes(m.id))
|
||
const zen6 = live.find((m) => m.id === NOW.id)
|
||
const flash = live.find((m) => m.id === FLASH.id)
|
||
const earlier = live.filter((m) => !(NOW.ids as readonly string[]).includes(m.id))
|
||
|
||
return (
|
||
<>
|
||
<SiteHeader />
|
||
<Box render="main" bg="$background" $platform-web={{ color: 'var(--foreground)' }}>
|
||
<Splash
|
||
slug="zen"
|
||
kind="Open models"
|
||
name={NOW.name}
|
||
line="Open models. Yours to run."
|
||
lede="The open-weight family behind Hanzo, from a laptop to the datacenter. Download the weights, run them privately, or call them on Hanzo Cloud."
|
||
primary={{ label: 'Get API key', href: 'https://platform.hanzo.ai/keys' }}
|
||
secondary={{ label: 'Download the weights', href: '#download' }}
|
||
/>
|
||
|
||
<Band id="now" measure={1100}>
|
||
<Now />
|
||
<Earlier models={earlier} />
|
||
</Band>
|
||
|
||
<Band id="zen6" measure={1100}>
|
||
<Head
|
||
loud
|
||
eyebrow="Available now"
|
||
title={
|
||
<>
|
||
{NOW.name}.
|
||
<br />
|
||
Open now.
|
||
</>
|
||
}
|
||
lede="A 27.3 billion parameter dense model. Hybrid attention, a long context, images and video, and a speculative drafter bundled with the weights. The interesting part is not that it is the biggest. It is that you can run it."
|
||
/>
|
||
<Grid columns={{ min: 280, max: 2 }} gap={16}>
|
||
{USES.map((u) => (
|
||
<Card key={u.job} display="flex" flexDirection="column" gap="$2" p="$6" borderColor="var(--border)">
|
||
<Text render="h3" fontSize="$6" lineHeight="$6" fontWeight="600" color={INK}>
|
||
{u.job}
|
||
</Text>
|
||
<Text fontSize="$3" lineHeight="$3" color={SECOND}>
|
||
{u.detail}
|
||
</Text>
|
||
</Card>
|
||
))}
|
||
</Grid>
|
||
<Grid columns={{ min: 180, max: 3 }} gap={28} mt="$10">
|
||
<Stat value="27.3B" label="Parameters" />
|
||
<Stat value="262K" label="Native context" />
|
||
<Stat value="1M" label="With YaRN" />
|
||
</Grid>
|
||
<Text display="block" mt="$8" maxW={720} fontSize="$3" lineHeight="$3" color={SECOND}>
|
||
On one DGX Spark, the weight card records 62.4 tokens per second on code alone and 141.2 with the drafter. That figure is published with the weights. It is not a Hanzo harness.
|
||
</Text>
|
||
<YStack mt="$6" gap="$2" items="flex-start">
|
||
<More href={`#flash`}>{FLASH.name}</More>
|
||
<More href={WEIGHTS.zen6}>zenlm/zen6</More>
|
||
</YStack>
|
||
</Band>
|
||
|
||
<Band id="flash" measure={1100}>
|
||
<Head
|
||
loud
|
||
eyebrow={FLASH.name}
|
||
title={
|
||
<>
|
||
27B.
|
||
<br />
|
||
Laptop-sized.
|
||
</>
|
||
}
|
||
lede="The same generation, packed ternary. 26,895,998,464 language-model weights in a 5.95 GB file, 1.77 bits per weight, 9.0 times smaller than the 53.79 GB FP16 representation. Text and images. Not video."
|
||
/>
|
||
<Compress />
|
||
<Grid columns={{ min: 180, max: 3 }} gap={28} mt="$10">
|
||
<Stat value="5.95 GB" label="Dense packed" />
|
||
<Stat value="1.77" label="Bits per weight" />
|
||
<Stat value="262K" label="Native context" />
|
||
</Grid>
|
||
<Text display="block" mt="$8" maxW={720} fontSize="$3" lineHeight="$3" color={SECOND}>
|
||
Apple Silicon or one GPU, through llama.cpp and Metal. The card records 47.2 tokens per second alone and 92.4 with the drafter on M4 and M5 Max, in 7.84 GB with the projector and a 32K cache. Published with the weights. Not a Hanzo harness.
|
||
</Text>
|
||
<YStack mt="$6" items="flex-start">
|
||
<More href={WEIGHTS['zen6-flash']}>zenlm/zen6-flash</More>
|
||
</YStack>
|
||
</Band>
|
||
|
||
<Band id="desks" measure={1100}>
|
||
<Head
|
||
loud
|
||
eyebrow="Measured by Hanzo"
|
||
title={
|
||
<>
|
||
A frontier model.
|
||
<br />
|
||
On your desk.
|
||
</>
|
||
}
|
||
lede={`Hanzo ran ${NOW.name} on three machines it owns. These are the readings, in tokens a second.`}
|
||
/>
|
||
<Grid columns={{ min: 280, max: 3 }} gap={16}>
|
||
{DESKS.map((d) => (
|
||
<DeskCard key={d.machine} desk={d} />
|
||
))}
|
||
</Grid>
|
||
<Text display="block" mt="$6" maxW={760} fontSize="$2" lineHeight="$2" color={DIM}>
|
||
Hanzo's runs, {day(MEASURED)}. Decode is one request unless a line says otherwise, and each machine runs its own build of {NOW.name}. Where the Hanzo engine's prefill on CUDA beats llama.cpp is on the inference benchmark.
|
||
</Text>
|
||
<YStack mt="$4" items="flex-start">
|
||
<More href="/benchmarks/inference">Engine prefill on CUDA</More>
|
||
</YStack>
|
||
</Band>
|
||
|
||
<Band measure={896}>
|
||
<Head
|
||
loud
|
||
eyebrow="Open weights"
|
||
title={
|
||
<>
|
||
APIs can disappear.
|
||
<br />
|
||
Weights don't.
|
||
</>
|
||
}
|
||
lede="Download them, read them, fine-tune them, and run them where you want. Zen 6 is Apache-2.0, published by Zoo Labs Foundation, a 501(c)(3) non-profit."
|
||
/>
|
||
<YStack gap="$3" maxW={480} mx="auto">
|
||
<Text fontSize="$5" fontWeight="600" color={INK}>
|
||
Zen weights
|
||
</Text>
|
||
{['Your laptop', 'Your GPU', 'Hanzo Cloud'].map((place) => (
|
||
<Text key={place} pl="$4" fontSize="$4" color={INK} borderLeftWidth={1} borderColor="var(--border)">
|
||
{place}
|
||
</Text>
|
||
))}
|
||
</YStack>
|
||
<XStack mt="$8" gap="$4" flexWrap="wrap" justify="center">
|
||
<More href={FAMILY}>The family on Hugging Face</More>
|
||
<More href={SOURCE}>Source</More>
|
||
</XStack>
|
||
</Band>
|
||
|
||
{/* No overflow clip: a hidden ancestor makes the generation rail scroll away. */}
|
||
<Box
|
||
render="section"
|
||
id="lineage"
|
||
py="$12"
|
||
px="$4"
|
||
$sm={{ px: '$5' }}
|
||
$lg={{ px: '$6' }}
|
||
borderTopWidth={1}
|
||
borderColor="var(--border)"
|
||
$platform-web={{ scrollMarginTop: '96px' }}
|
||
>
|
||
<Box width="100%" maxW={1100} mx="auto">
|
||
<Head
|
||
loud
|
||
eyebrow="2023 to now"
|
||
title="Seven generations. One line."
|
||
lede="Foundation, then context, then a family, then scale, then the models that actually shipped. Each generation inherits the last, and the current one is the practical one."
|
||
/>
|
||
<Lineage />
|
||
</Box>
|
||
</Box>
|
||
|
||
<Band measure={896}>
|
||
<Head
|
||
eyebrow="Two artifacts"
|
||
title="Open weights, and a hosted id."
|
||
lede="The same name can be two things. A hosted id is not documented as the same bytes as a public repository with a similar name."
|
||
/>
|
||
<Grid columns={{ min: 260, max: 2 }} gap={16}>
|
||
<Card display="flex" flexDirection="column" gap="$2" p="$6" borderColor="var(--border)">
|
||
<Text render="h3" fontSize="$5" lineHeight="$5" fontWeight="600" color={INK}>
|
||
Open weights
|
||
</Text>
|
||
<Text fontSize="$3" lineHeight="$3" color={SECOND}>
|
||
Download. Self-host. Modify.
|
||
</Text>
|
||
</Card>
|
||
<Card display="flex" flexDirection="column" gap="$2" p="$6" borderColor="var(--border)">
|
||
<Text render="h3" fontSize="$5" lineHeight="$5" fontWeight="600" color={INK}>
|
||
Hosted
|
||
</Text>
|
||
<Text fontSize="$3" lineHeight="$3" color={SECOND}>
|
||
An API call. Managed. Metered.
|
||
</Text>
|
||
</Card>
|
||
</Grid>
|
||
</Band>
|
||
|
||
<Band measure={896}>
|
||
<Head
|
||
loud
|
||
eyebrow="Call it"
|
||
title={
|
||
<>
|
||
One call.
|
||
<br />
|
||
Any SDK.
|
||
</>
|
||
}
|
||
lede={`The gateway speaks the OpenAI API, so the SDK you already use works. Point it at api.hanzo.ai and ask for "${NOW.id}". The weights are the download.`}
|
||
/>
|
||
<YStack gap="$4">
|
||
<Sample lang="python">
|
||
<Code code={PYTHON} lang="python" />
|
||
</Sample>
|
||
<Sample lang="bash">
|
||
<Code code={CURL} lang="bash" />
|
||
</Sample>
|
||
</YStack>
|
||
<XStack mt="$5" gap="$3" flexWrap="wrap" items="center">
|
||
<Action href={signUp()} fill>
|
||
Try in Hanzo
|
||
</Action>
|
||
<CopyText text={CURL} label="Copy API call" />
|
||
<Action href="#download">Download weights</Action>
|
||
</XStack>
|
||
</Band>
|
||
|
||
<Band id="run" measure={1100}>
|
||
<Head
|
||
eyebrow="Run it yourself"
|
||
title="Three ways."
|
||
lede="Each command runs against the weights as published."
|
||
/>
|
||
<Grid columns={{ min: 280, max: 3 }} gap={16}>
|
||
<Card id="download" display="flex" flexDirection="column" gap="$4" p="$6" borderColor="var(--border)" $platform-web={{ scrollMarginTop: '96px' }}>
|
||
<Text render="h3" fontSize="$5" lineHeight="$5" fontWeight="600" color={INK}>
|
||
Download
|
||
</Text>
|
||
<Command line={DOWNLOAD_ZEN} />
|
||
<Command line={DOWNLOAD_FLASH} />
|
||
</Card>
|
||
<Card display="flex" flexDirection="column" gap="$3" p="$6" borderColor="var(--border)">
|
||
<Text render="h3" fontSize="$5" lineHeight="$5" fontWeight="600" color={INK}>
|
||
Local
|
||
</Text>
|
||
<Text fontSize="$3" lineHeight="$3" color={SECOND}>
|
||
{FLASH.name}. llama.cpp and Metal. Apple Silicon or one GPU.
|
||
</Text>
|
||
<Sample lang="bash">
|
||
<Code code={LLAMA} lang="bash" />
|
||
</Sample>
|
||
</Card>
|
||
<Card display="flex" flexDirection="column" gap="$3" p="$6" borderColor="var(--border)">
|
||
<Text render="h3" fontSize="$5" lineHeight="$5" fontWeight="600" color={INK}>
|
||
Production
|
||
</Text>
|
||
<Text fontSize="$3" lineHeight="$3" color={SECOND}>
|
||
{NOW.name}. SGLang, with the bundled drafter.
|
||
</Text>
|
||
<Sample lang="bash">
|
||
<Code code={SGLANG} lang="bash" />
|
||
</Sample>
|
||
</Card>
|
||
</Grid>
|
||
</Band>
|
||
|
||
<Band measure={1100}>
|
||
<Head eyebrow="Specifications" title={`${NOW.name} beside ${FLASH.name}.`} lede="Card facts only. A cell with no published value is left blank." />
|
||
<YStack borderTopWidth={1} borderColor="var(--border)">
|
||
<Box display="none" $md={{ display: 'grid', gridTemplateColumns: '1.1fr 1.2fr 1.2fr', gap: '$4', py: '$3' }}>
|
||
<Text fontFamily="$mono" fontSize="$1" color={DIM} />
|
||
<Text fontFamily="$mono" fontSize="$1" textTransform="uppercase" color={INK}>
|
||
{NOW.name}
|
||
</Text>
|
||
<Text fontFamily="$mono" fontSize="$1" textTransform="uppercase" color={INK}>
|
||
{FLASH.name}
|
||
</Text>
|
||
</Box>
|
||
{COMPARE.map((row) => (
|
||
<Box
|
||
key={row.label}
|
||
display="grid"
|
||
gap="$2"
|
||
py="$4"
|
||
borderBottomWidth={1}
|
||
borderColor="var(--border)"
|
||
$md={{ gridTemplateColumns: '1.1fr 1.2fr 1.2fr', gap: '$4', items: 'baseline' }}
|
||
>
|
||
<Text fontFamily="$mono" fontSize="$1" textTransform="uppercase" color={DIM}>
|
||
{row.label}
|
||
</Text>
|
||
<Cell name={NOW.name} value={row.zen} />
|
||
<Cell name={FLASH.name} value={row.flash} />
|
||
</Box>
|
||
))}
|
||
</YStack>
|
||
<ApiNote zen6={zen6} flash={flash} />
|
||
<View render="details" display="block" mt="$6">
|
||
<Text render="summary" display="block" cursor="pointer" fontSize="$3" color={INK}>
|
||
Layers, heads, and the files
|
||
</Text>
|
||
<YStack gap="$3" pt="$4" maxW={720}>
|
||
<Text fontSize="$3" lineHeight="$3" color={SECOND}>
|
||
{NOW.name} has 64 layers, 48 of them linear attention and 16 full attention, one full layer every fourth. Hidden size 5,120. 24 query heads and 4 key and value heads, head size 256. Vocabulary 248,320. The speculative drafter ships in the weights.
|
||
</Text>
|
||
<Text fontSize="$3" lineHeight="$3" color={SECOND}>
|
||
{FLASH.name} also publishes a 7.21 GB file at 2.14 bits per weight, which is the one the kernels read, a 629 MB vision projector, and a 2.06 GB drafter. With the projector and a 32K cache it stays under 8 GB.
|
||
</Text>
|
||
</YStack>
|
||
</View>
|
||
</Band>
|
||
|
||
<Band id="scored" measure={1100}>
|
||
<Head
|
||
loud
|
||
eyebrow="Scored"
|
||
title={
|
||
<>
|
||
Scored where
|
||
<br />
|
||
it counts.
|
||
</>
|
||
}
|
||
lede="The publisher scores the open weights. A Hanzo score of the family is a research run, and none is filed yet, so this page shows none. The two are never mixed."
|
||
/>
|
||
<Grid columns={{ min: 220, max: 3 }} gap={28}>
|
||
<Stat value="98.2%" label={`Kept by ${FLASH.name}'s ternary build`} />
|
||
</Grid>
|
||
<Text display="block" mt="$10" maxW={760} fontSize="$3" lineHeight="$3" color={SECOND}>
|
||
The weights report 86.33 at full precision and 84.78 for the ternary build across 14 reasoning suites: the publisher's numbers, not a Hanzo harness. {NOW.name} is not on the board yet, so this page does not borrow one.
|
||
</Text>
|
||
<YStack mt="$6" items="flex-start">
|
||
<More href="/benchmarks">Every benchmark</More>
|
||
</YStack>
|
||
</Band>
|
||
|
||
<Band measure={896}>
|
||
<Head
|
||
loud
|
||
title={
|
||
<>
|
||
Your model should
|
||
<br />
|
||
survive your vendor.
|
||
</>
|
||
}
|
||
lede="Weights you can hold, runtimes you can choose, infrastructure you control."
|
||
/>
|
||
<Run rest="var(--muted-foreground)" flexDirection="row" flexWrap="wrap" justify="center" gap="$5">
|
||
{OWNS.map((word, i) => (
|
||
<Text key={word} data-beat={i} fontSize="$6" lineHeight="$6" fontWeight="500" color="inherit" textTransform="uppercase">
|
||
{word}
|
||
</Text>
|
||
))}
|
||
</Run>
|
||
</Band>
|
||
|
||
<ModelCardSection
|
||
id="model-card"
|
||
badge="Zen · Foundation Models"
|
||
title="Open-weight intelligence. Full parameter specifications, endpoints, and runtimes."
|
||
description="Dense 27.3B foundation architecture with bundled speculative drafter, ternary quantization for edge deployment, 1M context with YaRN, and OpenAI-compatible streaming SSE."
|
||
modelId="zen6"
|
||
endpoint="POST https://api.hanzo.ai/v1/chat/completions"
|
||
specs={[
|
||
{ label: 'Parameters', value: '27.3 Billion (dense) + vision', mono: true },
|
||
{ label: 'Quantization', value: 'NVFP4 + FP8 · Ternary (Flash)', note: '5.95 GB packed for edge deployment' },
|
||
{ label: 'Context Reach', value: '262,144 native · 1,048,576 with YaRN', note: '1M tokens supported on Hanzo Cloud' },
|
||
{ label: 'Throughput', value: '141.2 tokens/sec (DGX Spark)', note: 'With bundled speculative drafter' },
|
||
{ label: 'Streaming Protocol', value: 'Server-Sent Events (SSE)', note: 'Includes reasoning_content tokens' },
|
||
{ label: 'Local Runtimes', value: 'llama.cpp · SGLang · vLLM · Metal', mono: true },
|
||
{ label: 'Weights & Licensing', value: 'Apache-2.0 on Hugging Face', note: 'huggingface.co/zenlm' },
|
||
]}
|
||
sdkLinks={[
|
||
{ language: 'Python', href: 'https://github.com/hanzoai/zen/tree/main/examples/cloud/client_cloud.py', tag: 'examples/cloud' },
|
||
{ language: 'Go', href: 'https://github.com/hanzoai/zen/tree/main/examples/cloud/client_cloud.go', tag: 'examples/cloud' },
|
||
{ language: 'Rust', href: 'https://github.com/hanzoai/zen/tree/main/examples/cloud/client_cloud.rs', tag: 'examples/cloud' },
|
||
{ language: 'TypeScript', href: 'https://github.com/hanzoai/zen/tree/main/examples', tag: 'examples' },
|
||
{ language: 'cURL', href: 'https://github.com/hanzoai/zen/tree/main/examples/cloud', tag: 'curl' },
|
||
]}
|
||
recipesLink={{
|
||
label: 'Modular Rust Recipes Crate',
|
||
href: 'https://github.com/hanzoai/zen/tree/main/recipes',
|
||
}}
|
||
githubRepo="https://github.com/hanzoai/zen"
|
||
huggingFaceUrl="https://huggingface.co/zenlm/zen6"
|
||
hfBadgeText="zenlm/zen6 on HF Hub"
|
||
docsUrl="https://docs.hanzo.ai/docs/models/zen"
|
||
sampleCode={{
|
||
lang: 'python',
|
||
code: `import os
|
||
from openai import OpenAI
|
||
|
||
client = OpenAI(
|
||
base_url="https://api.hanzo.ai/v1",
|
||
api_key=os.environ["HANZO_API_KEY"],
|
||
)
|
||
|
||
response = client.chat.completions.create(
|
||
model="zen6",
|
||
messages=[{"role": "user", "content": "Write a binary search in Rust."}],
|
||
stream=True,
|
||
)
|
||
for chunk in response:
|
||
print(chunk.choices[0].delta.content or "", end="")`,
|
||
}}
|
||
/>
|
||
|
||
<Read
|
||
eyebrow="Read"
|
||
title="Models, benchmarks, research."
|
||
lede="The weights you can run, where they are scored, and the writing."
|
||
groups={[
|
||
{
|
||
label: 'Models',
|
||
links: [
|
||
{ href: '#zen6', label: `${NOW.name} →` },
|
||
{ href: '#flash', label: `${FLASH.name} →` },
|
||
{ href: modelPagePath(NOW.id), label: `${NOW.name} card →` },
|
||
{ href: modelPagePath(FLASH.id), label: `${FLASH.name} card →` },
|
||
{ href: '/zen/models', label: 'The catalog →' },
|
||
{ href: WEIGHTS.zen6, label: 'zenlm/zen6 →' },
|
||
{ href: WEIGHTS['zen6-flash'], label: 'zenlm/zen6-flash →' },
|
||
],
|
||
},
|
||
{
|
||
label: 'Benchmarks',
|
||
links: [
|
||
{ href: '/benchmarks', label: 'The suite →', note: `${NOW.name} is not in the Hanzo-measured snapshot.` },
|
||
{
|
||
href: '/benchmarks/inference',
|
||
label: 'Inference →',
|
||
note: 'The engine. Zen 6 is not in that snapshot.',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
label: 'Research',
|
||
links: [
|
||
{ href: '#lineage', label: 'The lineage →' },
|
||
{ href: '#zen7', label: `${NEXT.name} →` },
|
||
{ href: NEXT.request, label: 'Request access →' },
|
||
{
|
||
href: 'https://hips.hanzo.ai/docs/hip-0039-zen-model-architecture',
|
||
label: 'HIP-0039 →',
|
||
note: 'The architecture.',
|
||
},
|
||
{
|
||
href: 'https://hips.hanzo.ai/docs/hip-0043-llm-inference-engine-standard',
|
||
label: 'HIP-0043 →',
|
||
note: 'The inference engine standard.',
|
||
},
|
||
{
|
||
href: 'https://papers.hanzo.ai/hanzo-cross-backend-inference/',
|
||
label: 'Cross-backend inference →',
|
||
note: 'The engine, not Zen’s scores.',
|
||
},
|
||
{
|
||
href: 'https://papers.hanzo.ai/hanzo-rocm-inference/',
|
||
label: 'ROCm inference →',
|
||
note: 'The engine, not Zen’s scores.',
|
||
},
|
||
{ href: SOURCE, label: 'zenlm →' },
|
||
{ href: 'https://hips.hanzo.ai', label: 'HIPs →' },
|
||
{ href: '/research', label: 'Research →' },
|
||
],
|
||
},
|
||
]}
|
||
/>
|
||
<Siblings name="Zen" />
|
||
{product('zen') && <AgentPrompt product={product('zen')!} />}
|
||
<Closing title="Open weights, on your hardware or ours." secondary={{ label: 'Download the weights', href: 'https://huggingface.co/zenlm/zen6' }} />
|
||
</Box>
|
||
<SiteFooter />
|
||
</>
|
||
)
|
||
}
|
||
|
||
/** The two releases: the one that answers now, with its pages under /models, and the research preview. */
|
||
function Now() {
|
||
return (
|
||
<Grid columns={{ min: 300, max: 2 }} gap={16}>
|
||
<Card display="flex" flexDirection="column" gap="$4" p="$7" borderColor="var(--text-secondary)">
|
||
<Text fontFamily="$mono" fontSize="$1" lineHeight="$1" textTransform="uppercase" color={DIM}>
|
||
{NOW.what}
|
||
</Text>
|
||
<Text render="h2" color={INK} fontWeight="600" $platform-web={{ fontSize: 'clamp(3.5rem, 7vw, 6rem)', letterSpacing: '-0.045em', lineHeight: '0.95' }}>
|
||
{NOW.name}
|
||
</Text>
|
||
<Text fontSize="$4" lineHeight="$4" color={SECOND}>
|
||
27.3B dense. 262K context, 1M with YaRN. Text, images and video. {FLASH.name} packs it into 5.95 GB for a laptop.
|
||
</Text>
|
||
<XStack gap="$5" flexWrap="wrap" mt="$2">
|
||
<More href={modelPagePath(NOW.id)}>{NOW.name}</More>
|
||
<More href={modelPagePath(FLASH.id)}>{FLASH.name}</More>
|
||
<More href="#run">Run it</More>
|
||
</XStack>
|
||
</Card>
|
||
<Card data-access="research" display="flex" flexDirection="column" gap="$4" p="$7" borderColor="var(--border)" borderStyle="dashed">
|
||
<Text fontFamily="$mono" fontSize="$1" lineHeight="$1" textTransform="uppercase" color={DIM}>
|
||
{NEXT.what}
|
||
</Text>
|
||
<Text render="h2" color={INK} fontWeight="600" $platform-web={{ fontSize: 'clamp(3.5rem, 7vw, 6rem)', letterSpacing: '-0.045em', lineHeight: '0.95' }}>
|
||
{NEXT.name}
|
||
</Text>
|
||
<Text fontSize="$4" lineHeight="$4" color={SECOND}>
|
||
The next generation, open to researchers by request. No public weights and no callable id yet.
|
||
</Text>
|
||
<XStack gap="$5" flexWrap="wrap" mt="$2">
|
||
<More href={NEXT.request}>Request access</More>
|
||
<More href="#lineage">The lineage</More>
|
||
</XStack>
|
||
</Card>
|
||
</Grid>
|
||
)
|
||
}
|
||
|
||
/** Every earlier Zen model the gateway still answers for, by the id a caller passes, one link each to its own page. */
|
||
function Earlier({ models }: { models: ModelData[] }) {
|
||
if (!models.length) return null
|
||
return (
|
||
<YStack gap="$3" mt="$8">
|
||
<Text fontFamily="$mono" fontSize="$1" lineHeight="$1" textTransform="uppercase" color={DIM}>
|
||
Earlier Zen models
|
||
</Text>
|
||
<XStack gap="$2" flexWrap="wrap">
|
||
{models.map((m) => (
|
||
<XStack
|
||
key={m.id}
|
||
render={<Link href={modelPagePath(m.id)} />}
|
||
px={12}
|
||
py={6}
|
||
rounded={9999}
|
||
borderWidth={1}
|
||
borderColor="var(--border)"
|
||
hoverStyle={{ borderColor: 'var(--foreground)' }}
|
||
$platform-web={{ borderRadius: '9999px', textDecoration: 'none' }}
|
||
>
|
||
<Text fontFamily="$mono" fontSize="$2" color={INK}>
|
||
{m.id}
|
||
</Text>
|
||
</XStack>
|
||
))}
|
||
</XStack>
|
||
<YStack items="flex-start" mt="$2">
|
||
<More href="/zen/models">The full Zen catalogue</More>
|
||
</YStack>
|
||
</YStack>
|
||
)
|
||
}
|
||
|
||
function Stat({ value, label }: { value: string; label: string }) {
|
||
return (
|
||
<YStack gap="$1" minW={0}>
|
||
<Text
|
||
color={INK}
|
||
fontWeight="600"
|
||
$platform-web={{ fontSize: 'clamp(2.5rem, 5vw, 4.25rem)', letterSpacing: '-0.045em', lineHeight: '0.92', fontVariantNumeric: 'tabular-nums' }}
|
||
>
|
||
{value}
|
||
</Text>
|
||
<Text fontFamily="$mono" fontSize="$1" lineHeight="$1" textTransform="uppercase" color={DIM}>
|
||
{label}
|
||
</Text>
|
||
</YStack>
|
||
)
|
||
}
|
||
|
||
|
||
/** A run's date, as a reader says it. */
|
||
function day(iso: string) {
|
||
return new Date(`${iso}T00:00:00Z`).toLocaleDateString('en-GB', { day: 'numeric', month: 'long', year: 'numeric', timeZone: 'UTC' })
|
||
}
|
||
|
||
function DeskCard({ desk }: { desk: Desk }) {
|
||
return (
|
||
<Card display="flex" flexDirection="column" gap="$4" p="$6" borderColor="var(--border)">
|
||
<YStack gap="$1">
|
||
<Text render="h3" fontSize="$5" lineHeight="$5" fontWeight="600" color={INK}>
|
||
{desk.machine}
|
||
</Text>
|
||
<Text fontFamily="$mono" fontSize="$1" lineHeight="$1" textTransform="uppercase" color={DIM}>
|
||
{desk.memory} · {desk.build}
|
||
</Text>
|
||
</YStack>
|
||
<YStack gap="$4">
|
||
<Reading value={desk.prefill} label="tok/s prefill" />
|
||
<Reading value={desk.decode} label="tok/s decode" />
|
||
</YStack>
|
||
{desk.more ? (
|
||
<Text fontSize="$2" lineHeight="$2" color={SECOND}>
|
||
{desk.more}
|
||
</Text>
|
||
) : null}
|
||
</Card>
|
||
)
|
||
}
|
||
|
||
function Reading({ value, label }: { value: string; label: string }) {
|
||
return (
|
||
<YStack gap="$1" minW={0}>
|
||
<Text
|
||
color={INK}
|
||
fontWeight="600"
|
||
$platform-web={{ fontSize: 'clamp(1.75rem, 3vw, 2.5rem)', letterSpacing: '-0.04em', lineHeight: '1', fontVariantNumeric: 'tabular-nums', whiteSpace: 'nowrap' }}
|
||
>
|
||
{value}
|
||
</Text>
|
||
<Text fontFamily="$mono" fontSize="$1" lineHeight="$1" textTransform="uppercase" color={DIM}>
|
||
{label}
|
||
</Text>
|
||
</YStack>
|
||
)
|
||
}
|
||
|
||
function Command({ line }: { line: string }) {
|
||
return (
|
||
<YStack gap="$2" items="flex-start">
|
||
<Text fontFamily="$mono" fontSize="$2" lineHeight="$2" color={INK}>
|
||
{line}
|
||
</Text>
|
||
<CopyText text={line} label={`Copy ${line}`} word="Copy" />
|
||
</YStack>
|
||
)
|
||
}
|
||
|
||
function Cell({ name, value }: { name: string; value: string }) {
|
||
return (
|
||
<YStack gap="$1" minW={0}>
|
||
<Text display="block" fontFamily="$mono" fontSize="$1" textTransform="uppercase" color={DIM} $md={{ display: 'none' }}>
|
||
{name}
|
||
</Text>
|
||
<Text fontSize="$3" lineHeight="$3" color={INK}>
|
||
{value}
|
||
</Text>
|
||
</YStack>
|
||
)
|
||
}
|
||
|
||
function ApiNote({ zen6, flash }: { zen6?: ModelData; flash?: ModelData }) {
|
||
if (!zen6?.context && !flash?.context) return null
|
||
return (
|
||
<Text display="block" mt="$5" maxW={720} fontSize="$2" lineHeight="$2" color={DIM}>
|
||
The API catalog lists {zen6?.context ? `${formatContext(zen6.context)} for ${zen6.id}` : 'no window for zen6'}
|
||
{flash?.context ? ` and ${formatContext(flash.context)} for ${flash.id}` : ''}. The weight cards state 262,144 tokens native, and YaRN to 1,048,576 for {NOW.name} only.
|
||
</Text>
|
||
)
|
||
}
|