Skip to content

znaide 1.0.9

Latest

Choose a tag to compare

@twowb twowb released this 08 Oct 04:10

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。我们采用其需求、按自己的分层重新实现,
    未合并其代码。