OpenHuman Privacy Mode 深入指南:在 Rust 核心强制执行的本地优先推理开关
【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman
OpenHuman 的 Privacy Mode(隐私模式)不是一段写在系统提示词里的"请勿外传"声明,而是位于 Rust 核心的强制执行卡点(enforcement chokepoint):在local_only模式下,核心在构造层就拒绝构建任何外部推理 Provider,从结构上保证没有任何代码路径能把推理数据送出设备。本文将围绕[privacy]配置块展开,解析三种模式的定义、[privacy]配置块的完整字段与默认值、推理工厂中的强制逻辑、运行时热切换 RPC,以及与本地模型栈(Ollama / LM Studio / MLX / Whisper / Piper)的组合用法,帮助你在完全离线、数据不出本机的条件下运行 Agent。
三种模式:一个配置块,三种数据出口姿态
OpenHuman 把隐私模式定义在[privacy]配置块中,共三种模式,序列化为 snake_case(local_only/standard/sensitive),与仓库的整体命名约定保持一致(见 配置 Schema 实现):
| 模式 | 含义 |
|---|---|
standard(默认) | 正常运行:托管云路由、BYO(Bring-Your-Own)云密钥、本地模型全部可用,无额外数据出口限制。 |
local_only | 任何推理数据不得离开设备。所有外部聊天 Provider(托管云、BYO 云密钥,甚至 Claude Code 这类 CLI 委托)都在构造时被拒绝。只有本地运行时可通过:Ollama、LM Studio、MLX 以及本地 OpenAI 兼容端点。 |
sensitive | 面向后续 PII 感知分层(检测、脱敏、目的地披露)的基础模式。当前版本行为与standard一致。 |
从源码看,PrivacyMode是一个带#[default]的枚举,缺失配置时回退到Standard。关键设计细节位于 src/openhuman/config/schema/privacy.rs:
PrivacyConfig被刻意设计成结构体而非裸枚举字段,目的是让后续切片(S2/S4/S5/S6/S7)可以新增按模式细分的旋钮(脱敏开关、目的地白名单、PII 阈值)而无需再做一次 schema 迁移(schema/privacy.rs);config.toml中缺失[privacy]块或mode键时,通过 serde 的#[serde(default)]自动解析为PrivacyMode::Standard,保证向后兼容(schema/privacy.rs)。
该模式的语义边界在模块注释中写得很明确:隐私模式管的是"数据可以离开设备多少",与自主性层级(AutonomyLevel:readonly / supervised / full)正交——后者管的是 Agent 能"做什么"(只读 / 监督 / 全权)。因此你完全可以运行一个完全自主的 Agent,同时不发送任何一字节的推理数据出设备(schema/privacy.rs)。
为什么"强制执行"比"提示模型遵守"可靠
大多数助手的隐私承诺只是系统提示里的一段话——模型可能被提示注入绕过、被工具调用带偏、或因为上游 bug 而违反。OpenHuman 的 Privacy Mode 刻意不是一种要求模型遵守的策略,而是一个结构性保证:
只要应用里任何一条代码路径在 local_only 模式下试图触达云模型,它在结构上就拿不到客户端。
该检查位于推理 Provider 工厂(src/openhuman/inference/provider/,实现拆分在factory_part_01.rs至factory_part_04.rs多个文件中)。核心决策函数是纯函数local_only_violation(factory_part_01.rs),逻辑如下:
- 模式不是
LocalOnly→ 直接放行(返回None); - Provider 字符串为空或是
"cloud"哨兵值 → 暂缓判断,待解析成具体字符串后递归重查; - 命中本地运行时(通过
is_local_provider_string,即 Ollama / LM Studio / MLX / local-openai)→ 放行; - 其余一律视为外部 Provider,返回人类可读的标签(如
OpenHuman (managed cloud)、Claude Agent SDK、Claude Code CLI,或<slug>:<model>中的 slug),用于报错信息。
工厂在构造聊天 Provider 前调用enforce_local_only_inference(factory_part_01.rs):放行时记录privacy_mode=... inference permitted的 debug 日志;拒绝时输出 warn 日志并返回明确错误:
Local-only privacy mode is active: this action needs external provider {label}. Switch to a local model (Ollama/LM Studio/etc.) or change privacy mode in Settings.错误信息会精确点名被拦截的外部 Provider,并给出两条修复路径:切换到本地模型,或在 Settings 中修改模式。这意味着该保证不依赖 prompt、不依赖 Agent 行为、不依赖工具实现,即使上游模型或工具存在缺陷,也无法拿到外部客户端。
值得注意的边界:BYOK 哨兵值(空字符串 /"cloud")在模型构造前会被解析成具体字符串并再次检查,避免"先放行哨兵、再解析成云 Provider"的绕过路径(factory_part_01.rs)。
[privacy]配置块:字段、解析与默认值
[privacy]块当前只有一个字段mode。在 配置操作层 中,用户输入经由parse_privacy_mode解析,大小写不敏感,且兼容少量连字符/空格写法:
// 解析规则(trim + 小写 + 连字符/空格归一为下划线后匹配) "local_only" | "localonly" | "local" => PrivacyMode::LocalOnly "standard" => PrivacyMode::Standard "sensitive" => PrivacyMode::Sensitive // 其余输入报错:invalid privacy mode '<other>' (expected local_only | standard | sensitive)在config.toml中的写法如下:
# 显式开启仅本地模式 [privacy] mode = "local_only" # 显式回到默认模式 [privacy] mode = "standard"如果完全省略[privacy]块或mode键,则回退到standard(schema/privacy_tests.rs 中有对应的 TOML 解析测试覆盖)。隐私模式与自主性配置相互独立:reload_privacy在热切换时会保留当前策略中的 autonomy 部分,反之亦然——避免一次仅修改自主性设置的操作意外重置数据出口姿态(live_policy.rs)。
运行时热切换:无需重启的 RPC 通道
隐私模式不仅可以通过配置文件静态设置,还提供了一对 RPC 操作,应用后立即对活动会话生效,无需重启核心(config/ops/privacy.rs):
get_privacy_mode:读取当前[privacy]模式,返回{ "mode": "<snake_case>" };apply_privacy_settings:接收PrivacySettingsPatch(mode字段为可选的"local_only" | "standard" | "sensitive"),解析 → 写入配置并save()持久化 → 调用reload_privacy热替换活动SecurityPolicy。
热替换的实现要点(security/live_policy.rs):reload_privacy克隆当前 in-flight 的 policy,仅替换privacy_mode字段,其余策略保持不变,返回新的 generation 编号。current_privacy_mode在没有安装会话策略时默认回退到Standard(放行),例如 CLI 场景(live_policy.rs)。如果当前尚未安装会话运行时(如纯 CLI 环境),热替换会失败但不会中断——持久化的值会在下次install时被拾取(config/ops/privacy.rs)。
RPC 的公开 Schema 描述(config/schemas/schemas_schema_part_01.rs)也明确了两点:get输出mode: local_only | standard | sensitive,并特别注明这与"自主访问模式"不同;set强调local_only在推理卡点阻塞外部模型调用,且无需重启即对活动会话生效。
与本地模型栈组合:完全离线的 AI 助手
local_only模式被设计为与 OpenHuman 的 Local AI 技术栈协同工作。开启后,你仍然可以获得完整的本地 AI 能力:
- 聊天与推理:使用你在 Settings 中下载的Ollama / LM Studio / MLX模型(对应源码中的本地 Provider 判定
is_local_provider_string,见 factory_part_01.rs); - 语音识别(STT):进程内Whisper(tiny → large-v3-turbo,一键安装),无外部二进制、无云端 STT;
- 语音合成(TTS):Piper,安装方式与 Whisper 相同;
- 本地向量嵌入:用于 Memory Tree 检索的本地 embeddings。
完整的纯本地搭建流程可参考 Use OpenHuman with a local model;更广视角的隐私数据保护演练见 Keep sensitive data private。
数据出口的强制执行边界
local_only管的是数据出口(data egress),而 OpenHuman 在安全模块中还有一层独立的 egress 强制机制(privacy epic S7 的一部分,见 security/egress/enforce.rs):local_only_blocks是一个纯决策函数——只有模式为LocalOnly、传输描述符标记为外部、且不属于控制面(control plane)时才返回true。控制面请求(如登录、Connections UI 的鉴权流程)不会被拦截,因为它们不携带用户内容,只携带认证令牌,拦截它们只会破坏登录体验而无隐私收益(egress/enforce.rs)。这与推理工厂中的local_only_violation构成"纯决策 + 强制执行"的同一对模式:先有可单测的纯函数,再由运行时读取 live policy 执行拦截。
该强制层不仅覆盖推理:在后续切片中,本地仅模式还会扩展到集成(integrations)、网络工具(curl / http_request / web_fetch)等场景——从源码结构看,网络工具模块(src/openhuman/tools/impl/network)与 egress 强制层已具备联动基础。
相关主题延伸
- Privacy & Security:完整信任模型(审批门禁、沙箱、路径根、命令分类);
- OS Keyring & Secret Storage:凭据存放位置;
- Local AI:设备端模型运行时。
小结:OpenHuman 的 Privacy Mode 用"构造层拒绝 + live policy 热切换 + 纯函数可单测"的组合,把隐私保证从"提示词层面"提升到了"结构层面"。对于需要完全离线运行的场景,你只需在 Settings 或config.toml中切换到local_only,再配合 Ollama / LM Studio / MLX、进程内 Whisper、Piper 与本地 embeddings,即可获得一个数据不出本机的自主 Agent。
【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考