Jarxi

Bolderdash

一套 API 客户端,两条鉴权通道

Web 用 HTTP-Only Cookie,CLI 用 Bearer Token。后端在中间件里双通道检查,前端把取凭证的方法注入进核心库——feature 代码因此完全不需要知道自己跑在哪个端。

接着上一篇讲的多端结构:三个外壳共享一套逻辑包。那鉴权怎么办? Web 端的标准做法是 HTTP-Only Cookie——浏览器自动带上,JS 读不到,防 XSS。CLI 没有浏览器,也没有 Cookie jar,只能用 Bearer Token。 两种凭证形态完全不同,但不该因此写两套 API。 后端:一个中间件,两条通道1234567891011121314151617export a......

Next.js 只是一个外壳,和 Electron 平级

多端 monorepo 里最容易搞错的一件事:把 Next.js 当成「主应用」,其他端当成「移植」。把它降级成外壳之后,包该怎么切就清楚了——尤其是 CLI 这种连 React 都装不了的端。

一个产品要同时有网页版、桌面版和命令行版。最自然的做法是先写 Next.js,然后想办法把它塞进 Electron,再想办法给 CLI 复用点什么。 这条路会很难走,因为它默认了 Next.js 是主应用。换个说法就顺了:Next.js 前端只是一个外壳,和 Electron 完全平级。CLI 是第三个外壳。三个外壳共享同一套逻辑包。 数据流flowchart TD W["Web 外......

跨包只写 import type,运行时全走 ctx

import type 编译后完全消失,不留下任何运行时加载。几十个 UI 包因此可以互相知道对方的类型,却谁也不加载谁——插件架构的分界线就在这一行语法上。

我在读一个”一切皆插件”的前端代码库,几十个 UI 包,彼此之间几乎没有 import。翻到某个包的开头看到这两行: 12import type { Context } from '@app/core'import type {} from '@app/ui-conversation/client' 第二行的花......

用模型给训练数据打分之前,先判两次看看

把会议转写做成 SFT 数据,我用一个大模型当裁判查事实。同一份输入判两次,一次说零处错误,一次说十几处。单次判定当门槛就是在抽签。

我在把一批会议转写做成 SFT 数据,目标是让一个小模型照固定模板写会议纪要。 管线搭完、过滤规则也写好之后,我顺手验了一件本该早点验的事:同一份纪要,同一个裁判模型,同样的参数,连判两次。第一次判出零处事实错误,第二次判出十几处。 下面是整个过程里值得记下来的几件事。 人工纪要不能当标准答案一开始我想的是拿”转写 + 人工纪要”直接配对。不行。 人工纪要是某个人开完会凭印象写的。它会漏掉决......

投机解码与 MTP:为什么"猜"是免费的

一次前向处理五个 token,和处理一个,耗时差不多——瓶颈在搬运权重,不在算术。这个差距就是投机解码全部的加速空间,而 MTP 是模型自带的那个草稿生成器。

我在一份 Megatron 转换流程的检查清单上看到”MTP round-trip”这一项,完全不知道它在说什么。两个缩写,一个连字符,而且显然重要到被人专门列成了一条待验证项。 搞明白它的过程把我带到了一个没预料到的地方。真正有意思的不是 MTP,而是投机解码为什么能成立——它建立在一个我原本理解反了的硬件事实上。 TL;DR 生成文字慢,是因为它严格串行:每出一个 token,就要完整跑......

special: true 到底改变了什么

编码时它什么都不改。解码时它决定一切——但只在 skip_special_tokens 打开的那一种情况下。全部结论用 GLM 5.2 的 tokenizer 实测得出。

这个问题是在我自己的 eval 脚本里冒出来的,这种发现方式挺丢人的。 12text = tokenizer.decode(output[0, input_len:], skip_special_tokens=True).strip()text = re.sub(r"<think>.*?</think>\s*", "", tex......

写完 Hexo skill 之后,又做了一个语气插件

第一个 Claude Code skill 在 ClawHub 上有 700+ 下载,这个数字意外到让我想再写一个。这次装的是我发帖时用的那些语气,而且会一直往里加。

我写的第一个 Claude Code skill 完全是为了自己方便。这个博客用 Hexo 发,工作流里毛刺不少,同样的东西我反复解释了好几遍,索性写下来一次:front matter 模板、SEO 检查项、部署路径、以及 Hexo 构建会以哪些方式静默失败。 它放在 ClawHub 上,攒了 700+ 次下载。 这个数字让我重新想了想。我写它的时候只当是给自己的备忘。结果一份”你已经亲手 ......

Chat Template 到底 tokenize 了什么

模型看不到你的 messages 列表,只看得到渲染完的那一串文本。想通这件事,add_generation_prompt、loss mask、双 BOS 这几个坑就串起来了。

tok.apply_chat_template(msgs, add_generation_prompt=True) 这行我抄过不知道多少遍,从来没细想过参数在管什么。官方 example 这么写,跑起来结果也对,就过去了。 直到要自己造 SFT 数据、自己算 loss mask,才发现这一行里每个东西都有讲究。今天把它拆开看了一遍,记一下。 最反直觉的一条先放这儿:模型根本不知道 messa......