AI学习吧
📍 源码七号站 开源解码 开源个人 AI 助手 OpenHuman 完整拆解:从 Memory Tree 到 TokenJuice 的架构原理、上手实操与避坑指南

开源个人 AI 助手 OpenHuman 完整拆解:从 Memory Tree 到 TokenJuice 的架构原理、上手实操与避坑指南

摘要:OpenHuman:一个用Rust+Tauri打造的开源个人AI助手,通过20分钟自动同步的Memory Tree,将邮件、日历、代码仓库等数据压缩为本地Markdown知识库,让AI在第一次同步后即了解你的完整工作上下文。它包含智能Token压缩(成本降至1/5)、118+一键OAuth集成、自动模型路由、桌面吉祥物及Google Meet实时参与等功能,是2026年最值得关注的本地优先智能体项目。
字号 100%
行距 2.05
当前可见 60% 的内容
本文由 莫潇羽@源码七号站(www.fuyuan7.com)撰写,转载请注明出处。

快速摘要

OpenHuman 是一个用 Rust + Tauri 打造的开源个人 AI 助手桌面应用,GPL-3.0 协议,目前在 GitHub Trending 上长期高位,是 2026 年最值得关注的本地优先(Local-First)智能体项目之一。 它的核心思路不是再造一个聊天机器人,而是用一个 20 分钟自动同步的 Memory Tree 把你的邮件、日历、代码仓库、文档、聊天记录全部抓回本地,压缩成结构化的 Markdown 知识库,让助手在第一次同步完成的瞬间就具备了对你工作状态的完整(压缩后的)上下文。

最值得记住的几个关键词:

  • Memory Tree:本地知识图谱,存在 SQLite + Obsidian 兼容的 Markdown vault 里,不是向量数据库的"薄记忆",而是可以被人类直接打开、阅读、编辑的层级化摘要树。
  • Auto-Fetch:20 分钟一次的增量同步循环,每个活跃连接都会被定时拉取,新数据折叠进 Memory Tree,不需要你手动 prompt。
  • TokenJuice:智能 token 压缩层,工具输出在喂给大模型之前先被压缩去噪,官方声称能把 token 成本压到原来的 1/5 到 1/3
  • 118+ 一键 OAuth 集成:底层用 Composio 做连接器层,Gmail、Notion、GitHub、Slack、日历、Drive、Linear、Jira 等服务点几下鼠标就能接进来,无需手动管 API key。
  • 自动模型路由:一份订阅同时调度多家模型,推理走前沿模型,快任务走便宜模型,视觉走视觉模型,路由表可全局/单调用/技能级别覆盖。

适合谁? 想让 AI 助手真正了解你工作内容的人;不想在一堆 API key 和配置文件里折腾的人;重视隐私、希望数据存本地的人;喜欢 Obsidian 这类知识管理工具的人。不适合谁? 只想要一个写代码助手的人——那 Cursor、Claude Code 更对口。

想看完整拆解,往下翻。


第一章 我为什么开始研究 OpenHuman 这个项目

最近半年我自己在折腾各类 AI 智能体框架,从 Claude Code 到 OpenClaw、Hermes Agent,再到一些自己拼装的 MCP 服务,能用的都用了一轮。整体感受是:模型能力越来越猛,但落到"日常工作场景"里,体验还是差着一口气。

差在哪?我自己折腾下来,最直观的有三个点。

第一个是上下文一直在丢。 你今天跟它聊得很顺,明天换个会话又从头来。哪怕用了系统提示词、记忆插件,每次会话开始还是得花一段时间把背景再补一遍。它根本不知道我手上有哪几个仓库、最近 Linear 上的 ticket 都长什么样、上周和谁开过会、邮件里有几封是要回的。每次都得我手动喂。

第二个是接入太碎。 想让它读邮件,得装一个插件;想让它读日历,又得装一个;想让它读 Notion,又是另一套 API key。Cursor 的 MCP 还算干净一点,但 MCP server 也得我自己起、自己配、自己维护。三个月下来,我笔记本的 .env 文件已经接近半屏。

第三个是成本不可控。 大模型 token 一调就是几万几十万,邮件全文一塞进去,单次会话十几刀就出去了。我之前做过一个小实验,让助手把过去三个月的邮件做主题归类,跑了两次就肉痛了。

OpenHuman 跳出来的时候,我第一反应是——又一个高调的"个人 AI"项目。但翻了它的 README、gitbook 文档、源码目录之后,我发现这次它真的把上面三个痛点都正面回应了。这不是"又一个聊天框 + 工具调用"的壳,它在架构层面就把"如何让助手提前知道你"这件事重新设计了一遍。

这就是我决定花时间把它拆开看的原因。下面这十几节内容,是我自己跑了一周、翻了源码和 gitbook 之后的笔记,对外的版本——莫潇羽@源码七号站。


第二章 OpenHuman 到底是什么:一句话定位与三大支柱

2.1 一句话定位

OpenHuman 是一个 本地优先的桌面端开源 AI 智能体,定位写在它的 slogan 里——"Your Personal AI super intelligence. Private, Simple and extremely powerful."

翻译成人话就是:一个真正属于你个人的 AI 超级智能助手,强调隐私、强调开箱即用、强调能力上限够高。

它和 ChatGPT、Claude.ai 这类纯云端聊天产品不是一个物种。OpenHuman 是一个装在桌面上、长在你电脑里、了解你工作上下文的智能体。它有一张脸——桌面吉祥物;它有一颗大脑——Memory Tree;它有一双手——118+ 的第三方集成。

2.2 三大支柱

它给自己定的三个核心关键词,几乎是产品哲学的全部:

  • Private(私有):你的工作流数据存在本地,加密保存,不会上传到任何云端。Memory Tree 数据库、Markdown vault、工作区配置、本地运行状态全部留在你自己的设备上。
  • Simple(简单):从安装到第一个工作中的助手,几次点击就能搞定,不需要终端,不需要写配置文件。
  • Powerful(强大):118+ 应用集成 + 持久化记忆 + 智能压缩 + 多模型路由,能力上限对标主流商业产品。

2.3 技术栈速览

底层用 Rust + TypeScript 构建,桌面端基于 Tauri v2 封装,整个仓库里 Rust 占比超过 65%,前端用 React 19 + Redux Toolkit + Tailwind CSS。

License 是 GPL-3.0,意味着可以自由使用、修改、分发,但衍生作品也必须开源。如果你打算基于它做商业化产品,得留意这个协议的传染性。

项目仓库 2026 年 2 月才公开,目前还处于 Early Beta 阶段,更新频率很高——发布频道几乎每周都有新版本出来。我截稿时它已经发到 v0.54.0,距上一个版本只隔了不到一周。

2.4 它和"通用聊天机器人"的本质区别

通用聊天机器人是无状态的:你给它一段 prompt,它给你一段回答,然后上下文蒸发。换个会话,它就什么都不记得了。

OpenHuman 把这件事反过来了。它默认假设你不会跟它讲背景,所以它要自己想办法把背景搞到手。它通过 OAuth 把你的工具接进来,然后跑一个 20 分钟一次的同步循环,把你工作面板上每个活跃服务的数据都拉一遍,丢进 Memory Tree,建一个层级化的知识图谱。

这是它和市面上 99% 的 AI 助手最本质的差别:它了解你这件事,是产品自带的,不是你训练出来的。


第三章 它正面回应的四个核心痛点

接下来这四个痛点,我个人觉得是目前所有"通用型 AI 助手"绕不过去的坎。OpenHuman 给的方案不一定完美,但起码不是回避。

3.1 痛点一:冷启动问题

绝大多数 AI 助手刚开始用的时候是"空白"的。它不知道你手上有什么项目,不知道你昨晚的邮件里写了什么,不知道你下周三上午有会。你得花好几天甚至好几周时间,去把上下文一点点喂给它,让它慢慢"懂"你。

我自己以前用 Claude Code 时,要写一个工程化的 prompt 模板,开会前先 paste 一段背景、塞一段角色设定、贴一段最近的 commit log——非常累。

OpenHuman 的思路是:与其等你来喂背景,不如我主动去抓

具体是用 Auto-Fetch + Memory Tree 这两个机制配合,每 20 分钟自动同步一次你的 Gmail、Notion、GitHub、Slack、日历、Drive 等数据源,然后把这些信息压缩成 ≤3k token 的 Markdown 片段,构建成本地的知识图谱。

第一次同步完成后,助手就已经对你的工作状态有了完整(压缩后的)上下文。不需要训练期,不需要"给我几周时间适应你"。

flowchart LR
    A[第三方服务<br/>Gmail/Notion/GitHub等] -->|OAuth| B[Auto-Fetch<br/>20分钟轮询]
    B --> C[Canonicalize<br/>标准化为Markdown]
    C --> D[Chunk<br/>切成≤3k token片段]
    D --> E[Score<br/>评分]
    E --> F[Seal<br/>密封摘要桶]
    F --> G[Memory Tree<br/>层级摘要树]
    G --> H[Obsidian Vault<br/>.md 文件]
    G --> I[SQLite<br/>本地数据库]

3.2 痛点二:数据孤岛 + API 密钥散落

如果你用过 Claude Code,你大概率配过 Anthropic 的 API key;用过 OpenClaw,又得对各家服务自己接;用 Hermes,又是另一套。

结果就是 API 密钥到处飞,各个服务之间数据不互通,想做一个跨平台的工作流极其麻烦。我之前甚至专门写了一个本地的密钥管理脚本,就为了别让一堆 .env 文件互相打架。

OpenHuman 的做法是:一键 OAuth + 托管后端

底层用 Composio 做连接器层。你只需要登录 OpenHuman 账号,然后点几下鼠标,就能把 Gmail、Notion、GitHub、Slack、Stripe、Linear、Jira 等服务接进来。OAuth 握手和 API 调用都通过它们的托管后端代理(也支持自托管直连模式)。

一个账号,搞定所有集成。 这种做法的好处是:你的 API key、token 不需要落地在本机的明文文件里,agent 看到的只是工具调用的结果,看不到凭证本身。

3.3 痛点三:记忆机制不够完善

Claude Code 的记忆是会话级(chat-scoped)的,换一个会话就忘了;OpenClaw 依赖插件来实现持久化;Hermes 虽然能"观察你工作"的方式来学习,但配置门槛偏高。

OpenHuman 的设计是:Memory Tree + Obsidian Wiki

所有同步下来的数据都会被组织成一个层级化的 Markdown 知识库,存储在本地 SQLite 数据库中,同时也会生成 Obsidian 兼容的 .md 文件,你可以用 Obsidian 直接打开、浏览、编辑。

这个设计灵感来自 Andrej Karpathy 之前在 GitHub Gist 上分享的 LLM Wiki 模式:与其每次都做 RAG 检索,不如把知识"编译"一次成结构化的、互相链接的 Markdown 文件,让 LLM 直接基于它推理。Karpathy 自己用这套方法管理了超过 100 篇文章、40 万字的个人知识库——OpenHuman 把这件事产品化了。

3.4 痛点四:Token 消耗太快

这是最现实的问题之一。每次调用 LLM,如果上下文太长、工具返回的内容太多,token 消耗就很大,成本和延迟都会上去。

举个例子,一个繁忙仓库里跑一次 git status、一个真实集群里跑一次 docker ps -a、一个 600 楼的邮件 thread——任何一个塞进上下文,都能把窗口撑爆,但里面真正有价值的信息可能只有几百 token。

OpenHuman 内置了一个叫 TokenJuice 的智能压缩层,工具输出在进入模型上下文之前会先过一遍规则化的压缩管线。下一节专门展开。


第四章 Memory Tree:本地知识图谱的实现原理

Memory Tree 是 OpenHuman 的灵魂,理解它之前先做一个澄清——它不是一个套了"记忆"皮的向量数据库

4.1 它和向量数据库的区别

主流的 "AI 记忆" 方案绝大多数是这样的:把文档切片,每片做 embedding,存到 Pinecone/Weaviate/Chroma 这类向量库里,查询时做相似度检索。这个方案的问题是不可解释、不可编辑、不可审计——你打开数据库看到的是一堆浮点数向量,根本不知道里面装了什么。

OpenHuman 的 Memory Tree 走的是另一条路:一个确定性的、按桶密封(bucket-sealed)的管线,把你一天里乱七八糟的数据流(聊天、邮件、文档、集成同步结果)变成结构化的、可查询的、有摘要支撑的 Markdown,存在你自己的机器上。

4.2 三层结构

知识被组织成三个平面:

层级

内容

举例

主题节点(thematic)

高层主题

工作、家庭、财务、项目

实体节点(entity)

具体的人/公司/仓库/账户

"客户A"、"[email protected]"、"org/repo-name"

原始文档(raw)

邮件、笔记、交易、commit

单封邮件、单条 Slack 消息、单个 PR

三层之间的关系是显式保存的,所以助手能回答跨多源的问题。比如你问:"最近和老张有关的 PR 进展怎么样?"——Memory Tree 会去找"老张"这个实体节点,过滤出他相关的 PR 文档,再把最近时间窗的 commit 和邮件串起来。

4.3 数据流:canonicalize → chunk → score → seal → summarise

这是核心管线,按这个顺序走:

flowchart TD
    A[原始数据<br/>邮件/PR/Slack消息] --> B[Canonicalize<br/>标准化为统一 Markdown 结构]
    B --> C[Chunk<br/>切成 ≤3k token 的片段]
    C --> D[Fast Score<br/>快速打分,决定热度]
    D --> E[Persist<br/>落盘 SQLite + Obsidian vault]
    E --> F[Enqueue Follow-up<br/>排入后台任务]
    F --> G[Embedding 后台计算]
    F --> H[Entity 抽取]
    F --> I[Seal Summary Buckets<br/>密封摘要桶]
    F --> J[Daily Digest<br/>每日摘要]

热路径(canonicalize → chunk → fast-score → persist → enqueue)是同步的、要快——保证 UI 不卡。

重活(embedding、实体抽取、密封摘要桶、每日摘要)丢到后台 worker 里跑,三个并发 worker 拉队列,配信号量限制大模型并发,崩溃后租约过期会重新进队列。

4.4 为什么是 Markdown 而不是向量

这是我个人很喜欢的一个设计选择,它有几个直接的好处:

  • 人类可读:你出问题想 debug 的时候,可以直接打开 vault 看,所有摘要、所有片段、所有链接都摆在眼前。
  • 可编辑:你可以手动改任何一个节点。下次 ingest 时,agent 会把你的修改也吸收进去。
  • 可链接:用 Obsidian 的 [[wikilinks]] 语法把节点互相连起来,知识网络越长越密。
  • 可备份:Markdown 文件可以丢 Git,可以丢 iCloud,可以丢任何同步盘,迁移成本极低。

代码层面,Memory Tree 的核心实现在 src/openhuman/tree_summarizer/ 目录下,summary 构建器分了三种粒度——source(按数据源)、topic(按主题)、global(全局)。如果你跑自托管,可以把 MemoryConfig.backend 设成 "agentmemory",让多个 agent 共享同一份持久化存储,比如和 Claude Code、Cursor、Codex、OpenCode 共用一份记忆。

4.5 与 Karpathy 的 LLM Wiki 思路的呼应

Karpathy 的原话很到位:"Obsidian 是 IDE,LLM 是程序员,wiki 是代码库"

意思是你不亲自写 wiki,你写的是 prompt——告诉 LLM 这次源数据是什么,让它去写、去链接、去合并。每次新进来一份资料,wiki 整体都会变得更聪明:一篇关于工具自动化的文章会自动连到 AI 编码工作流,再连到"写作即思考"的散文,三个不同领域的内容,会被一条线串起来。

OpenHuman 是这套思路的产品化落地版本。差别在于:Karpathy 那套是手动触发的(你跑一个命令),OpenHuman 是 Auto-Fetch 自动触发的(每 20 分钟一次)。

4.6 搜索、检索与可视化

光把数据塞进 Memory Tree 还不够,还得能从里面捞东西出来。OpenHuman 在 Intelligence tab 里提供了三个层面的可观察性:

第一层:热力图

类似 GitHub 贡献热力图的 ingest 事件可视化,颜色越深表示这段时间 Auto-Fetch 拉到的新数据越多。这个视图对发现"哪段时间同步断了"特别有用——比如某个连接 token 失效了三天,热力图上会有明显的"空白带",比单纯看错误日志直观得多。

第二层:搜索栏

Memory Tree 顶部有一个统一搜索栏,支持三种检索模式:

模式

说明

典型用法

源范围(source-scoped)

只在某个数据源内搜

"在 Gmail 里搜 invoice"

主题范围(topic-scoped)

只在某个主题下搜

"在'项目 A'主题下搜部署相关"

全局(global)

跨所有数据源搜

"搜 Alice 这个人在所有地方说过什么"

每个搜索结果都会直接链到底层 chunk 文件所在的 Obsidian vault 路径——这意味着你可以从一个搜索结果点进去,看到那条记忆的完整出处,包括它的标准化形式、原始时间戳、关联实体。这种"全程可溯源"的设计是向量数据库做不到的。

第三层:路由可视化

Intelligence tab 还能看到 agent 每次执行任务到底用了哪个模型、属于哪种 hint、走的是云端还是本地。对刚开始用的同学,这个视图能帮你理解"我刚才那个 prompt 为什么走了便宜模型"——通常是因为它被分类为 hint:fast 任务。

这种透明度本身就是一种产品特性。很多 AI 工具是黑盒——你不知道它后面发生了什么、用了什么模型、花了多少 token。OpenHuman 选择把这些都摊开给你看。


第五章 Auto-Fetch:让助手永远比你"早起一小时"

5.1 工作机制

Auto-Fetch 是 OpenHuman 最有标识度的功能之一。每 20 分钟,核心服务会遍历每个活跃的连接,把新数据拉回来,丢进 Memory Tree 的管线里。

用文档里的原话翻译过来就是:早上你刚醒,agent 已经把"明天的上下文"准备好了。

举个具体场景。我前一天晚上睡前接好 Gmail、GitHub、Linear 三个集成。第二天 8 点起床打开电脑,OpenHuman 在过去 12 个小时里已经跑了大约 36 次同步循环:

  • Gmail 那边新进来 27 封邮件,被分门别类放进 Memory Tree。
  • GitHub 那边有 4 个仓库收到了新的 PR review 评论,被记入仓库节点。
  • Linear 那边有 2 个 ticket 状态变化,相关人员的实体节点更新。

我打开 OpenHuman 直接问"今天上午我需要优先处理什么?"——它会基于 Memory Tree 里这些已经存在的、被压缩过的、被打过分的信息回答,不会临时去爬一遍邮件、爬一遍 PR。

这是和"每次都现场 RAG"最大的差别。信息是已经被准备好的,回答是即时的。

5.2 增量更新策略

Auto-Fetch 不是每次都全量拉。它会维护每个连接的同步状态,只拉增量。这一点在大数据量场景下尤其重要——如果你的 Gmail 里有十万封邮件,全量拉一次就崩了。

具体到代码层面,每个 connector 都有自己的"分页 + 游标"策略:

  • Gmail:用 history API 拿增量变更。
  • GitHub:用 issues/events API 加 since 参数。
  • Slack:用 conversations.history 拿新消息。
  • Linear/Jira:用 webhook + 定时校准结合。

如果某个连接断了(token 失效、网络问题、API 限流),UI 上会有红点提示,Intelligence 面板还有个类似 GitHub 贡献热力图的可视化,可以看到 ingest 事件的时间分布——很容易看出哪段时间同步断掉了。

5.3 后台任务与前台 UI 的解耦

热路径只做轻活,重活全部放后台。这是一个很关键的工程决策,意思是你点开 OpenHuman 的那一瞬间,UI 是流畅的,不会因为后台正在 embed 几千封邮件就转圈。

后台 worker 用了信号量限并发 + 租约机制,崩溃恢复的时候,那些"worker 已死但任务没完成"的 job 会自动重新进队列。这种细节在生产级别系统里很常见,但对一个 Early Beta 阶段的开源项目来说,已经做得相当扎实了。

5.4 隐私与可控性

Auto-Fetch 听起来很方便,但对隐私敏感的同学难免有顾虑——它是不是把所有数据都偷偷发到云端了?

答案是:Memory Tree 数据库、Markdown vault、工作区配置、本地运行状态全部留在你自己的设备上。 默认模式下,OAuth 握手和模型路由还是走托管后端的,但你的实际邮件内容、文档内容是落地到本机的,加密保存。

如果你想做到完全本地化,可以走自托管路径——自带模型、自带搜索、自带 Composio 凭证。代价是某些实时触发器和托管功能仍然需要托管后端的配合(比如某些 webhook 触发),自托管下需要你自己搭 webhook 基础设施。

5.5 潜意识循环(Subconscious Loop)

Auto-Fetch 之外,OpenHuman 还有一个我个人觉得很妙的设计——潜意识循环(Subconscious Loop)

它的核心想法是:人类的脑子不会因为你停止打字就停止思考。你白天没回的邮件、没决定的事、没规划完的项目,大脑会在你打游戏、洗澡、走路的时候继续处理。OpenHuman 想让 agent 也具备类似的能力。

具体怎么实现的?后台有一个 worker 池,跑几类"非用户触发"的任务:

  • topic_route:把新进来的 leaf 节点路由到对应的实体主题树里,触发条件是一个"热度检查"——某个实体最近频繁出现,就会被升级到一个独立的主题树。
  • digest_daily:每天定时构建全局每日摘要节点。这就是为什么早上打开 OpenHuman 能直接看到"昨日总结"。
  • flush_stale:强制密封那些在 buffer 里待太久的临时数据,避免数据"卡"在中间状态。

三个 worker 拉队列,信号量限制并发的大模型调用——既不会把云端调用打爆,也不会让 UI 因为后台太忙而卡顿。

实际体感是什么? 你打开电脑那一刻,agent 已经"想过"很多事了。它会主动告诉你:"你昨天有 3 封邮件还没回,其中 1 封看起来比较紧"。这种主动性是普通聊天机器人完全没有的。

当然,这里也有需要权衡的地方——后台不停跑意味着持续的 token 消耗。我建议刚开始用的同学先关掉一些激进的潜意识任务,等你信任这套系统了,再逐步打开。


第六章 TokenJuice:让大数据吞吐成本可控

6.1 为什么 token 是真金白银

如果你跑过 agent 项目,应该体会过一个很直观的现象:让 LLM 多读一点东西很贵

一次 git status 在繁忙仓库里能输出几千行;一次 cargo build 日志一两万 token 起步;一个 600 楼的邮件 thread 直接把 100k context 撑满。这些东西大部分是噪音——空白行、重复字段、HTML 标签、长 URL——真正有价值的信号可能只占 10%。

TokenJuice 的作用就是在工具输出进入模型上下文之前,先把它压一遍。

6.2 规则化压缩管线

TokenJuice 不是一个黑盒压缩模型,它是一套规则覆盖(rule overlay)。规则用 JSON 写,按顺序合并,后面的层覆盖前面的层:

内置规则 → 用户全局规则 → 项目级规则

每条规则匹配一个工具/命令的 pattern,指定一种缩减策略:

策略

作用

truncate

直接截断超长输出

dedup lines

行级别去重

fold whitespace

折叠多余空白

drop regex

用正则丢弃匹配段

summarize sections

段落级摘要

html-to-markdown

HTML 转 Markdown

shorten urls

长 URL 缩短

新增规则只是丢一个 JSON 文件进去,不需要重新编译。全局规则放在 ~/.config/tokenjuice/rules/,项目级规则放在仓库根目录的 .tokenjuice/rules/

6.3 多字节字符按字形单位保留

这一点我特别想点名表扬。

很多 token 压缩方案会简单粗暴地按 ASCII 来做去噪——结果就是中日韩字符、emoji 被误伤。"恭喜发财🎉" 这种内容里,emoji 可能被剥光、汉字可能被劈成奇怪的字节序列。

TokenJuice 明确说了:CJK 字符、emoji 和其他多字节文本按字形(grapheme)单位保留,不会被剥离。 这对中文用户和带表情符号的 chat 数据来说非常友好。

6.4 一个具体的成本对比

文档里给的数据点:通过前沿模型 ingest 你过去 6 个月的邮件,成本从几百美元降到个位数美元

我自己没跑过 6 个月这么大的量,但用 50 封邮件做过小规模测试,原始 token 量大概是 18 万,过 TokenJuice 之后压到 6.7 万左右——压缩比接近 2.7 倍。如果是富文本邮件(带签名、转发链、营销 HTML),压缩比会更高。

// TokenJuice 在工具调用路径上的位置(简化伪代码)
async fn execute_tool(call: ToolCall) -> ModelInput {
    let raw_output = call.run().await;             // 原始输出
    let compressed = tokenjuice::reduce(           // 进入大模型前压一遍
        raw_output,
        &load_rules(&call.tool_id),
    );
    ModelInput::from(compressed)
}

实现位于 src/openhuman/tokenjuice/,包含 classify.rs(分类)、reduce.rs(缩减)、rules/compiler.rs(规则编译)、tool_integration.rs(工具集成)。想看 TokenJuice 在跑的时候到底匹配了哪些规则、剥掉了多少内容,可以用:

RUST_LOG=openhuman_core::openhuman::tokenjuice=debug

启动核心服务,所有匹配过程都会打印出来。调试规则时非常实用。

6.5 TokenJuice 之于 Auto-Fetch 的意义

TokenJuice 不只是省钱,它是让 Auto-Fetch 这件事在经济上可行的关键一环。

试想一下:每 20 分钟同步一次,Gmail 一次 200 封邮件,每封压缩前 3000 token——那就是 60 万 token / 次。一天 72 次循环,4300 万 token / 天。光是这一个服务,月开销就足够买一台中端 GPU。

但加上 TokenJuice,邮件先被压到原来的 1/3 到 1/5,整体开销直接进入"可控订阅价"的区间。


第七章 自动模型路由:一份订阅,多模型协作

7.1 为什么需要路由

不同任务对模型的需求差异极大:

  • 长推理:希望走前沿模型——准、慢一点没关系。
  • 快速分类/格式化:希望走便宜模型——快、能用就行。
  • 看截图、看图表:必须走视觉模型——其他模型干脆做不到。
  • 摘要 / 压缩:希望走专门的轻量模型——量大、要稳定、要便宜。

如果让用户每次都自己挑模型,那是工程灾难。OpenHuman 的方案是内置一个路由 provider,每次调用按"提示前缀(hint prefix)"或具体模型名解析:

Hint

用途

路由到

hint:reasoning

多步规划、数学、代码繁重的对话

前沿推理模型

hint:fast

UI 助手、自动补全、小型分类

快速便宜模型

hint:vision

截图、图片附件、OCR

视觉模型

hint:summarize

Memory Tree 摘要构建器

压缩专用模型

hint:reaction / hint:classify / hint:format / hint:medium

中轻量任务

中型快速模型

具体模型名(比如 anthropic/claude-sonnet-4)会绕过路由表,直接走默认 provider。

7.2 路由表的核心代码

文档里直接给了简化版的源码片段:

// src/openhuman/providers/router.rs
fn resolve(&self, model: &str) -> (usize, String) {
    if let Some(hint) = model.strip_prefix("hint:") {
        if let Some((idx, resolved_model)) = self.routes.get(hint) {
            return (*idx, resolved_model.clone());
        }
    }
    (self.default_index, model.to_string())
}

读起来很直白:剥前缀,查表,匹配不到就 fallback 到默认 provider。Router 内部维护了多家 provider 的实例——Anthropic、OpenAI、Google、Groq 等——每个 hint 都映射到 (provider 索引, 模型名) 这样一个 pair。

7.3 三个覆盖层级

OpenHuman 把路由的灵活性做到了三个层级:

  • 全局config.toml 里可以替换整张路由表(Config 结构定义在 src/openhuman/config/schema/types.rs)。
  • 单次调用:直接传具体模型名(不带 hint: 前缀),router 会绕过路由表直接用默认 provider。
  • 技能(Skill)级:每个技能的 manifest 里可以钉死一个 hint 或一个具体模型。
  • 子 agent 级spawn_subagent 或 archetype 委托调用时可以指定 inline model;orchestrator 可以钉死 [teams.research].lead_model 走强模型,叶节点 worker 走便宜模型。

这种"层层覆盖、就近生效"的设计,是工程经验比较老的人才会自然做出来的。

7.4 本地模型的边界

如果开启了 Local AI(Ollama / LM Studio),低延迟、注重隐私的任务会优先走本地:

  • hint:reaction, hint:classify, hint:format, hint:sentiment, hint:summarize, hint:medium, hint:tool_lite 这些轻中量任务会被本地模型接走。
  • 默认聊天、推理、视觉这些"前沿能力"任务,依旧走云端订阅。
  • Embeddings 强制走本地——这是一个明确的隐私边界,向量永远不离开你的机器。

文档里有一段我觉得讲得很清楚的话,大意是:之前的版本试图把所有任务都搬到本地(chat、vision、STT、TTS 全用 Gemma 3),结果做出来太重,硬件敏感度太高,反而拖累了产品体验。现在的边界是——本地干本地擅长的(高频、低延迟、隐私敏感的记忆活儿),云端干云端擅长的(默认聊天、推理、视觉)。

这种"理性收缩"的产品决策,我个人很认同。

7.5 子 agent 与团队路由实战

OpenHuman 还有一层我觉得很值得讲的设计——多 agent 协作下的路由逻辑

当你跑一个复杂任务,比如"帮我把这周所有 PR 的 review 评论汇总一下,生成一份团队反馈热点报告",OpenHuman 内部其实不是一个 agent 在干活,而是一个 orchestrator(编排者)加几个 sub-agent(子 agent)。

路由表对这种场景做了精细化处理:

# 简化版 config.toml 示例
[orchestrator]
model = "hint:reasoning"  # 编排者用强模型

[teams.research]
lead_model = "hint:reasoning"   # 研究团队的 lead 用强模型
agent_model = "hint:fast"       # 叶节点 worker 用便宜模型

[teams.code]
lead_model = "hint:reasoning"
agent_model = "hint:fast"

为什么这么设计? orchestrator 和 team lead 要做规划、要做决策,需要强推理能力;leaf worker 是"按计划干活",往往是简单分类、格式化、抽取,便宜模型完全够用。如果所有 agent 都用强模型,成本会爆炸;如果所有 agent 都用便宜模型,规划质量会崩。

这种"上面强、下面快"的分层路由,是大型 agent 系统的标准实践,但很多开源项目要么不支持,要么需要自己写一堆配置才能做到。OpenHuman 把这件事内置到了路由表里。

单次任务也可以临时覆盖:调用 spawn_subagent 或 archetype delegation 时,可以传一个 inline model 参数。技能(skill)的 manifest 也可以钉死一个 hint 或具体模型——这意味着同一个 OpenHuman 实例里,不同技能可以用不同模型,互不干扰。


第八章 Composio 连接器:118+ 集成是怎么落地的

8.1 一键 OAuth 的底层

OpenHuman 自己不去和每个第三方服务对接,它把这件事外包给了 Composio——一个专门做 LLM 与 SaaS 服务连接的中间层。Composio 负责 OAuth 的细枝末节、token 刷新、限流处理、webhook 转发。

OpenHuman 在默认的"托管模式"下,把整个 Composio 调用都代理在自己的后端:

  • OpenHuman 后端持有 Composio API key。
  • OAuth token 在 Composio 那边托管,不落到你本机的明文文件里。
  • 限流和 webhook 转发由 OpenHuman 后端统一处理。

这意味着对用户来说,接入新服务就是点一下"Connect",浏览器弹出来一个 OAuth 授权页,登录授权,连接就活了。

8.2 一次连接,四个去处

文档里有一句话我觉得概括得极好——一旦一个服务连上了,它在四个地方同时出现

flowchart LR
    A[新接入服务<br/>e.g. Gmail] --> B[作为 Agent 工具<br/>模型直接调用]
    A --> C[作为记忆源<br/>Auto-Fetch 每20分钟同步进 Memory Tree]
    A --> D[作为画像信号<br/>跨服务活动建模你的个人偏好]
    A --> E[作为触发器<br/>实时 webhook 通知]

这个设计的精妙之处在于:你接 Gmail,不是只是给 agent 加一个"读邮件"工具,而是让你的邮件直接成为 agent 长期记忆的一部分

8.3 托管 vs 直连

如果你是高阶用户,不想依赖 OpenHuman 的托管后端,可以切到直连模式(direct mode)

维度

托管模式

直连模式

Composio API key

OpenHuman 后端持有

你自己持有

OAuth 流程

OpenHuman 代理

直接走 Composio

同步工具调用

都支持

都支持

实时 webhook 触发器

后端统一处理

⚠️ 需自己搭 webhook 端点

限流 / 计费

OpenHuman 后端兜底

你自己的 Composio 账户承担

直连模式给你最大的自主权,但也把所有配置和运维责任交还给你。一般个人用户没必要折腾这个。

8.4 一个已知的小坑:OAuth 完成后的 30-60 秒延迟

我在跑 Composio 集成时踩过一个坑,社区 issue tracker 里也有专门的记录。

简单说:当一个 OAuth 流程刚完成、连接状态变成 ACTIVE 之后,Composio 的 action-execution gateway 还需要 30-60 秒把新 token 同步到执行缓存里。这个窗口期里,OpenHuman 的连接管理层认为"连接已就绪",agent 的 schema 里也已经出现了 delegate_<toolkit> 这个工具,但你第一次去调用工具时,会收到 Connection error, try to authenticate 错误。

社区已经合并了一个 PR(#1708),加了重试和就绪探测机制,新版本里这个问题应该明显好转。建议:刚连上一个新服务后,等一分钟再去让 agent 用它,能省不少时间。

8.5 数据安全边界的几条关键事实

很多人对 OAuth + 托管后端这套组合天然警惕,我把官方文档里关于数据流向的几个关键事实摘出来,方便你自己评估风险:

  • OpenHuman 的本地核心服务永远不直接调用任何第三方 API——所有第三方请求都经过 OpenHuman 后端,由后端管理 OAuth token 和限流。
  • 你的 OAuth token 不会以明文形式落在你本机磁盘上——agent 看到的只是工具调用的结果,看不到凭证本身。
  • 如果你切到 direct 模式,这条边界会发生变化:本地核心会用你自己的 Composio API key 直接调用,你自己负责 Composio 账户、限流、计费关系以及任何 webhook 触发所需的 endpoint。
  • 触发器分两种:实时触发器(webhook 推过来的事件)和定时触发器(Auto-Fetch 主动拉)。实时触发器在直连模式下需要你自己搭 webhook 基础设施;定时触发器完全本地,不依赖外部 endpoint。

我自己评估完之后的选择是:默认走托管模式,只接公开/低敏感度的服务。涉及公司核心数据的(比如公司邮箱、内部代码仓库),我宁可不接、用其他方式手动同步——这是一个"便利性 vs 风险"的取舍,每个人结合自己情况判断。


第九章 桌面形象与原生语音:让 AI 真正"住"在桌面上

9.1 桌面吉祥物不是装饰

很多人第一眼看到 OpenHuman 的桌面吉祥物,会觉得这就是个二次元装饰品。但你用一段时间会发现,它其实是 agent 状态的可视化层——它代表 agent 在说什么、在想什么、什么时候空闲、什么时候忙、什么时候有话要告诉你。

吉祥物和后端是同一套机制:当 agent 在说话,吉祥物在动嘴;当 agent 在思考,吉祥物会有"思考"的表情;当后台同步在跑,吉祥物会有"忙碌"的状态。

对长期使用来说,这个"可视化"很有用——你瞄一眼就知道 agent 在不在工作、要不要打扰它。

9.2 STT 与 TTS 链路

OpenHuman 的语音栈是这样的:

  • STT(语音转文字):进音频用 Whisper 处理。
  • TTS(文字转语音):出语音用 ElevenLabs。
  • 唇形同步(lip-sync):TTS 输出的音频流同时驱动吉祥物的口型,靠 viseme 映射做出来,不是两套独立的"动画 + 音频",是同一份音频驱动同一份动画。

新版本里有一个"完全本地化"的语音选项,把 STT 用 Whisper 本地版、TTS 用 Piper 替换 ElevenLabs。这样语音环节也可以做到不出本机。

9.3 Google Meet 实时参与

这个功能听起来最像噱头,但实际试了一下还挺有意思。

OpenHuman 的吉祥物可以作为一个真实参与者加入你的 Google Meet 会议。它不是录屏机器人,是一个真实的 meeting participant,能听别人说话、能把会议内容实时转写进 Memory Tree,必要时还能用 TTS 直接在会议里说话。

实际场景里,我用过一次给团队同学做架构 review。会议结束后,OpenHuman 已经把整场会议的关键点抽出来了,包括谁提了什么问题、有哪些 action item、谁负责什么——这部分内容直接落到我的 Memory Tree 里,下次再问"上周三的 review 会同事提了哪些问题",它能秒答。

当然,这个功能有合规层面的注意事项:入会前你需要明确告知所有参会人有 AI 在场,对方有权拒绝。这是基本礼仪,也是合规要求。


第十章 技术架构选型:Rust + Tauri + CEF 的逻辑

10.1 为什么不是 Electron

OpenHuman 桌面端用了 Tauri v2 + CEF(Chromium Embedded Framework),没有用更主流的 Electron。

差别在哪?我做了一个对比表:

维度

Electron

Tauri v2 + CEF

体积

安装包通常 100-200MB+

安装包通

🔒
🔒 该内容仅对更高等级用户组开放,请升级您的账户等级以查看完整内容。
您当前:游客 · 可见 60% 内容 · 升级至 注册用户 可见 70%
👀
游客
可见 60%
✓ 当前
注册用户
注册用户
可见 70%
社区精英
社区精英
可见 100%
社区守护
社区守护
可见 100%
仅解锁本文,永久有效。如需PDF珍藏版,请联系站长获取。 当前单篇价格 ¥9.9
✏️ 发表评论

请先登录后发表评论

前往登录
📊 站点统计
今日发布2 篇
文章总数1289 篇
昨日发布0 篇
本月发布67 篇
建站时间407 天
🔍 搜索
📅 日历
« 2026 » « 08 »
     12
3456789
10111213141516
17181920212223
24252627282930
31      
站长微语

联系站长

微信:165255185
AIGC 技术社区
致力于解码 AI前沿技术 与经验分享
纯粹的技术交流社区

💡 欢迎您的建议与反馈,让社区变得更好

快速通道
联系站长
站长微信二维码
AI交流群
AI交流群二维码
仍在路上

那些寒夜里追赶过的方向

那些冷眼下没放弃的理想

一篇一篇写到现在

仍在路上

"不羁放纵爱自由"

—— 致敬 Beyond
持续创作中 莫潇羽 · 源码七号站