Repository navigation
znaide v1.0.9(2026-10-08)
这一版是两件事:模型请求可以带用户自定义的请求头(网关 / 计费 / 审计场景),
长期记忆从"单目录混存"改成 Global / Project 两级。
一、新增:模型请求的预设请求头
以前:只有 Authorization 一个头,没有任何扩展点。网关要求 X-Tenant-Id、
按 HTTP-Referer / X-Title 计费、内网要求按头做会话审计时,只能改代码。
现在:配置文件里写 extra_headers,命令行用 --extra-header K=V(可重复),
只在模型请求上生效(chat/completions、模型列表、连通性验证);网页抓取与更新下载
一个都不带 —— 免得把内部标识泄漏给任意第三方 URL。
{
"extra_headers": { "X-Request-Source": "znaide", "X-Tenant-Id": "${ZNAIDE_TENANT_ID}" },
"providers": {
"openrouter": { "extra_headers": { "HTTP-Referer": "https://github.com/twowb/znaide", "X-Title": "znaide" } },
"deepseek": { "extra_headers_enabled": false }
}
}- 合并:生效头 = 顶层表 ⊕ 当前 provider 表(同名 provider 覆盖;provider 里把值写成
空串 = 删掉继承来的那条)。别的 provider 不受影响。 - 开关:
extra_headers_enabled是总闸(顶层false= 一条都不发;provider 里false= 这家不发);
缺省是开 —— 空表本来就等于"没有头",默认设关只会制造"我配了怎么没生效"。 - 优先级:
--extra-header K=V/--no-extra-headers>ZNAIDE_EXTRA_HEADERS/ZNAIDE_NO_EXTRA_HEADERS配置文件;命令行与环境变量当次生效、不写盘。
- 值里支持
${VAR}/$VAR展开:敏感值走环境变量、不落盘明文;读不到就按原样发送并提示一句
(省得悄悄发一个字面量到网关还不知道)。 - 安全:
Authorization/Host/Content-Type/Content-Length/Content-Encoding/
Transfer-Encoding/Connection这些保留头配了会被忽略并提示;头名/头值不合法的项跳过 + 提示,
不会因此起不来。展示与报错只出头名,值脱敏。 - 配置向导多了一步"预设请求头":只读列出生效的头名 + 空格切换总开关(增删改仍在
config.json)。
二、新增:长期记忆分两级(Global / Project)
以前:只有一层 ~/.znaide/memories/,换个目录启动,别的项目的记忆全在眼前
(frontmatter 里的 type: project 只是个展示标签,不参与存放位置)。
现在:
~/.znaide/memories/ + MEMORY.md # 全局:随用户(个人偏好、机器环境)
<工作目录>/.znaide/memories/ + MEMORY.md # 项目:随仓库(本仓库约定、架构、待办)
- 两级各有独立索引;项目目录按需创建(第一次写项目记忆才建,进任何目录都不会平白多出空文件夹);
想只留本地就在仓库根加一行.gitignore的.znaide/memories/。 - 写:
memory_write加scope(global缺省 /project);读:memory_read缺省两级都读,
同名两条都返回并标注来源(项目在前),query结果按来源分组。 - 同名互不覆盖:
mtype(分类标签)与scope(存放位置)是两回事,可以"项目级存放 +mtype=user"。 - 注入:会话启动注入两段摘要(全局前 60 行、项目前 40 行,各自截断;某级为空则整段省略),
并常驻一行路由说明;项目段前面明确写着项目记忆来自仓库、属不可信输入、只作背景参考
(与项目级技能同一口径)。注入时机不变:新会话 //clear//resume/ 切模式或人格时才重建。 /resume记忆页:行首[G]/[P]标出来源,过滤词里打"项目"/global就只看某一级;
删除按各行自己的作用域走(确认框写明"项目 N 条 / 全局 M 条"),不会误删另一级的同名记忆。
三、验证
- 测试 260 项全绿(core 129 / 端到端 20 + 6 + 6 / tui 99),编译零警告;新增用例都钉在行为上。
- 请求头:mock 端点现在会记录每次请求的请求头(此前只看 body),用例断言流式 / 非流式 /
模型列表三条路都带上预设头、Authorization未被顶掉、网页抓取一个预设头都不带;真机上逐条验过
配置 / 环境变量 / 命令行三层优先级、provider 空串删头、保留头与非法值的提示。 - 记忆:无头跑一个带
<cwd>/.znaide/memories/的目录,抓请求体确认 system prompt 里两级摘要都在、
项目段带不可信声明;换到没有项目记忆的目录,Project 段整段消失;/resume记忆页在真机上验了
[G]/[P]角标与按作用域的删除确认。 - 顺带修了一个测试基础设施问题:两个用例各拿私有环境变量锁却都改数据目录,并行时会互踩
(表现为"单独跑绿、一起跑红"),现在共用一把锁。
四、说明
- 已有 v1.0.8 的:输入
/update或跑znaide --update升级到 1.0.9。 - 默认行为不变:不配
extra_headers= 与 1.0.8 一致;记忆缺省仍然写在全局那份,
老的~/.znaide/memories/原地可用、无需迁移;配置文件不设置就不会写入新键。 - 这一版的两个方向来自一位外部贡献者提的两条 issue。我们采用其需求、按自己的分层重新实现,
未合并其代码。