release: v0.2.37 — zero-argument startup, first-run wizard, real download progress

Startup no longer needs arguments: the config is created on first launch, a busy
port is swapped for a free one, the console is open by default, and the browser
lands on a setup wizard that downloads a ready-made .cmf model and wires it into
routing (managed server + routing.default) when you press Finish.

Download progress was reported from curl's own meter, which prints a full
0→100% bar for the -L redirect hop before the transfer starts — so every job
showed 100% and then hung. Progress now comes from bytes on disk against the
size from the HuggingFace tree (or a HEAD request).

The UI and the gateway also disagreed about the output file name, so a finished
download never marked its card as downloaded; the gateway now returns the exact
stem and the UI sends it back verbatim for download, progress and delete.

Featured models are read live from the infosave HF account in both the wizard
and Import, and all 432 UI strings now exist in every one of the 7 languages.
This commit is contained in:
infosave2007
2026-08-06 17:56:42 +03:00
parent ad438a5dcb
commit 9ec8861464
25 changed files with 3154 additions and 234 deletions
+188
View File
@@ -280,4 +280,192 @@ export default {
"settings.cache.ttl": "条目 TTL",
"settings.cache.embed": "嵌入模型",
"settings.cache.note": "缓存设置将在重启后生效。",
// ── translated from en.js (previously falling back to English) ──
// nav
"nav.import": "导入模型",
// dash
"dash.clear": "清空日志",
"dash.clearConfirm": "清空所有已记录的统计与日志?此操作无法撤销。",
"dash.cleared": "日志已清空",
// models
"models.form.idOrModel": "请输入 id 或模型名称",
"models.form.apiKey": "API 密钥",
"models.form.apiKeyPlaceholder": "粘贴你的 API 密钥",
"models.form.apiKeyNotNeeded": "无需密钥(本地服务器)",
"models.form.apiKeyHint": "安全保存在网关中,之后不会再次显示。",
"models.form.keyStored": "已保存一个密钥 — 留空表示保留,或粘贴新的密钥替换。",
"models.form.keyFromEnv": "正在使用环境变量中的密钥。",
"models.form.paramsTitle": "生成与思考参数(O(1)、MTP、温度)",
"models.form.temperature": "温度",
"models.form.temperatureHint": "生成温度(0.0 = 确定性,1.0+ = 更有创造性)。",
"models.form.topP": "Top-P(核采样)",
"models.form.topPHint": "采样阈值(0.0 .. 1.0)。",
"models.form.maxTokens": "最大 token 数",
"models.form.maxTokensHint": "生成内容的最大 token 数。",
"models.form.thinkBudget": "思考模式 / 思考预算",
"models.form.thinkBudgetHint": "推理 token 预算(0 = 关闭,N > 0 = 推理 token 上限)。",
"models.form.systemPrompt": "默认系统提示词",
"models.form.systemPromptHint": "当请求中没有系统提示词时自动添加到前面。",
"models.form.systemPromptPlaceholder": "你是一个乐于助人的助手……",
"models.form.testKey": "测试并加载模型",
"models.form.testing": "检查中……",
"models.form.foundModels": "已加载 {n} 个模型",
"models.form.modelPlaceholder": "输入以搜索……",
"models.form.modelHint": "点击“测试并加载模型”用你的密钥拉取列表,然后选择一个。",
"models.managed": "托管",
"models.managedHint": "由托管的 CMF 服务器提供(设置 → 本地模型)。请在那里配置。",
// settings
"settings.router.enabled": "使用路由器(关闭 = 仅本地模型)",
"settings.cmf": "本地模型(CMF)",
"settings.cmf.localOnly": "仅使用本地模型",
"settings.cmf.manage": "运行本地模型服务器",
"settings.cmf.autoInstall": "自动安装 cortiq(crates.io)",
"settings.cmf.autoUpdate": "自动更新 cortiq",
"settings.cmf.model": "本地 .cmf 模型路径",
"settings.cmf.port": "本地服务器端口",
"settings.cmf.modelId": "模型在池中的 id",
"settings.cmf.note": "通过 cortiq 提供本地 .cmf 服务(github.com/infosave2007/cmf)。即使路由器不可用也能工作。",
"settings.cmf.threads": "工作线程",
"settings.cmf.gpu": "使用 GPU(Metal / wgpu)",
"settings.cmf.speedNote": "线程会并行化解码阶段的矩阵向量乘法(约快 3 倍;0 = 运行时默认值)。GPU 卸载主要加速长提示词的 prefill — 解码受内存带宽限制,因此在 Apple Silicon 上基本持平。",
"settings.cmf.pick": "选择一个模型",
"settings.cmf.models": "本地模型",
"settings.cmf.modelsHelp": "每一行都是网关运行的一个模型(各自独立的 cortiq serve,各占一个端口)并注册到模型池。有多少 .cmf 文件和空闲端口就可以加多少行。",
"settings.cmf.rowHint": "id · .cmf 文件 · 端口 · 线程 · GPU。改动在重启后生效;删除一行会停止对应的服务器。",
"settings.cmf.addServer": "+ 添加本地模型",
"settings.cmf.checkPort": "检查端口",
"settings.cmf.portFree": "端口空闲",
"settings.cmf.portBusy": "端口被占用",
"settings.cmf.useSuggested": "使用 {port}",
"settings.cmf.serving": "{model} 正在 :{port} 提供服务",
"settings.cmf.intro": "用 cortiq 引擎在本地运行模型 — 即使离线或路由器故障也能工作。",
"settings.cmf.runtime": "cortiq 运行时",
"settings.cmf.runtimeHelp": "用于加载和运行 .cmf 模型的命令行工具 `cortiq`。启动本地服务器前先安装一次。",
"settings.cmf.install": "安装 cortiq",
"settings.cmf.reinstall": "重新安装 / 更新",
"settings.cmf.installing": "安装中……(需要编译,几分钟)",
"settings.cmf.installedOk": "cortiq 已安装",
"settings.cmf.notInstalled": "未安装",
"settings.cmf.addModel": "添加模型",
"settings.cmf.addModelHelp": "模型在“导入模型”标签页下载并转换(HuggingFace → .cmf)。然后把下面的本地服务器指向该 .cmf 文件。",
"settings.cmf.importNote": "还没有模型?去导入一个:",
"settings.cmf.importLink": "打开导入",
"settings.cmf.modelHelp": "要提供服务的 .cmf 文件路径(例如 models/qwen.cmf),由导入标签页生成。要为不同任务准备多个模型?导入它们并切换此路径。",
"settings.cmf.portHelp": "本地模型服务器监听的 TCP 端口(默认 8081)。仅在与其他服务冲突时修改。",
"settings.cmf.threadsHelp": "生成时使用多少个 CPU 核心。越多越快(相比单核约快 3 倍);0 表示交给运行时决定。",
"settings.cmf.gpuHelp": "把矩阵运算卸载到 GPU(Metal/wgpu)。在 Apple Silicon 上主要加速长提示词 — 解码受内存带宽限制。",
"settings.cmf.localOnlyHelp": "把每个请求都发往本地模型,忽略路由器和所有云端供应商。",
"settings.cmf.manageHelp": "网关启动时会为下面的 .cmf 启动 `cortiq serve` 并把请求路由过去。需要已安装 cortiq(第 1 步)。重启后生效。",
"settings.cmf.autoInstallHelp": "如果启动时缺少 cortiq,自动从 crates.io 安装。",
"settings.cmf.autoUpdateHelp": "启动时如有更新版本,将 cortiq 升级到最新发布版。",
"settings.router.enabledHelp": "让 cortiq 路由器对每个请求分类(任务类型 + 复杂度)并挑选模型。关闭 = 仅使用本地路由表。",
"settings.router.verifyTlsHelp": "校验路由器的 TLS 证书。仅在使用自签名或绑定 IP 的证书时关闭。",
"settings.telemetry.metricsHelp": "在 GET /metrics 暴露 Prometheus 指标。",
"settings.cortiq.echoHelp": "在每个响应体中加入 `cortiq` 字段(任务、模型、成本)。响应头始终会发送。",
"settings.stats.enabledHelp": "记录最近的请求,为仪表盘和图表提供数据。",
"settings.cache.enabledHelp": "语义缓存:当新提示词与过去的某个非常相似时直接返回已保存的回答,跳过模型调用。需要池中有一个嵌入模型。",
"settings.log.bodiesHelp": "记录请求/响应的完整消息体。出于隐私考虑默认关闭。",
"settings.router.saveKey": "保存密钥",
"settings.router.keySaved": "路由器密钥已保存",
"settings.router.keyEmpty": "请先粘贴密钥",
"settings.router.secretHelp": "粘贴 api.allaigate.com 邮件中的密钥,然后点击“保存密钥”。这不是“API 密钥”页中的值 — 那些是给调用你网关的客户端用的。",
"settings.router.keyStoredMask": "•••••••••••• — 密钥已保存(再次粘贴可替换)",
"settings.route.strategyHelp": "发送给路由器用于分类的文本:last_user = 仅最后一条用户消息;last_user_plus_system = 最后一条用户消息 + 系统提示词;concat_all = 整段对话。",
"settings.route.maxCharsHelp": "发送给路由器的文本最大字符数(超出会截断)。越多分类越准,但路由器调用更慢也更贵。",
"settings.route.cacheTtlHelp": "相同请求的路由决策缓存多久后才再次询问路由器(例如 60s、5m)。",
"settings.route.profileHelp": "请求未指定时使用的默认路由档位:cost-saver(最省钱)、balanced 或 quality-first(最好的模型)。会影响路由器挑选哪个模型。",
// import
"import.subtitle": "在 HuggingFace 上搜索模型,转换为本地 .cmf 并提供服务。",
"import.searchPlaceholder": "搜索 HuggingFace 模型(例如 qwen3、llama)……",
"import.searching": "搜索中……",
"import.noResults": "未找到模型。",
"import.configure": "配置转换",
"import.outName": "输出名称",
"import.outNameHint": ".cmf 文件名(字母、数字、- 和 _)。",
"import.quant": "量化",
"import.convert": "转换并加载",
"import.converting": "转换中",
"import.started": "转换已开始",
"import.failed": "转换失败 — 请查看日志。",
"import.register": "注册为本地模型",
"import.registered": "已注册为 “{id}”。运行 cortiq-server 即可提供服务。",
"import.jobs": "下载与转换",
"import.cancel": "取消",
"import.cancelling": "正在取消 — 清理未完成的文件……",
"import.delete": "删除",
"import.deleteConfirm": "从磁盘删除该模型及其转换好的 .cmf 文件?",
"import.deleted": "已连同文件一起删除",
"import.state.running": "进行中",
"import.state.done": "完成",
"import.state.error": "错误",
"import.state.cancelled": "已取消",
"import.featuredTitle": "推荐的开箱即用 .cmf 模型",
"import.featuredSub": "来自 HuggingFace 上 infosave 账号的预转换 .cmf 模型 — 列表实时读取,新模型会自动出现。",
"import.readyCmfBadge": "现成 .cmf",
"import.directDownload": "下载",
"import.q.q8_2f": "8 位双场(𝒲×θ)— 推荐:质量与体积的最佳平衡。",
"import.q.q8_row": "8 位按行 — 简单稳健。",
"import.q.q4": "4 位分块 — 体积最小,质量较低。",
"import.q.q4_tiled": "4 位分块平铺(Q4_TILED)— 在 Metal GPU 上快 1.66 倍。",
"import.q.vbit": "可变 3–8 位 — 按专家分配位宽预算。",
"import.q.q1t": "1.58 位三值(Q1T)— BitNet b1.58,带稀疏离群值。",
"import.q.q1s": "1 位稀疏(Q1S)— 1 位基底,带全息离群值。",
"import.q.q1p": "1 位 PTQ(Q1P)— 1 位,带误差扩散。",
"import.q.q1": "1 位(Q1)— 纯二值格式。",
"import.q.f16": "16 位 — 不量化。",
"import.q.f32": "32 位 — 全精度(文件很大)。",
"import.adv.title": "高级设置",
"import.adv.auto": "自动",
"import.adv.linearCore": "线性核",
"import.adv.linearHint": "线性注意力层如何被保留或折叠。",
"import.adv.nphase": "vmf_phase 每头相位数",
"import.adv.vbitShape": "VBIT 预算形状",
"import.adv.meanBits": "VBIT 平均位宽",
"import.adv.shard": "分片上限(GB)",
"import.adv.noShard": "不分片",
"import.adv.skipMtp": "跳过 MTP 头",
"import.adv.o1": "O(1) 注意力",
"import.adv.o1Hint": "常量内存的流式注意力:prefill 之后释放 KV 缓存,因此长上下文不会持续增加内存。权重保持逐字节一致 — 只记录一个加载时的提示;随时可以切回(启动时加 --o1 off)。已在 Qwen3-0.6B 上验证:全部层约为 ×1.18 困惑度。",
"import.adv.o1Off": "关闭 — 精确注意力(默认)",
"import.adv.o1All": "all — 转换所有 softmax 层",
"import.adv.o1Deep": "deep N — 仅最深的 N 层",
"import.adv.o1Custom": "自定义 — 显式指定层列表",
"import.adv.o1DeepN": "最深的 N 层",
"import.adv.o1Layers": "层(用逗号分隔)",
"import.adv.o1mHint": "landmark 预算(默认 32)",
"import.adv.o1windowHint": "精确窗口宽度(默认 128)",
"import.adv.o1sinkHint": "常驻精确 sink key 数(默认 4)",
// onboarding
"onboarding.title": "初始设置",
"onboarding.welcome": "欢迎使用 Cortiq Gateway",
"onboarding.welcomeSub": "选择你的语言 — 随时可以在顶栏更改。",
"onboarding.next": "下一步",
"onboarding.back": "上一步",
"onboarding.skip": "暂时跳过",
"onboarding.skipSetup": "跳过",
"onboarding.finish": "完成设置",
"onboarding.featuredTitle": "开箱即用的模型(一键)",
"onboarding.featuredSub": "这些是 HuggingFace 上 infosave 发布的、已经转换好的 .cmf 模型 — 直接下载即可,无需转换。选择一个或多个即可立即开始。",
"onboarding.download": "下载",
"onboarding.hfTitle": "任意 HuggingFace 模型 — 自动转换",
"onboarding.hfSub": "搜索任意模型,选择量化方式,我们会自动把它转换为 .cmf。无需手动修改配置。",
"onboarding.noJobs": "还没有下载任务。",
"onboarding.doneTitle": "全部就绪",
"onboarding.doneSub": "下载好的模型会自动注册。之后可以在“导入模型”或“模型”中添加更多。",
"onboarding.doneHint": "“完成设置”会把每个下载完成的模型接入为本地模型,启动它的 .cmf 服务器并把路由指向它。这些之后都可以在“模型”中修改。",
"onboarding.willRegister": "将接入为本地模型",
"onboarding.nothingToRegister": "还没有下载完成的模型 — 没有可接入的内容。返回上一步选一个模型。",
"onboarding.registeredN": "已接入 {n} 个模型:{ids}",
"onboarding.runtimeMissing": "cortiq 运行时尚未安装 — 请在 设置 → 本地模型 中安装后才能运行这些模型。",
"onboarding.downloaded": "已下载",
"onboarding.update": "更新",
"onboarding.deleteFile": "从磁盘删除该 .cmf 文件",
"onboarding.confirmDelete": "删除 “{id}”?该 .cmf 文件将从磁盘移除。",
"onboarding.unregistered": "同时已取消注册:{ids}",
};