ARTICLE · 1288047
空谷 Ondra 项目文档
空谷 Ondra
中文|English
于无声处,听见共鸣。
空谷 Ondra 是星玖工作室(Ntarstudio)出品的开源 AI 陪伴体应用,可一键部署、高度自定义。产品运行在 DeepSeek-Harness(下称 dsh)的 Cordis 插件体系之上,dsh 仅提供插件容器与运行时底座,产品的全部能力由 144 个 ondra-* 插件实现。
cordis/ | |
哦鲸鲸),夏柠柒为示例包 | |
开始阅读前建议先打开开发手册:
material/Ondra-dev-handbook.md。本文档的插件分层、参数取值与取舍均以该手册为唯一依据;两者不一致时以手册为准。
一、插件体系
1.1 分层与崩溃半径
插件按「崩溃后影响什么」分为十层,而非按功能数量分组。上层可调用下层,下层不得反向依赖;同层之间只经服务键通信,不互相导入源码。
1.2 插件契约
每个插件是一个独立 npm 包,入口固定导出四项:
export const name = 'ondra-memory-core' // 插件标识,同时是服务键export const inject = ['ondra-store-sqlite'] // 依赖的服务键,可选export function apply(ctx: Context) { } // 生命周期入口export const Config = { /* 配置结构与默认值 */ }
六条硬约束:
包间不互相 import,一律 ctx.get('ondra-xxx'),取不到则静默降级。默认给好,全部可调;简单模式四档,高级模式暴露具体数值。 失败静默降级,增强能力失效不影响主对话。 可逆注册,定时器、监听器、路由、面板均经 ctx.effect()或ctx.on()注册并返回 disposer。单一真源,数据结构与默认值由提供方拥有,消费方只读。 命名硬约束:服务键、工具名、配置键必须匹配 ^[a-z][a-z0-9_-]{1,63}$,统一使用连字符,不使用冒号。
1.3 组合包声明(漏写即静默不加载)
package.json 必须声明补丁文件:
{ ”dsh”: { ”bundle”: { ”patch”: ”./cordis.patch.yml” } } }未声明时宿主只在 stderr 输出一行 declares no dsh.bundle 便跳过该包,包虽存在于依赖目录、组合包清单中也写入了名字,但插件永远不会被加载。补丁语义为:insert 不带 id 时追加到根入口列表;insert 带 id 时目标必须是分组入口;不带 insert 的补丁行必须提供 id;目标不存在、非分组或名称不一致时只告警并跳过。入口字段只有六个:id、name、config、group、disabled、inject。
1.4 三档复用
1.5 器官 ABI(插件体系宪法)
涉及器官的插件必须遵守三条不可让渡约束:
C1 不直接写状态:器官只提交变更提议,由宿主累加后一次性应用并裁剪。 C2 为感知付费:每次感知返回能量回执,状态为 full、partial、starved或shadow;denied为真时必须立即放弃本次感知。C3 错误不传播:外层捕获异常,转为 degraded并返回空值。
上下文以门面形式暴露,仅开放 state、consume、emit、proposeGap、onToolResult、onTick、registerTool、onPrompt、kv、log。能力白名单默认拒绝,越权调用抛出 CapabilityDeniedError。提示词片段携带 order、ttl、confidence,疤痕权重恒为 -1e4,器官不得低于 -1000。
1.6 执行批次
二、B0 基座(5 个)
ondra-identity | apply 仅注册服务;命名在 app ready 之前完成,保证内置目录落在产品名下 | |||
ondra-path-layout | path.joinfs.mkdir 递归创建;目录 0700、文件 0600;chmod 失败不阻断(网络盘不支持权限),仅记录降级 | |||
ondra-clock | ||||
ondra-log-zh | ||||
ondra-config-schema |
三、B1 存储与模型网关(5 个)
ondra-store-sqlite | node:sqlitePRAGMA journal_mode=WAL 与 PRAGMA foreign_keys=ON;用 PRAGMA table_info 比对后对缺失列执行 ALTER TABLE;文件权限 0600 | |||
ondra-store-memory | Map | |||
ondra-data-migrate | ||||
ondra-snapshot | sqlite3 VACUUM INTO、node:sqlite 在线导出、文件复制;恢复前先复制一份 before-restore 留档;文件名白名单校验,绝不自动恢复 | |||
ondra-llm-gateway |
四、B2 记忆纵深(13 个)
ondra-memory-core | S(h) = baseHours × (0.45 + salience/100 × 1.25) × (1 + arousal × 0.65);11 类基线:约定 8000、自我 20000、人物 240、学习 80、情绪 50、事件 40、杂项 20、地方 12、饮食 10、日常 3、看片 2 小时;三通道 4/12/180 天作为第二层调制,先类别后通道相乘 | |||
ondra-memory-extract | ||||
ondra-memory-dedupe | ||||
ondra-memory-decay | 1 + 0.6·log2(1+次数),封顶 4 倍;重复提及拉长 min(15, 3×(1+ln(1+times_said))) 天;SM-2 间隔复习按记忆难度排期;归档只降强度不删除,30 天未带出强制补出 1 条 | |||
ondra-memory-recall | k1=1.2、b=0.75;新鲜度 0.5^(距上次想起÷半衰期),锚点为最近命中或创建时间;归一化只除以参与权重的因子;RRF 融合只看名次不看分数;召回不按条数截断 | |||
ondra-memory-graph | ||||
ondra-memory-prospective | ||||
ondra-memory-audit | forget 写墓碑且合并不复活、seal 封存、自然沉底、revise 保留旧文本且新版本合并必胜 | |||
ondra-memory-humanlike | p=0.15,命中则从弱记忆抽一条自然带出;弱记忆被提起 2 次升为强记忆,重要度 +0.1 | |||
ondra-memory-dream | decayed_at 游标,否则重复乘算)、软剪枝、荒诞联想、梦话、重写摘要;开工前在线备份,每步限额,删除一律软删;轻量分支在空闲 2 分钟与 5 分钟分两档,纯规则挖五类卡片,未用卡片 168 小时半衰期 | |||
ondra-memory-pool | ||||
ondra-evidence-gate | ||||
ondra-inject-dedupe | ||||
ondra-recall-eval |
五、B3 人格与情绪(15 个)
ondra-persona-loader | cordis/ondra-persona-skills/ 下的 *.skill.zip,解析包内 meta.json 与 SKILL.md;人设包只读,不写入、不改名;出厂人设为鲸鲸,示例包可替换 | |||
ondra-persona-core | ||||
ondra-persona-vars | {{name}}、{{callUser}}、{{relation}}、{{toneLevel}} 等占位;未识别占位原样保留而不清空;浓度三档生成不同强度的语气提示 | |||
ondra-persona-assemble | priority 只用于超预算时决定先砍谁;边界层整层豁免裁剪,超预算返回 overBudget 而不悄悄少一条禁令;总预算 1600 字符 | |||
ondra-worldbook | ||||
ondra-worldbook-scenes | includes 匹配;同层多张卡只留优先级最高一张,其余记入 suppressed;仅 L4 可递归拉起,深度不超过 3 | |||
ondra-drive-gap | tension = clamp(base + h×rate − relief) | |||
ondra-persona-evolve | threshold = base × (1 + 0.6 × min(1, interactions/5000))explainThreshold() | |||
ondra-emotion-core | v(t)=baseline+(v₀−baseline)·e^(−λt),λ=ln2/半衰期,读取时惰性补算;单条消息变化上限 0.12,标签上限 0.6,标签半衰期 45 分钟,心情 6 小时;多巴胺 50/45min、皮质醇 20/30min、血清素 50/120min;存档缺字段补基线 50 不补 0 | |||
ondra-emotion-diffuse | (mood − baseline) × 0.4 × (1 − familiarity × 0.5) | |||
ondra-emotion-stage | ||||
ondra-emotion-stress | ||||
ondra-emotion-conflict | ||||
ondra-emotion-express | ||||
ondra-emotion-project |
六、B4 对话链与表达(14 个)
ondra-dialogue | ||||
ondra-dialogue-protocol | ||||
ondra-rhythm | ||||
ondra-rhythm-typing | ||||
ondra-oral | ||||
ondra-breath | ||||
ondra-prompt-inject | ||||
ondra-filter-chain | ||||
ondra-lexicon | ||||
ondra-tts | ||||
ondra-tts-gate | ||||
ondra-expression-decide | ||||
ondra-sticker | stickers/,扩展名白名单为 png、webp、gif、jpg、jpeg;文件名下划线前为标签;目录缺失或为空时回退内置三张 | |||
ondra-avatar |
七、B5 主动与节制(8 个)
ondra-proactive-gate | ||||
ondra-proactive-reason | ||||
ondra-proactive-quota | ||||
ondra-climb | ||||
ondra-narrative-log | ||||
ondra-diary | ||||
ondra-live | ||||
ondra-weather | ||||
ondra-life-rhythm | ||||
ondra-onthisday |
八、B6 运行时治理(7 个)
ondra-organ-host | CapabilityDeniedError;能量回执状态机 full、partial、starved、shadow,迁移期默认 shadow 只记账不真扣;反馈仲裁累加后一次性应用再裁剪;提示词片段按 order 排序并过滤过期与低置信度;疤痕恒 -1e4 | |||
ondra-organ-gate | ||||
ondra-failure-attrib | ||||
ondra-memory-recognition | [[links]] 做邻域游走;与向量分支并列,默认仍以倒排为主 | |||
ondra-zero-residence | ||||
ondra-reflex | R-auto-<cause>-<tool>;跨器官 3 步以上成功链固化为技能;全过程零模型调用;写坏 3 次触发熔断,防止死循环烧钱 | |||
ondra-install-doctor |
九、B7 通道(13 个)
通道层遵循一条隔离铁律:一个通道一个插件,独立配置、独立凭据文件(0600)、独立日志命名空间、独立探针实例、独立启停。任一通道崩溃、超时或被风控,其余通道与主对话不受影响。
9.1 公共层(3 个)
ondra-router | ||||
ondra-channel-kit | callPersona 返回字符串或空值,人格服务缺席时告警并丢弃消息;chunkText 按上限切分;PeerHistory 每通道独立实例、仅内存、上限 12 条;刻意不做消息落盘与限流重试 | |||
ondra-channel-health | [channel] 前缀识别通道;以关键词判定正常与异常,无法判定则忽略;不依赖被观测进程存活,适配器崩溃时界面仍显示异常而非正常 |
9.2 合规通道(7 个)
ondra-adapter-qq-official | |||
ondra-adapter-wechat-official | |||
ondra-adapter-wechat-kf | sync_msg 并携带游标,回调仅作为有新消息的信号;只处理用户发来的文本;分条上限 800 字 | ||
ondra-adapter-wecom | |||
ondra-adapter-feishu | |||
ondra-adapter-dingtalk | |||
ondra-adapter-telegram | getUpdates | ||
ondra-adapter-discord |
9.3 高危通道(3 个)
ondra-adapter-qq-napcat | |||
ondra-adapter-wechat-personal | enabled 与 confirmed 同时为真才生效;只处理私聊文本,不读历史;全程本地不上报 |
十、B8 界面(14 个)
ondra-ui-shell | ||||
ondra-ui-tokens | #6E56E0(白字对比度 5.16:1),深色模式文字色与填充色分开使用;字号 7 档(15、13、12、11、14、13、10);圆角 6 档(4、6、8、10、12、999);间距 7 档(4 至 32);密度三档 | |||
ondra-ui-icons | ||||
ondra-ui-api | {ok, data} 或 {ok, error};未就绪返回 503 | |||
ondra-ui-chat | ||||
ondra-ui-sessions | ||||
ondra-ui-panel | ||||
ondra-ui-settings | ||||
ondra-ui-a11y | ||||
ondra-ui-theme | ||||
ondra-ui-toast | ||||
ondra-ui-logs | ||||
ondra-ui-growth | ||||
ondra-ui-prompt-preview | GET /api/prompt-preview |
十一、B9 多模态(3 个)
ondra-vision | ||||
ondra-asr | ||||
ondra-multimodal-memory | modality 与 source_path 便于溯源;与证据门控共用写入路径 |
十二、B10 端侧(8 个)
ondra-adb | ||||
ondra-device-mcp | ||||
ondra-desktop-mcp | ||||
ondra-browser | ||||
ondra-gui-agent | ||||
ondra-minecraft | ||||
ondra-pet | ||||
ondra-pet-mobile |
十三、B11 系统与交付(9 个)
ondra-privacy | ||||
ondra-startup-check | ||||
ondra-market | ||||
ondra-installer | bootstrap-ok 自检;多源回退与断点续传 | |||
ondra-process-host | ||||
ondra-window | ||||
ondra-onboarding | ||||
ondra-port-picker | ||||
ondra-dev-rebrand |
十四、B12 多方案分支(3 个)
ondra-store-json | ||||
ondra-memory-vector | ||||
ondra-emotion-hormone |
十五、B13 扩展池(24 个)
扩展池为独立可启停的增强能力,默认全部关闭,核心批次完成后按需启用。
ondra-grow | ||
ondra-persona-workshop | ||
ondra-memory-git | ||
ondra-memory-heal | ||
ondra-time-capsule | ||
ondra-trust-dashboard | ||
ondra-forget-right | ||
ondra-redteam | ||
ondra-digital-health | ||
ondra-crisis | ||
ondra-first-meet | ||
ondra-absence | ||
ondra-screen-sense | ||
ondra-dev-companion | ||
ondra-ambient | ||
ondra-theater | ||
ondra-weekly | ||
ondra-webhook-inbox | ||
ondra-ritual | ||
ondra-study | ||
ondra-cocreate | ||
ondra-consistency-bench | ||
ondra-sandbox | ||
ondra-daily-brief |
十六、目录结构
Ondra/├── README.md 中文主文档├── README_EN.md 英文完整版├── NOTICE 第三方依赖与许可声明├── LICENSE AGPL-3.0 全文├── package.json 仓库元信息与根依赖├── .gitignore 入库排除规则├── cordis/ 插件目录│ ├── ondra-master-plan.md 插件总纲:分层、依赖矩阵、参数速查、纪律│ ├── ondra-plugin-index.md 插件台账:144 项编号、档位、批次、状态│ ├── ondra-persona-skills/ 出厂与示例人设(2 个 .skill.zip:哦鲸鲸、夏柠柒)│ ├── ondra-beichen-api/ 预留插件位│ └── ondra-our-free-model/ 预留插件位├── material/ 文档与素材(随仓库分发)│ ├── Ondra-dev-handbook.md 开发手册(唯一正典)│ ├── image/ 品牌标识与界面预览图(Logo SVG/PNG、背景、三张视图)│ ├── morphicons/ 图标库:提取产物、图标集与上游仓库快照│ └── persona/ 角色人设包(10 个 .skill.zip)├── desktop/ 桌面壳与运行时源码│ ├── apps/ 应用入口与构建配置│ ├── packages/ 宿主与客户端包(workspace 包集合)│ ├── docs/ 架构、插件教程、接口参考│ ├── scripts/ 构建与维护脚本│ ├── website/ 官网静态站点│ ├── snapshots/ 快照测试基线│ └── vendor/ 源码内置的 Cordis 及基础库(9 项)├── tools/ 开发辅助脚本├── toolchain/ 工具链缓存(不入库,可由安装器重建)├── build/ 安装包输出(不入库)└── .backup/ 本地备份(不入库)
不入库目录说明:toolchain/ 存放便携运行时缓存,build/ 存放打包产物(macOS 的 dmg、Windows 的 nsis 以及解包后的应用目录),.backup/ 存放本地备份。三者均可由构建或安装流程重建,不进入版本库,避免仓库体积失控。
人设包分布:出厂人设与示例人设位于 cordis/ondra-persona-skills/,其余角色人设位于 material/persona/,两处合计 12 个。插件 ondra-persona-loader 同时扫描这两个目录。
十七、安装与运行
git clone https://github.com/ntars/Ondra.gitcd Ondra/desktoppnpm installpnpm run typecheckpnpm start
首次启动执行安装流水线:环境探测、组件下载、完整性校验、装配配置、安装组合包、隐私加固、视图设定、首启引导、启动主进程。数据目录在 macOS 为 ~/Library/Application Support/空谷 Ondra/,在 Windows 为 %APPDATA%\空谷 Ondra\;开发态使用带 -dev 后缀的独立目录,与正式版互不干扰。应用不写入用户主目录下的 dsh 与 agents 配置,不占用 3080 端口。
十八、配置说明
配置分四层,优先级由低到高为出厂默认、组合包默认、用户配置、运行时覆盖;升级只改动前两层。
每项改动立即写入后端,不存在仅存于浏览器本地的设置;需要重启生效的项在界面标注;恢复默认按分类执行。
十九、接口与性能
18.1 接口
本地接口挂载固定前缀,需令牌鉴权,请求头为 X-Ondra-Token。核心路由包括状态、对话(流式)、历史、会话、搜索、记忆读写、遗忘、情绪读写、关系阶段、人格读写、日期事实、日记、贴纸、市场、通道开关、通道健康、快照、提示词预览与健康检查。
18.2 实测数据
未提供冷启动、首屏、首字延迟与内存增长等指标:这些数值受硬件与模型端点影响显著,引用他处数据不具可比性。
二十、安全与隐私
数据本地化:会话、配置、凭据、记忆与工作区文件均位于应用数据目录,默认不上传。 隐私三道防线:配置层关闭会话日志上传(唯一真防线,实测 0/3 次携带)、环境层遥测开关、启动自检每次核对;配置被改动时拒绝启动。 出站清单:仅依赖镜像、运行时下载、模型端点、已启用通道与显式配置的天气接口;不含遥测、崩溃上报、账号校验与更新检查。 文件权限:目录 0700,记忆库与凭据 0600。 本地接口:令牌鉴权、定长比较、同源校验。 记忆不加密是主动取舍:本地加密对同机同用户攻击几乎无防护,却牺牲用户查看、导出与修复数据的能力;真正的防线在网络侧。 高危能力默认关闭:个人号通道、桌面自动化与开发者模式均需显式开启,个人号通道需双闸门确认。
二十一、兼容性与已知限制
20.1 平台
macOS(Apple Silicon 优先,Intel 可用)与 Windows x64 为首发平台;Linux 构建配置在位但未做发布验证;移动端形态待定,宣传口径为即将适配,不作内测承诺。
20.2 运行时
内置 Node.js 24;上游基线为 0.2.2-alpha.2,区间外不保证兼容;本地推理需自备 OpenAI 兼容服务。
20.3 已知限制
144 个插件处于分批交付阶段,未落地能力在界面显式标注「本版未实现」。 需要公网回调的通道必须由用户自备 HTTPS 地址。 群聊不做主动介入,仅响应明确提及。 桌面自动化仅支持单步,写操作逐条确认。 向量检索为可选分支,默认使用关键词与图谱。 部分依赖的许可证归属仍需逐项核对,已在 NOTICE 中标注待确认。
二十二、更新日志
1.0.1
按开发手册重排插件清单为三档复用结构,自研项压缩至 15 项以内。 新增 21 个插件:视觉、语音识别、多模态记忆、缺口池、阈值漂移、八池、器官 ABI、安装自检、爬楼、叙事日志、检索评估、语感统计与上下文治理七件。 服务键统一为连字符命名,强制组合包声明补丁文件。 关系阶段统一为七阶,进度条分母修正为 7。 出厂人设确定为鲸鲸,夏柠柒作为示例包。 双语文档按插件粒度重写,中英文章节一一对应。
1.0.0
首个对外版本,完成对话链路、记忆、情绪、人格、通道、语音与界面主体能力。 完成 macOS 与 Windows 安装包与一键部署流水线。 建立隐私三道防线与启动自检。
二十三、路线图
二十四、参与贡献
缺陷报告:提供复现步骤、预期与实际行为、环境信息与日志片段。 插件开发:遵循 cordis/ondra-master-plan.md的分层、依赖矩阵与命名规则;每个插件须写明职责、明确不负责的事项、技术来源与隔离自检结论。文档:中英文同步修改,章节一一对应。 素材:须确认授权范围,不得提交来源不明的文本、图像或音视频。 许可义务:本项目以 AGPL-3.0 发布,分发修改版本须保留 LICENSE 与 NOTICE,并在被索取时提供完整源码。
二十五、版权与许可
本项目:Copyright © 2024–2026 Ntarstudio(星玖工作室),以 AGPL-3.0-or-later 发布,完整条款见LICENSE。
上游:DeepSeek-Harness 及其生态组件版权归各自作者所有,以 MIT 许可发布;本项目保留全部上游声明,修改内容记录在NOTICE。
品牌与人格:Logo、图标与出厂人格文本不在 AGPL 授权范围内,二次分发须另行确认归属。
第三方组件:名称、版本、许可证、版权方与官方地址见NOTICE;无法确认归属的条目标注「见包内 LICENSE」,不做推断。
免责声明:本软件按现状提供,不附带任何明示或暗示担保;使用者自行评估适用性,作者不承担使用后果责任。
二十六、NOTICE 合规声明
本项目附带独立NOTICE,与本文档分离维护,不相互替代。NOTICE 包含:本项目版权与许可声明;上游 DeepSeek-Harness 的版权与 MIT 许可全文;源码内置依赖的逐项记录与修改说明;运行时与开发期依赖的完整清单;品牌素材与人格文本的授权范围;以及保留英文原文的法律条款。
分发本软件或其修改版本时,须完整保留 NOTICE 与 LICENSE,不得移除或修改其中的版权与许可声明。















































































