配置
配置应该是一个产品里最无聊的部分。如果你得先研究配置才能把软件跑起来,那是软件的失职,不是你的。所以 Previously 对配置的态度是:默认值负责正确,医生负责自愈,你的手是例外情况。
两层配置,刻意的分离
Previously 的配置分成两层,分界线不是技术上的,是所有权上的。
机器层回答"这个产品在这台机器上怎么跑":端口、监听地址、内核位置、大脑是订阅桥接还是自带 key。这些事实属于这台机器——换一台电脑,它们没有任何理由跟过去。它们写在 ~/.previously/config.json 里(POSIX 系统上权限 0600,只有你自己能读)。机器层是本机(npm)形态的概念;部署到 Vercel 时,同样的事实由环境变量承担,见部署到 Vercel。
记忆层回答"你这个人偏好什么":用哪个模型、思考开不开、推理强度几档、时间切片切多长。这些偏好属于你,不属于这台机器,更不属于我们的数据库。所以它们不写进本地配置,而是写进记忆仓库里的 memory/user/config.json 和 memory/user/profile.md——你的偏好是记忆的一部分,记忆走到哪里,它们跟到哪里。这一层两种跑法完全通用:Vercel 部署里它们也是仓库里的同一些文件。这也解释了一个你可能注意到的细节:模型选择、思考强度这些设置持久化在服务端,而不是浏览器的 localStorage 里。换浏览器、换设备,你的偏好还在。
profile.md 是其中最有人味儿的一个文件:名字、称谓、时区、语言,外加一段自由文本。它每次请求都会被实时读取——聊天标题里 "Previously on" 后面跟的那个名字,就来自这里。
配置医生
Previously 自带一个配置医生,每次 previously init 和 previously start 都会跑一遍。它做的事很朴素:审计配置里的非法值(storage、端口、后端、大脑形态),修掉它们;审计并修复记忆仓库本身;动手之前先写一份 config.json.bak 备份;整个过程幂等,跑一百遍和跑一遍结果一样。
它有一条值得说出来的克制:如果你选了某个后端,它会替你推导出对应的 bridge 大脑;但如果你深思熟虑地选择了自带 key(BYOK),它永远不会"好心"地把 bridge 复活回来。医生修的是损坏,不是你的决定。
这意味着手工编辑配置文件这件事,在正常路径上几乎不存在。文件就在那里,格式列在篇末,但你打开它应该是例外,不是日常。
诚实的部分
有两件事我们选择明说。第一,apiKeys 目前是明文存储——这是 MVP 阶段的取舍,文件权限 0600 是现阶段的防线,请据此对待这个文件。第二,存在一批环境变量调节项(迁移主目录、跳过自动打开浏览器、bridge 超时之类),它们列在篇末,但你大概永远用不上——它们是为反常环境准备的,不是为你准备的。
一句话:Previously 希望你打开配置文件的理由只有一个——好奇,而不是求救。
参考:键清单
机器层 ~/.previously/config.json:
| 键 | 默认值 | 作用 |
|---|---|---|
storage | "local" | 存储后端。 |
memoryRoot | init 时指定 | 记忆仓库的位置。 |
port | 3210 | 内核监听端口。 |
hostname | 127.0.0.1 | 监听地址——默认只对本机。 |
executionBackend | — | 未显式指定时使用的默认 bridge agent。 |
brain | 由后端推导 | 大脑:{ "type": "bridge", "agent": "claude" | "codex" | "kimi" } 订阅桥接,或 { "type": "api-key", "env": "...", "model": "..." } 自带 key。 |
apiKeys | — | 手动录入的 key,明文存储(MVP 现状);start 时注入内核环境。 |
agents | — | 按 CLI 微调模型与推理强度;kimi 只支持调模型。 |
byok | — | 由内核 Web UI 设置页持有;客户端原样保留,绝不触碰。 |
kernelDir | — | 显式覆盖内核目录;正常路径不需要。 |
记忆层(记忆仓库内):
| 位置 | 作用 |
|---|---|
memory/user/config.json → maxSliceMinutes | 单个时间切片的最大时长,默认 30 分钟。 |
memory/user/config.json → maxTurnsPerSlice | 单片最大轮数,默认 50——纯粹的安全阀。 |
memory/user/config.json → 模型选择、思考开关与强度 | 服务端持久化,随记忆走。 |
memory/user/profile.md | frontmatter:name、pronouns、timezone、locale、address_as,外加自由文本;每次请求实时读取。 |
环境变量(很少需要):
| 变量 | 作用 |
|---|---|
PREVIOUSLY_HOME | 覆盖客户端主目录(默认 ~/.previously)。 |
PREVIOUSLY_NO_OPEN | start 后不自动打开浏览器。 |
PREVIOUSLY_HEALTH_TIMEOUT_MS | 等待内核健康检查通过的超时。 |
PREVIOUSLY_BRIDGE_<AGENT>_CMD / PREVIOUSLY_BRIDGE_<AGENT>_TIMEOUT_MS | 覆盖某个 bridge agent 的 CLI 命令与调用超时。 |
PREVIOUSLY_GIT_AUTHOR_NAME / PREVIOUSLY_GIT_AUTHOR_EMAIL | 记忆仓库 git 提交的作者署名。 |
PREVIOUSLY_READER_SCOPE | 记忆读取范围。 |
相关文档
- 本地优先 —— 为什么配置和记忆都长在你的机器上
- 记忆是一个文件夹 —— 记忆层配置文件所在的地方
- 双引擎 —— bridge 与 BYOK 两种大脑的区别
- 内核供应链 ——
kernelDir背后的版本纪律 - 部署到 Vercel —— 云端部署时机器层配置去了哪里