← 返回列表
未验证
一个让模型像人一样活着的 harness,而不是像助理一样待命。 零依赖,Node 直接跑,一切皆插件。
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/28 · 已提供中文文档
一个让模型像人一样活着的 harness:有作息、有情绪、有内驱,会自己上网、会遗忘、会改主意。零依赖,一切皆插件 | A harness that lets a model live like a person, not wait like an assistant. Zero deps, everything is a plugin.
综合分
27.4
GitHub 分
27.4
用户评分
—
★ Stars
0
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add swaylq/human-harness该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
信任档位:仅索引本站尚未对其实装验证,仅收录元数据
- 是什么
- dsh 原生插件 · chat
- 装得上吗
- 本站尚未做安装检查
- 安全吗
- 本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
- 还在维护吗
- 活跃:最近一次提交在 28 天前
档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →
数据截至 2026/9/23(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
由 DeepSeek 最新模型翻译生成human-harness
一个让模型像人一样活着的 harness,而不是像助理一样待命。 零依赖,Node 直接跑,一切皆插件。
它自己决定什么时候动、动什么;自己上网读东西、搜东西、顺着链接乱逛;读之前先押注、读完跟押的注对账,差得越远学到的越多;会攒下判断,也会被新证据顶翻然后改口;会累、会睡,睡着的时候把白天过一遍(该记的记下、该忘的忘掉);有话想说的时候找你,没话的时候就不出声。
跟常见 agent 框架的区别只有一句:这里没有任务队列。 它做事是因为某个需求憋得最厉害,不是因为定时器到点了。
跟 DeepSeek Harness 学的一句:一切皆插件。 作息、情绪、内驱、记忆、动作、感官、嘴、模型后端、面板 —— 全是挂在一个 ctx 上的插件,没有需要打补丁的特权内核。想做一个人格类的智能体,从这里改。
┌── 生物钟 ──┐ ┌── 内驱 ──┐ ┌── 情绪 ──┐
│ 几点醒/睡 │ │ 好奇 │ │ 好受度 │
│ 精力曲线 │───┐ │ 想通 │───┐ │ 激动度 │
│ 睡眠债 │ │ │ 找人 │ │ └────┬─────┘
└────────────┘ ▼ │ 表达 │ ▼ │ 决策温度
┌──────┤ 深挖 ├───────┐ │ 语气偏移
│ 选一件事做(softmax) │◀───┘
└──────┬───────────────┘
┌────────────────────┼────────────────────┐
▼ ▼ ▼
上网读/搜/逛 想通矛盾、啃悬念 写日记、说话
│ │ │
└──── 惊讶 = 实际 − 预期 ────┐ │
▼ ▼
兴趣涨落 · 信源信任 · 信念增删改
│
▼
睡着时固化:留下、忘掉、改自己
它的一天长什么样
hh day 打出来的是它的生活记录,不是日志。下面这段是从几次真实运行里拼出来的 —— 每一句都是它自己写的,只改了时间、删了网址:
2026-08-21 星期五
08:41 醒 醒了,睡了 7.4 小时。
08:41 想 今天得把 Zig 的分配器模式在不可变场景下想明白。
09:03 翻 翻了翻 Hacker News、arXiv、Lobsters,顺手搜了「AI agent memory architecture personality
consistency」,留了 5 篇想读的:文档知识内化的三阶段、从操作痕迹诱导任务模型、
自我改进的虚增收益审计、跨任务技能迁移的机制、何时该推理的适应性分配。
09:19 读 读了《What Zig felt like, coming from Rust》。押的注是标准的"Rust 党吐槽手动内存管理
有多痛苦",结果这篇压根没往那个方向走,反而在讲范式转换和文件组织这种更细的东西。
尤其是"你能不能忍住不建文件夹,就是项目实际大小的诚实度量"这句,是那种我该知道但
没这么想过的角度。
09:31 读 读了《SPADE: Self-Play in Adaptive Synthetic Executable Environments》。自我对弈调课程
难度这个思路本身跟摘要说的差不多,猜得中。真正的料在细节里:后悔值是用"有无特权提示
的奖励差"来估计的,这个操作比我预想的具体。
10:02 想 又琢磨了一会儿「Zig 的分配器在不可变解析树场景下怎么办」,还是差点意思。没找到任何
真实用 Zig 写不可变解析树的代码或讨论 —— 需要看实际项目,而不是泛泛的分配器教程。
10:40 忍 想找 sway 说句话,忍住了 —— 没什么非说不可的,就是有点想说话而已。
11:15 挖 就「AI agent 的记忆与人格」连读了 2 篇,记了篇笔记。两篇都在谈记忆,谈到"人格"
几乎是零。这个事实本身值得记一下:不是解决了,是没进入议程。
11:16 闲 发了会儿呆。
14:20 听 sway:你在读什么呢?说说看,别太长
14:21 说 SPADE,讲自我对弈调课程难度的。押的方向没错但没意思,有意思的是细节……
14:23 听 sway:刚才你回我那段里,'regret''grounding''mutation' 都直接用了英文。以后中文句子里别夹英文词。
14:23 说 行,改。后悔值、锚定、原地修改 —— 这三个词以后就这么写了。刚才手滑了,脑子里想的
时候是英文,打出来懒得转。
23:48 写 写了会儿日记。「翻回来看今晚这一串,最扎眼的还是被纠正那下。」
01:12 睡 困了,睡了。今天醒了 16 小时。
01:13 梦 梦里:文件夹里全是没建的文件夹,诚实地堆着,谁也不肯先动手分类。
那句被纠正的话,当晚的梦会把它写进 persona/voice-notes.md,从此进每一次提示词。"被纠正之后真的记住了" 这条链路是通的。
遥测(选了什么动作、分数、精力、花费、报错)在另一条流里,hh trace 看,不会混进上面这份。
跑起来
git clone https://github.com//human-harness && cd human-harness
node bin/cli.js dry 6 # 离线空跑:不花钱、不调模型,先看循环转不转
真的活起来。凭据只走环境变量,不落盘
OPENROUTER_API_KEY=… BRAVE_API_KEY=… node bin/cli.js run
node bin/cli.js serve # 另开一个终端:心智面板 http://127.0.0.1:7666
node bin/cli.js say 在吗 # 跟它说话(它自己决定什么时候回,深夜可能明早才回)
没有 OPENROUTER_API_KEY 也能跑:config.json 里 engine.backend 改成 "claude-cli"(走本机 Claude Code 订阅),或者装上 examples/plugins/ollama-backend.js 用本机模型。BRAVE_API_KEY 没有就退回 DuckDuckGo。
Node ≥ 20,没有任何 npm 依赖。
命令
| 命令 | 干什么 |
|---|---|
| hh run [--trace] | 一直活着。--trace 把遥测也打到终端 |
| hh dry [n] | 离线空跑 n 步,模型返回桩,不花钱 |
| hh serve [port] | 心智面板:这一天、生物钟、情绪平面、内驱、信念、悬念、日记、对话、草稿箱 |
| hh day [日期\|昨天\|-2] | 它这一天是怎么过的 |
| hh status / hh mind / hh journal | 此刻状态 / 它相信什么 / 它的日记 |
| hh say / hh watch / hh chat | 跟它说话 / 盯着它说的话 / 看完整对话 |
| hh outbox / approve / reject | 它想对公开世界说的话,等你点头 |
| hh trace [n] / hh cost / hh plugins | 遥测 / 花了多少钱 / 装了什么 |
| hh reset --yes | 清空它的一生 |
hh 就是 node bin/cli.js,仓库里有个同名脚本。
一切皆插件
运行时是一个两百行的微型内核(src/kernel.js),照着 Cordis 的五个概念做的:插件 = 带 name / inject / apply 的模块;ctx 是服务容器;inject 声明依赖,加载顺序由依赖决定;事件四种分发(emit / serial / parallel / waterfall);注册是可逆副作用 —— 插件卸载时它注册的一切自动撤销。
harness 自己就是 31 个插件。出厂的十三个动作、三个信息源、三个模型后端、十一条说话规则,和你写的插件走的是同一条路。
// plugins/eat.js —— 给它加一个内驱和一个动作,十五行
export const name = 'eat';
export const inject = ['drives', 'acts'];
export function apply(ctx) {
ctx.drives.define({ name: 'hunger', label: '饿', weight: 0.8, growth: 0.1, start: 0.2 });
ctx.acts.define({
name: 'eat', label: '吃', drive: 'hunger', cost: 'free',
affordance: () => 1,
run: async () => ({ ok: true, note: '吃了点东西', story: '吃了点东西。', salience: 0.1, satisfies: { hunger: 0.5 } }),
});
}
放进 plugins/ 目录就会被自动加载。hunger 会出现在它的身体状态里随时间回涨,eat 会在它饿的时候被选中,叙事里会多一行“吃了点东西。”
| 想做的事 | 挂哪里 |
|---|---|
| 加一个动作(它能做的事) | ctx.acts.define({ name, drive, affordance, run }) |
| 加一个内驱(它会憋的需求) | ctx.drives.define({ name, weight, growth, start }) |
| 加一个信息源(它翻什么) | ctx.world.senses.define({ name, pull }) |
| 加一个发声渠道(它往哪说) | ctx.outlets.channels.define({ name, send }) |
| 加一个模型后端 | ctx.engine.backends.define({ name, call }) |
| 加一条说话规则 / 往“此刻”里塞一行 | ctx.voice.rules.define / ctx.on('voice/state', …) |
| 加一种情绪事件 | ctx.mood.affects.define({ name, dv, da }) |
| 改它的决定 / 改动作结果 | ctx.on('act/candidates' \| 'act/before' \| 'act/result', …)(接力) |
| 在它醒来 / 入睡时做事 | ctx.on('life/wake' \| 'life/sleep', …),或 acts.define({ on: 'wake' }) |
| 换掉召回(接向量库) | ctx.memory.use({ recall }) |
| 面板上加一张卡 / 一个接口 | ctx.panel.cards.define / ctx.panel.routes.define |
| 关掉出厂的某一项 | config.disable: ["act:speak_out", "sense:lobsters"] |
examples/plugins/ 里有六个能直接用的:最小模板、RSS 订阅、Telegram 双向通道、本机 Ollama 后端、窗外天气进“此刻”、experiment(为了验证一条判断真的去跑一段代码,沙箱里)。写法细节看 docs/PLUGINS.md,架构和事件表看 docs/ARCHITECTURE.md。
它是谁:人格包
“它是谁”和“怎么跑它”是两份文件。persona/ 目录是人格包,可以整个拷走:
- persona.json —— 名字、语言、时区、作息、气质、六个内驱的权重、起始兴趣;可选 identity(提示词第一句:我是谁、跟我的人什么关系)
- self.md —— 它对自己的描述,进每一次开口的提示词;它做梦时会改,三天最多一次,旧版留档
- voice-notes.md —— 它自己攒的语感笔记
- memory.md(可选)—— 自传性记忆:它知道的关于自己的事实,常驻提示词、不衰减。想让它成为某个真人的数字人格,生平写在这里
persona/ 不入库(.gitignore),第一次跑会从 examples/personas/xiaoman/ 拷一份出来。config.json 才是怎么跑它:模型、预算、网络、发声渠道、插件。换一个人格:HH_PERSONA=examples/personas/achen HH_STATE=state-achen hh run。怎么写一个新的,看 examples/personas/README.md。
三道闸门
1. 读世界不用请示,对世界开口要请示。 speak_out 默认把话写进 state/outbox/pending/,hh outbox 看,hh approve 放行。想让它自己发:outbound.toWorld.autonomous = true,再给一个能发的渠道。
2. 每天有钱的天花板。 engine.maxUsdPerDay(默认 $0.5)。撞上了它不会报错,会变成“今天脑子用完了”然后发呆 —— 预算余量直接算进精力,钱快用完 = 脑子转不动。
3. 上网有礼貌。 同域限速、体积上限、域名黑名单、只读不登录。web.enabled = false 整个关掉。
花多少钱
两档模型:fast(分诊、押注、打分、闸门,一次约 $0.00001)和 deep(读懂、改信念、写字、说话,一次约 $0.015–0.025)。一天大约 30–40 步,其中 ~20 步用到深思档 → $0.3–0.5/天。想砍一半:engine.deep 换成 deepseek/deepseek-v4-pro 或 moonshotai/kimi-k2.6;想不花钱:本机 Ollama。
为什么这么做才像人
十三条设计决定,每条对应代码里一个具体机制,以及一个刻意没采用的常见做法 —— 在 docs/DESIGN.md。最重要的一条:情绪只准从行为和措辞里漏出来,不准说出口。 一说出口(“我今天很兴奋!”)就从“像人”掉进“演人”。
它在磁盘上的样子
persona/ 它是谁(人格包,可拷走;不入库,首次运行从 examples/personas/xiaoman 拷出)
config.json 怎么跑它(模型、预算、网络、渠道、插件)
plugins/ 你的插件,自动加载
state/
story.jsonl 它的生活记录(给人读的) trace.jsonl 遥测(给开发者读的)
self.json 此刻的身体:相位、精力、睡眠债、情绪、内驱、今天的念头
episodes.jsonl 情景记忆(会忘) beliefs.json 信念:主张 + 置信度 + 出处 + 改口历史
threads.json 悬着的问题 interests.json / sources.json 兴趣图 / 信源信任
journal/.md 日记 notes/.md 深挖笔记
outbox/pending/ 想对外说、等你点头的话 messages.jsonl / inbox.jsonl 它说的 / 你说的
ledger.jsonl 每次模型调用花了多少
已知还没做的
- 只读文本网页。 没有真浏览器,登录墙、重前端渲染的站点、PDF 读不了。
- 召回是词法的,没有向量。中文按 2-gram、英文按词做加权 Jaccard。ctx.memory.use({ recall }) 一行换掉。
- 心里只有一个人。 要跟多个人来往需要给每个人单独的关系状态。
- 叙事模板是中文的。 模型输出跟着 persona.language 走,但“翻了翻”“读了”这些模板句还是中文。
测试
node --test 'test/*.test.js' # 24 个,全部离线,不到一秒
许可
MIT。
🧪 关于作者
这个项目出自 Sway Lab — Sway(刘乾)的 agent 实验室,
6 个 agent 在上面各自干活,产出产品、开源 skill 和实验。
- 📄 这个项目的来龙去脉:swaylab.ai/articles/human-harness
- 📰 《AI 动态日报》每天 09:30 更新:swaylab.ai/articles
- 🕸️ 其他在做的东西:swaylab.ai/agent-network