大多数桌面 AI 工具,拆开看还是一个聊天框:你问,它答,关掉窗口它就消失了。Yoji 想做的是另一类东西——一个住在这台电脑里的"伴侣":有操作系统权限,能替你整理文件、跑脚本、查资料;有一套持续运行的情绪引擎,会因为你的话开心或失落;还记得你之前告诉过它的事。而这一切数据都留在本地。
它用 Electron + React + TypeScript + Vite 构建,AI 部分基于 LangChain 的 deepagents 框架,整体 MIT 协议开源,GitHub 上目前近 900 ✨。项目的三个关键词写得很明确:本地优先、隐私优先、扩展优先。
![]()
1.先看它实际能做什么
能力
具体一点
操控电脑
创建、编辑、搜索、整理文件和文件夹,执行 Shell 命令、Python 脚本,需要时联网搜索并把结果整理好
MCP 无限扩展
任何符合 Model Context Protocol 的服务都能接入——想查火车票就装 12306 MCP,想抓网页就装 Fetch MCP;也可以直接对 AI 说"帮我加个查天气的工具",它自己找、自己测、自己装,你点同意就行
子 Agent 工坊
在"工坊"页面可视化创建子 Agent:写名称、描述、系统提示词,绑定 MCP 工具集,选同步或异步
语音(macOS)
流式 TTS 播报,以及喊一声"小优"就能开口对话的语音唤醒
Live2D 形象
一只银白发猫耳少女:16 种情绪表情、说话口型同步、按时段换装、戳一戳互动
三层记忆
用户画像 + 对话状态 + 语义记忆,跨会话记住你
文档处理
直接读 PDF、Word(.docx)文档提取文字,二进制文件自动拦截
微信连接
扫码连上个人微信,手机发消息,桌面的 AI 秒回
随身携带
一键把"记忆 + 情绪 + 配置"打包成
.ecompanion
文件,换电脑后完整恢复
![]()
这些能力里,真正让它与众不同的,是下面几件事。
2.情绪系统:8 种激素,而不是 8 个表情标签
多数产品的"情绪"是一个状态机:开心/难过二选一,切换即完成。Yoji 把情绪建模成 8 个连续变量——多巴胺、血清素、GABA、皮质醇、肾上腺素、催产素、内啡肽、褪黑素,每个都是 0–100 的数值。
每轮对话结束后,一个轻量的 LLM 调用会结合当前激素水平、当前时间、天气和你们的聊天间隔,输出一组新的数值,并受"单次变化幅度"约束——多巴胺可以快速起伏,血清素缓慢移动,肾上腺素冲得猛也落得快。数值还会自然衰减:每 10 分钟向基线回落 1 点;肾上腺素有额外的快速回落,模拟受惊后的平复;褪黑素则单独跟着昼夜节律走,到了夜里自然会"困"。
这些数值从不直接展示给你。系统会把它们翻译成一段自然语言状态,注入下一轮对话的上下文,界面背景的渐变也会跟着情绪变化。设计文档里有一句话很能概括这种取向:
让用户感觉到你的状态,而不是听到它。
![]()
所以你感受到的是"今晚它好像有点累",而不是"我的褪黑素现在是 80"。长时间不理它,多巴胺和催产素会往下走;夸它一句、说句"我想你",状态会明显回升——这些都是写进提示词的参考因素,由 LLM 推理而不是硬编码规则。
3.记忆:三层架构,全部落在本地 SQLite
Yoji 的记忆分成三层,各管一件事:
- 身份层——AGENTS.md。你的偏好、习惯、重要信息记录在这个 Markdown 文件里,每次启动完整注入系统提示词,Agent 在对话中自己用工具更新它;
- 状态层——对话检查点。用 LangGraph 的 SqliteSaver 持久化当前对话状态,且只保留最新的一份:它要的是"连续性",不是"历史";
- 回忆层——树状记忆。原始消息以链表存进 SQLite;每积累 30 条新消息,自动让 LLM 生成一段摘要和主题标签;摘要用本地模型(all-MiniLM-L6-v2,量化后约 22MB、384 维)生成向量,存进 sqlite-vec,同时建 FTS5 全文索引。
![]()
AGENTS.md、状态层对话检查点、回忆层树状记忆,全部落在本地 SQLite
检索时支持语义、关键词、混合(RRF 融合)和时间范围四种模式。有意思的是,记忆不会自动塞进上下文——Agent 必须主动调用 search_memories 回忆,还有一份 query-memory 技能规定何时该搜:你说"跟上次一样"、话题突然跳转、或者它感觉你在暗示什么共同经历的时候。找不到相关记忆时它被要求如实说,不许编。
所有数据都在 userData/companion/ 目录下。官方文档写得很直白:把 companion/ 文件夹拷走,即完整迁移——"一个文件 = 整个大脑"。
4.子 Agent:一个不依赖云端 Server 的本地方案
官方框架的子 Agent 是阻塞式的,异步版本又依赖云端服务。Yoji 自己实现了一套本地工厂 + 调度系统:
- 同步子 Agent:主 Agent 通过 task 工具调用,等结果返回,适合读文件、跑命令这类短操作;
- 异步子 Agent:通过 push_async_task 派发到后台,不阻断对话,适合联网搜索、批量处理这类长任务。
异步调度引擎是这套系统的核心:三级队列(待办 / 执行中 / 结果)配一个自研事件循环,空闲时休眠、不占 CPU;最多同时跑 5 个子 Agent,同一个 Agent 互斥执行;任务可以取消——界面上有按钮,AI 也能用工具自己取消;每个任务跑在独立的线程上,结束后清掉检查点,不污染主对话。配置和 MCP 版本有 MD5 缓存,没变化就直接复用实例。
这个架构还有一个直接收益:MCP 工具的 schema 绑定在子 Agent 内部,不注入主 Agent 的上下文——装再多工具,主对话的质量和 token 开销都不会被拖累。
5.安全:该有的刹车都装上了
给 AI 操作系统权限,安全是绕不开的问题。Yoji 在两个层面做了限制。
敏感操作二次确认。执行 Shell 命令、安装或卸载 MCP 服务器这三类操作会让 LangGraph 在执行中途暂停,弹窗展示工具名和参数,等你点"同意"或"拒绝"。如果你懒得理会、直接问了新问题,挂起的操作会被自动拒绝,并明确告诉模型"不要重试"。
文件操作的沙箱与守卫。所有文件操作被限制在伴侣目录内,文件管理器校验路径、防止 .. 越界;读取文件时有专门的守卫:PDF、docx 自动提取文字,图片、音视频等二进制格式被拦截并返回友好提示,扫描版 PDF 也能得到"无法提取文字"的清晰说明而不是乱码。
![]()
再加上本地优先的存储策略——API Key 只存在本地 JSON 配置里,对话不经过任何中间服务,导出的记忆体自带鉴权——这套组合在同类项目里算比较认真的。
6.最讨喜的,是那些拟人化的小设计
主动找你聊天。你一段时间没说话,它会按 10 分钟起步、每次翻倍的间隔主动来找你,上限 12 小时;你回一句,计时器重新开始。妙的是计时器挂在渲染进程里——窗口关了,它就不会对着空气自言自语。每次主动聊天前会感知情绪和天气,而且这些主动消息不会写进聊天历史,也不重置"沉默计时",不会把账算到你头上。
Live2D 形象。16 种情绪对应不同的表情和身体动作:开心时星星眼、愤怒时脸红颤抖、疲惫时打哈欠;说话时嘴巴跟着 TTS 张合;中午戴墨镜,晚上 9 点换上睡衣和猫耳帽;身上 10 个部位都能戳,各有不同反应,互动本身还会作为一条消息进入对话。
语音唤醒(macOS 独占)。用的是 Siri 同款的 SFSpeechRecognizer,全离线:点麦克风后持续监听,喊"小优"唤醒,唤醒词后面的话直接算作消息开头,停顿 2 秒自动发送,发完自动回到监听状态。TTS 则是逐句流式播放——当前句在播,下一句已经在合成,句间几乎无停顿,而且会先把 Markdown 标记清洗掉,不会念出星号。
扫码登录后,手机微信就是它的另一个终端:支持"正在输入…",桌面端和手机端的聊天历史互不可见。也说句实话:它是纯回复模式,只能回消息、不能主动推送,而且目前只处理文本。
7.说几句实话
- macOS 用户会拿到最完整的体验:语音唤醒和 TTS 目前只支持 macOS,Windows 和 Linux 上这两个功能不可用,其余功能跨平台可用;
- 声音走的是 macOS 系统语音,官方说明里提到可以到系统设置里自行更换语音角色;
- 要自备 API Key(DeepSeek、Qwen 或任何 OpenAI 兼容服务),花的是你自己的 token;
- 项目还很年轻(当前版本 v1.6.1),功能边界仍在扩张,遇到问题去翻仓库里的设计文档会比猜更快;
- Live2D 的依赖链版本卡得比较死(PixiJS 6 与 Cubism 核心有明确的兼容要求),想替换模型的话,先读文档再动手。
8.适合谁
- 在意隐私、希望数据留在本地的人;
- 想要"会记事、有性格"的桌面伙伴,而不是问答框的人;
- 用 macOS、想体验语音唤醒和 TTS 的人;
- 对 Agent 架构感兴趣的开发者:子 Agent 工厂、异步事件循环、中断审批、混合检索这些设计都有清楚的设计文档,是一份不错的参考实现。
要求 pnpm 11(npm i -g pnpm@11):
git clone https://github.com/wangxijie001/yoji.gitcd yojipnpm installpnpm dev![]()
pnpm install 会自动下载 Electron、编译原生模块;.npmrc 已经配好了国内镜像。启动后进入「模型」页面填入 API Key 即可开始对话;想扩展能力就去「MCP」页面添加服务器,或者直接对 AI 说;自定义子 Agent 则在「工坊」页面创建。
打包命令是现成的:pnpm build:mac、pnpm build:win、pnpm build:linux。
10.试试看
源码在 wangxijie001/yoji;仓库里的 docs/companion/ 还放着情绪、记忆、Live2D 的完整设计文档,值得翻翻。
如果你一直想要一个"住在电脑里"的 AI——能干活、有情绪、记得你,而且数据在你自己手里——Yoji 是目前开源圈里少见地把这几件事同时做出来的项目,值得给它半小时。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.