Files
DeepSeek-Reasonix/docs/index.html
T
esengine e6db271d9f feat(config): the DeepSeek catalog is one declaration, and its rates are one table
The flash model is `deepseek-flash` everywhere: the id it is served under
lost the generation it never needed. An installed entry is renamed rather
than left behind, and the rename moves every key that named the old id with
it — a price or an effort list stranded under the old key stops answering
for the model that replaced it, which reads downstream as a setting the
user edited reverting to its default.

A preset is now what settles which of its models read images. Reading a
name misses every Kimi, Qwen, MiniMax and Claude model these presets
declare, and `deepseek-flash` spells nothing at all; the spelling stays the
last resort for an address nothing has declared, and stays a correctable
suggestion rather than a claim. The connection that existed only to reach an
image-taking model folds into the entry beside it once that entry reaches
the same model on the same key — unless its user configured it, because
folding would answer their edit by deleting where it lived.

A preset changing shape reaches installs holding the old one through one
declared shape per generation and one upgrade that brings a matching entry
forward. The guard is the whole shape, because an entry holding what we
shipped is ours to move and anything else its user curated. That retires
nine hand-written migrations that each recognised one vendor by hand.

Official list prices live once, in `officialRates`, oldest generation first.
A price change appends rather than edits: the superseded rate is what lets
an installed config be recognised as holding one of ours and brought
forward, instead of quoting a retired rate for the rest of its life. `config`
reads them through `billing.CurrentRate` and `SupersededRates` and restates
none of them — a table written twice is one that drifts, which is how a
vendor's USD rate ended up published on one side only.

`make pricecheck` reads each vendor's own page and compares it against that
table, and says how long ago a person last confirmed each one. It reaches
the network, so it stays out of lint and out of CI. A page it cannot read
exits non-zero: unread is its own verdict and never counts as agreement.
2026-09-13 18:47:33 -07:00

294 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Reasonix — DeepSeek-native coding agent for your terminal</title>
<meta name="description" content="Open-source AI coding agent for your terminal, engineered around DeepSeek's byte-stable prefix cache. Long sessions hold 90%+ cache hit and input-token cost collapses to ~1/5. A single Go binary. npm · Homebrew · desktop. MIT." />
<link rel="canonical" href="https://esengine.github.io/DeepSeek-Reasonix/" />
<link rel="icon" href="favicon.svg" type="image/svg+xml" />
<meta property="og:title" content="Reasonix — DeepSeek-native coding agent" />
<meta property="og:description" content="Cache-first AI coding agent for your terminal. A single Go binary. npm · Homebrew · desktop. MIT." />
<meta property="og:url" content="https://esengine.github.io/DeepSeek-Reasonix/" />
<style>
:root{
--bg:#f7f6f3; --paper:#fdfdfc; --ink:#16171a; --body:#3c3e44; --muted:#74777e; --faint:#9b9ea5;
--line:#e7e5df; --line-2:#dcd9d1; --accent:#2f5bd6; --code-bg:#17181c; --code-fg:#d7dae1;
--maxw:1060px; --radius:12px;
--mono:ui-monospace,"SF Mono","JetBrains Mono",Menlo,Consolas,monospace;
--sans:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;
--serif:"Iowan Old Style","Palatino Linotype",Georgia,"Songti SC",serif;
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;background:var(--bg);color:var(--body);font-family:var(--sans);font-size:17px;line-height:1.65;-webkit-font-smoothing:antialiased}
a{color:inherit;text-decoration:none}
::selection{background:#dfe6fb}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 28px}
nav{position:sticky;top:0;z-index:40;background:rgba(247,246,243,.82);backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}
.nav{display:flex;align-items:center;justify-content:space-between;height:64px}
.brand{display:flex;align-items:center;gap:9px;font-weight:600;font-size:17px;letter-spacing:-.02em;color:var(--ink)}
.brand .mk{width:22px;height:22px;border-radius:6px;background:var(--ink);color:#fff;display:grid;place-items:center;font-size:13px;font-weight:700}
.nav-links{display:flex;gap:30px}
.nav-links a{color:var(--muted);font-size:15px;transition:color .15s}
.nav-links a:hover{color:var(--ink)}
.nav-right{display:flex;align-items:center;gap:18px}
.lang{font-family:var(--mono);font-size:13px;color:var(--muted);background:none;border:none;cursor:pointer;padding:4px}
.lang:hover{color:var(--ink)}
@media(max-width:720px){.nav-links{display:none}}
.btn{display:inline-flex;align-items:center;gap:8px;font-weight:500;font-size:15px;padding:11px 20px;border-radius:9px;transition:.16s;cursor:pointer;border:1px solid transparent;white-space:nowrap}
.btn-dark{background:var(--ink);color:#fff;border-color:var(--ink)}
.btn-dark:hover{background:#000}
.btn-line{background:transparent;color:var(--ink);border-color:var(--line-2)}
.btn-line:hover{border-color:var(--ink)}
/* hero */
.hero{text-align:center;padding:104px 0 0}
.kicker{font-family:var(--mono);font-size:13px;letter-spacing:.04em;color:var(--muted);margin-bottom:30px}
.kicker .b{color:var(--ink)}
h1{font-size:clamp(40px,6.4vw,74px);line-height:1.05;letter-spacing:-.04em;font-weight:600;color:var(--ink);margin:0 auto 26px;max-width:14ch}
h1 em{font-style:italic;font-family:var(--serif);font-weight:500;color:var(--accent)}
.lede{max-width:600px;margin:0 auto 40px;color:var(--muted);font-size:clamp(17px,2.1vw,20px);line-height:1.6}
.lede b{color:var(--ink);font-weight:500}
.cta{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}
.install{display:inline-flex;align-items:center;gap:16px;margin:34px auto 0;font-family:var(--mono);font-size:15px;color:var(--ink);
background:var(--paper);border:1px solid var(--line-2);border-radius:10px;padding:13px 12px 13px 18px}
.install .p{color:var(--faint)}
.cp{cursor:pointer;background:var(--bg);border:1px solid var(--line-2);border-radius:7px;color:var(--muted);font-family:var(--mono);font-size:12px;padding:6px 11px;transition:.15s}
.cp:hover{color:var(--ink);border-color:var(--line-2)}
.cp.ok{color:#1a8f5a;border-color:#bfe3cd}
/* terminal */
.term{max-width:720px;margin:72px auto 0;text-align:left;background:var(--code-bg);border-radius:14px;overflow:hidden;
box-shadow:0 1px 0 rgba(0,0,0,.04),0 26px 60px -32px rgba(20,22,40,.5)}
.tbar{display:flex;align-items:center;gap:7px;padding:13px 16px;border-bottom:1px solid rgba(255,255,255,.07)}
.tbar i{width:11px;height:11px;border-radius:50%;background:#3a3d46;display:inline-block}
.tbar span{margin-left:10px;font-family:var(--mono);font-size:12px;color:#71757f}
.tbody{padding:20px 22px;font-family:var(--mono);font-size:13px;line-height:1.95;color:var(--code-fg);white-space:pre}
.tbody .u{color:#6f9bff}.tbody .i{color:#8fb4ff}.tbody .d{color:#6a6e78}
.tbody .k{color:#8fd6b0}.tbody .e{color:#c7a3f0}.tbody .c{color:#5a5e68}
@media(max-width:560px){.tbody{font-size:11.5px}}
/* sections */
section{padding:108px 0}
.lab{font-family:var(--mono);font-size:13px;letter-spacing:.04em;color:var(--accent);margin-bottom:16px}
h2{font-size:clamp(28px,4vw,42px);line-height:1.12;letter-spacing:-.03em;font-weight:600;color:var(--ink);margin:0 0 16px;max-width:18ch}
.sub{color:var(--muted);font-size:18px;max-width:560px;margin:0}
.head{margin-bottom:48px}
/* install tabs */
.tabs{display:flex;gap:24px;border-bottom:1px solid var(--line);margin-bottom:0}
.tab{font-size:15px;font-weight:500;color:var(--muted);background:none;border:none;border-bottom:2px solid transparent;padding:0 0 14px;cursor:pointer;transition:.15s;margin-bottom:-1px}
.tab.on{color:var(--ink);border-bottom-color:var(--ink)}
.tab:hover{color:var(--ink)}
.panel{display:none}.panel.on{display:block}
.block{position:relative;background:var(--code-bg);border-radius:12px;margin-top:24px;overflow:hidden}
.block pre{margin:0;padding:24px 26px;font-family:var(--mono);font-size:14px;line-height:2.1;color:var(--code-fg);white-space:pre-wrap;overflow-x:auto}
.block .p{color:#6f9bff}.block .c{color:#6a6e78}
.block .cp{position:absolute;top:14px;right:14px;background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.12);color:#aeb2bc}
.block .cp:hover{color:#fff}
.undertext{margin-top:16px;color:var(--muted);font-size:15px}
.undertext code{font-family:var(--mono);font-size:13px;background:var(--paper);border:1px solid var(--line);padding:1px 6px;border-radius:5px;color:var(--ink)}
.undertext a{color:var(--accent)}
.dls{margin-top:24px;border-top:1px solid var(--line)}
.dl{display:flex;align-items:center;gap:18px;padding:18px 6px;border-bottom:1px solid var(--line);transition:.15s}
.dl:hover{background:var(--paper)}
.dl .os{font-weight:600;color:var(--ink);min-width:84px;font-size:15.5px}
.dl .fn{font-family:var(--mono);font-size:13.5px;color:var(--body);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dl .ar{font-size:13px;color:var(--faint);white-space:nowrap}
.dl .go{color:var(--accent);font-family:var(--mono);font-size:14px}
@media(max-width:600px){.dl .ar{display:none}.dl .fn{font-size:12px}}
/* features */
.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:0;border-top:1px solid var(--line)}
@media(max-width:820px){.grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:540px){.grid{grid-template-columns:1fr}}
.feat{padding:34px 30px 34px 0;border-bottom:1px solid var(--line)}
.feat .n{font-family:var(--mono);font-size:12.5px;color:var(--faint);margin-bottom:14px}
.feat h3{font-size:18px;font-weight:600;color:var(--ink);margin:0 0 8px;letter-spacing:-.01em}
.feat p{margin:0;color:var(--muted);font-size:15px;line-height:1.6}
.feat code{font-family:var(--mono);font-size:12.5px;color:var(--ink)}
/* stats */
.why{display:grid;grid-template-columns:1fr 1fr;gap:64px;align-items:center}
@media(max-width:760px){.why{grid-template-columns:1fr;gap:40px}}
.nums{display:flex;flex-direction:column;gap:28px}
.num{display:flex;align-items:baseline;gap:18px;border-top:1px solid var(--line);padding-top:22px}
.num .v{font-size:40px;font-weight:600;letter-spacing:-.03em;color:var(--ink);min-width:120px}
.num .l{color:var(--muted);font-size:15px}
footer{border-top:1px solid var(--line);padding:44px 0}
.foot{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:16px;color:var(--faint);font-size:14.5px}
.foot a{color:var(--muted)}.foot a:hover{color:var(--ink)}
.foot-links{display:flex;gap:26px;flex-wrap:wrap}
[data-zh]{display:none}
html[lang="zh"] [data-en]{display:none}
html[lang="zh"] [data-zh]{display:inline}
html[lang="zh"] [data-zh].blk{display:block}
html[lang="zh"] h1,html[lang="zh"] h2{letter-spacing:-.02em}
</style>
</head>
<body>
<nav>
<div class="wrap nav">
<a class="brand" href="#top"><span class="mk">R</span>Reasonix</a>
<div class="nav-links">
<a href="#install" data-en>Install</a><a href="#install" data-zh>安装</a>
<a href="#features" data-en>Features</a><a href="#features" data-zh>特性</a>
<a href="#why" data-en>Why DeepSeek</a><a href="#why" data-zh>为何 DeepSeek</a>
<a href="https://github.com/esengine/DeepSeek-Reasonix">GitHub</a>
</div>
<div class="nav-right">
<button class="lang" id="lang">中文</button>
<a class="btn btn-dark" href="#install"><span data-en>Get started</span><span data-zh>开始</span></a>
</div>
</div>
</nav>
<a id="top"></a>
<header class="hero wrap">
<div class="kicker"><span class="b">v1.0.0</span> · <span data-en>a ground-up rewrite in Go · open source, MIT</span><span data-zh>Go 全新重写 · 开源 MIT</span></div>
<h1>
<span data-en>A <em>DeepSeek</em>-native agent for your terminal.</span>
<span data-zh><em>DeepSeek</em> 原生的终端编码 Agent。</span>
</h1>
<p class="lede">
<span data-en>The loop is append-only, aligned to DeepSeek's byte-stable prefix cache — so long sessions hold <b>90%+ cache hit</b> and input-token cost collapses to <b>~1/5</b>. One Go binary. Terminal-first.</span>
<span data-zh>运行循环 append-only,对齐 DeepSeek 字节稳定的 prefix-cache —— 长会话缓存命中 <b>90%+</b>,输入 token 成本降到 <b>约 1/5</b>。单个 Go 二进制,终端优先。</span>
</p>
<div class="cta">
<a class="btn btn-dark" href="#install"><span data-en>Get started</span><span data-zh>开始使用</span></a>
<a class="btn btn-line" href="https://github.com/esengine/DeepSeek-Reasonix"><span data-en>View on GitHub</span><span data-zh>在 GitHub 查看</span></a>
</div>
<div class="install">
<span><span class="p">$ </span>npm i -g reasonix</span>
<button class="cp" data-copy="npm i -g reasonix"><span data-en>Copy</span><span data-zh>复制</span></button>
</div>
<div class="term">
<div class="tbar"><i></i><i></i><i></i><span>~/app — reasonix</span></div>
<div class="tbody"><span class="u">$</span> reasonix
<span class="i">reasonix v1.0.0 · model deepseek-flash · ~/app</span>
<span class="d">cache 94.2% hit · session 18m · cost $0.043</span>
<span class="u">›</span> add retry with backoff to the http client
<span class="e">edit</span> internal/net/client.go <span class="c">+24 −3</span>
<span class="e">edit</span> internal/net/client_test.go <span class="c">+41 −0</span>
<span class="k">✓</span> go test ./internal/net/ ok 0.21s
<span class="d">2 files · cache 94.2% → 95.1%</span></div>
</div>
</header>
<section id="install" class="wrap">
<div class="head">
<div class="lab" data-en>Install</div><div class="lab" data-zh>安装</div>
<h2><span data-en>Up and running in one line.</span><span data-zh>一行命令,跑起来。</span></h2>
<p class="sub"><span data-en>The npm package pulls the prebuilt native binary for your platform — no Node runtime needed to run it.</span><span data-zh>npm 包自动拉取对应平台的预编译原生二进制 —— 运行时不需要 Node。</span></p>
</div>
<div class="tabs">
<button class="tab on" data-tab="npm">npm</button>
<button class="tab" data-tab="brew">Homebrew</button>
<button class="tab" data-tab="desk"><span data-en>Desktop</span><span data-zh>桌面端</span></button>
</div>
<div class="panel on" data-panel="npm">
<div class="block"><button class="cp" data-copy="npm i -g reasonix
reasonix setup
reasonix"><span data-en>Copy</span><span data-zh>复制</span></button><pre><span class="p">$</span> npm i -g reasonix
<span class="p">$</span> reasonix setup <span class="c"># config wizard → ./reasonix.toml</span>
<span class="p">$</span> reasonix <span class="c"># or: reasonix run "implement the TODOs"</span></pre></div>
<p class="undertext"><span data-en>Any OS · macOS, Linux, Windows × amd64/arm64. Short alias <code>dsnix</code> too.</span><span data-zh>任意系统 · macOS、Linux、Windows × amd64/arm64。</span></p>
</div>
<div class="panel" data-panel="brew">
<div class="block"><button class="cp" data-copy="brew install esengine/reasonix/reasonix"><span data-en>Copy</span><span data-zh>复制</span></button><pre><span class="p">$</span> brew install esengine/reasonix/reasonix</pre></div>
<p class="undertext"><span data-en>macOS. The cask pulls the archive from the latest release.</span><span data-zh>macOS。cask 从最新 release 拉取归档。</span></p>
</div>
<div class="panel" data-panel="desk">
<div class="dls">
<a class="dl" href="https://dl.reasonix.io/latest/Reasonix-darwin-arm64.zip" download>
<span class="os">macOS</span><span class="fn">Reasonix-darwin-arm64.zip</span><span class="ar" data-en>universal · Intel + Apple Silicon</span><span class="ar" data-zh>通用 · Intel + Apple Silicon</span><span class="go">↓</span>
</a>
<a class="dl" href="https://dl.reasonix.io/latest/Reasonix-windows-amd64-installer.exe" download>
<span class="os">Windows</span><span class="fn">Reasonix-windows-amd64-installer.exe</span><span class="ar" data-en>installer · x64</span><span class="ar" data-zh>安装器 · x64</span><span class="go">↓</span>
</a>
<a class="dl" href="https://dl.reasonix.io/latest/Reasonix-linux-amd64.tar.gz" download>
<span class="os">Linux</span><span class="fn">Reasonix-linux-amd64.tar.gz</span><span class="ar" data-en>x64</span><span class="ar" data-zh>x64</span><span class="go">↓</span>
</a>
</div>
<p class="undertext"><span data-en>Served from the R2 CDN (fast worldwide). Or browse <a href="https://github.com/esengine/DeepSeek-Reasonix/releases">all releases on GitHub</a>.</span><span data-zh>经 R2 CDN 分发(全球加速)。或在 <a href="https://github.com/esengine/DeepSeek-Reasonix/releases">GitHub releases</a> 浏览全部。</span></p>
</div>
</section>
<section id="features" class="wrap">
<div class="head">
<div class="lab" data-en>Features</div><div class="lab" data-zh>特性</div>
<h2><span data-en>Built for long, cheap sessions.</span><span data-zh>为长会话、低成本而生。</span></h2>
</div>
<div class="grid">
<div class="feat"><div class="n">01</div><h3 data-en>Cache-first loop</h3><h3 data-zh>缓存优先循环</h3><p data-en>Append-only history aligned to DeepSeek's prefix cache. 90%+ hit on long sessions; input tokens bill at ~1/5.</p><p data-zh>append-only 历史对齐 DeepSeek prefix-cache。长会话 90%+ 命中,输入 token 约 1/5 计费。</p></div>
<div class="feat"><div class="n">02</div><h3 data-en>Single Go binary</h3><h3 data-zh>单个 Go 二进制</h3><p data-en>CGO-free, cross-compiled for darwin/linux/windows × amd64/arm64. No Node runtime.</p><p data-zh>无 CGO,交叉编译覆盖 darwin/linux/windows × amd64/arm64。运行不需要 Node。</p></div>
<div class="feat"><div class="n">03</div><h3>MCP first-class</h3><p data-en>stdio, SSE, streamable HTTP. External servers merge their tools into one registry under a prefix.</p><p data-zh>stdio、SSE、streamable HTTP。外部服务器的工具以前缀合并进同一 registry。</p></div>
<div class="feat"><div class="n">04</div><h3 data-en>Plan mode + sandbox</h3><h3 data-zh>计划模式 + 沙箱</h3><p data-en><code>/plan</code> asks the model to plan first; Permissions and the workspace sandbox still govern every tool call.</p><p data-zh><code>/plan</code> 要求模型先规划;每次工具调用仍由权限与工作区沙箱控制。</p></div>
<div class="feat"><div class="n">05</div><h3 data-en>Subagents &amp; skills</h3><h3 data-zh>子智能体与技能</h3><p data-en>explore / research / review / security-review agents, plus Markdown skill scripts with isolated tools.</p><p data-zh>explore / research / review / security-review 子智能体,加 Markdown 技能脚本与隔离工具。</p></div>
<div class="feat"><div class="n">06</div><h3 data-en>Terminal-native</h3><h3 data-zh>终端原生</h3><p data-en>Not another IDE plugin. <code>git diff</code> handles diffs, <code>ls</code> handles trees — the terminal is the workspace.</p><p data-zh>不是又一个 IDE 插件。diff 交给 <code>git diff</code> —— 终端就是工作面板。</p></div>
</div>
</section>
<section id="why" class="wrap">
<div class="why">
<div>
<div class="lab" data-en>Why DeepSeek</div><div class="lab" data-zh>为何 DeepSeek</div>
<h2><span data-en>The cheapness is the point.</span><span data-zh>便宜,就是核心。</span></h2>
<p class="sub"><span data-en>Most agents pay full price for the same growing prompt every turn. Reasonix keeps the prefix byte-identical so DeepSeek's cache does the heavy lifting.</span><span data-zh>多数 agent 每回合都为同一段不断增长的 prompt 付全价。Reasonix 让前缀逐字节稳定,让 DeepSeek 的缓存替你扛下来。</span></p>
</div>
<div class="nums">
<div class="num"><div class="v">90%+</div><div class="l"><span data-en>cache hit on long sessions</span><span data-zh>长会话缓存命中</span></div></div>
<div class="num"><div class="v">~1/5</div><div class="l"><span data-en>input-token cost</span><span data-zh>输入 token 成本</span></div></div>
<div class="num"><div class="v">0</div><div class="l"><span data-en>Node runtime to run it</span><span data-zh>运行所需 Node</span></div></div>
</div>
</div>
</section>
<footer>
<div class="wrap foot">
<div>© 2026 Reasonix · <span data-en>MIT licensed</span><span data-zh>MIT 许可</span></div>
<div class="foot-links">
<a href="https://github.com/esengine/DeepSeek-Reasonix">GitHub</a>
<a href="https://www.npmjs.com/package/reasonix">npm</a>
<a href="https://platform.deepseek.com" target="_blank" rel="noreferrer">DeepSeek</a>
<a href="https://github.com/esengine/DeepSeek-Reasonix/releases"><span data-en>Releases</span><span data-zh>下载</span></a>
</div>
</div>
</footer>
<script>
var html=document.documentElement, langBtn=document.getElementById('lang');
function setLang(l){html.lang=l;langBtn.textContent=l==='zh'?'EN':'中文';try{localStorage.setItem('rx-lang',l)}catch(e){}}
var saved; try{saved=localStorage.getItem('rx-lang')}catch(e){}
setLang(saved||((navigator.language||'').toLowerCase().indexOf('zh')===0?'zh':'en'));
langBtn.onclick=function(){setLang(html.lang==='zh'?'en':'zh')};
document.querySelectorAll('.tab').forEach(function(t){
t.onclick=function(){
document.querySelectorAll('.tab').forEach(function(x){x.classList.remove('on')});
document.querySelectorAll('.panel').forEach(function(x){x.classList.remove('on')});
t.classList.add('on');
document.querySelector('[data-panel="'+t.dataset.tab+'"]').classList.add('on');
};
});
document.querySelectorAll('.cp').forEach(function(b){
b.onclick=function(){
navigator.clipboard.writeText(b.dataset.copy).then(function(){
var prev=b.innerHTML; b.classList.add('ok');
b.innerHTML='<span data-en>Copied</span><span data-zh>已复制</span>';
setTimeout(function(){b.innerHTML=prev;b.classList.remove('ok')},1400);
});
};
});
</script>
</body>
</html>