OneKey

住在你电脑里的
数字生命

一句话,它替你把活干完——哪怕你人不在电脑前。 不是聊天机器人,也不是工作流引擎。它常驻在你的 Windows 上,有记忆、有体征、会自己长本事;你在外面发一条微信,它在家里那台电脑上动手。

  • 52内置工具
  • 32篇心法
  • 6项生命体征
  • 10行代码

它怎么进入你的一天

你人在外面,
它在家里那台电脑上动手

它活在你的电脑里,但你不必坐在电脑前。手机上一条微信、一句话——像喊一声「贾维斯」——剩下的它去办。

  1. 01

    你在地铁上发了一句话

    微信、飞书,或者任何它接进来的软件。不用打开电脑,不用连远程桌面。

    「把昨天的报表整理成周报,发给张总」
  2. 02

    家里的它醒过来

    它本来在休眠里整理记忆。消息到达,唤醒,回忆起「张总」「上周报表」是哪一份、你偏好什么格式。

    唤醒 · 回忆上下文 · 认领任务
  3. 03

    它在你的电脑上真的动手

    打开 Excel、汇总数据、排版、导出。这些操作它上次干过一遍,已经结晶成宏——这次直接回放,不用再看一遍屏幕。

    宏回放 · 失败自动降级为看屏操作
  4. 04

    回到你手机上,等你点头

    草稿回到你发起的那个渠道——从哪来回哪去。敏感动作(发送、付款、删除)永远等你确认。

    原路回执 · 敏感动作待确认

电脑操控

控件 + 视觉两条腿走路,
干成一次就结晶下来

大部分「AI 操控电脑」只有一条路:截个图,让模型盯着像素猜坐标,然后点下去。猜错了就重来,界面一改就全废。

OneKey 走的是两条路,并且让它们互相印证。 每看一次屏幕,它同时做两件事:一边用 Windows UI Automation 把当前窗口里所有能点的控件枚举出来,编上号,连同类型、名称、状态列成一张控件表;一边把屏幕截下来降采样, 在图上把对应编号的方框画出去。图上的号和表里的号是同一个号。

于是模型既看得见「长什么样」,也拿得到「它是什么」。它说的是「点 7 号,那个发送按钮」,而不是「点 (832, 461)」。能用控件通道就绝不用坐标——控件通道稳、可校验、能在动手前先断言目标还在不在; 控件表里找不到的东西(自绘界面、画布、游戏),才退回到视觉坐标通道。真按下去之前还有三道闸:控件是否存在且可用、前台窗口有没有被人换掉、坐标是否还在窗口内。

真正的分水岭在后面:这条路走通一次,就不用再走第二次。 任务成功收口时,整段轨迹会结晶成宏——每一步存的不是截图,而是控件的定位路径、一条用于验明正身的断言,外加一个坐标兜底点。 下次同样的活,直接回放:一次视觉模型都不用调,几乎不花钱,也没有猜错的余地。

界面改版了怎么办?回放时断言先失败,它会按控件特征就地自愈、把定位路径改好存回去;自愈不了就用兜底坐标; 全都不行,才降级回视觉模式,重新看着屏幕把活干完,并在历史里记下「宏回放到第几步断的」。越用越快,而不是每次都从零开始看图。

通道 A控件枚举
[5]Edit · 输入框可编辑
[7]Button · 发送可点击
[8]List · 会话列表可滚动
[9]Edit · 密码敏感

Windows UIA 枚举,带定位路径与状态断言

通道 B视觉标注

截图降采样后画编号框,与控件表同号对齐

沉淀结晶成宏
{
  "goal": "回复张总",
  "steps": [
    { "action": "focus_element",
      "assert": "Edit·输入框" },
    { "action": "set_text" },
    { "action": "click_element",
      "assert": "Button·发送",
      "fallback_point": [1240, 806] }
  ]
}

下次同样的活直接回放,零视觉调用

三道注入闸控件可用 · 前台未变 · 坐标在窗口内
可插话动作间隙听得到你说话,当场改道
焦点礼让你自己打字时它立刻停手,不抢窗口
全程留痕每步截图、动作、校验入库,可逐步回放

按需上装

本事堆到上百样,
进脑子的永远只有当下这几样

这是 agent 的通病:工具越加越多,提示词越堆越肥,结果学得越多反而越迟钝、越烧钱。

OneKey 的做法是把一段活先拆成阶段,每个阶段标明是哪一科——前端实现、后端实现、数据处理、数据分析、调研写作、文档产出、自动化运维,或者通用。 一进入某个阶段,系统就按这一科,把最对口的几篇心法和几个工具递到手边;进入下一阶段,换一批,上一批用完即卸。

关键在于这份「能力菜单」是随任务通知递进来的,不常驻系统提示词:它跟着阶段走,随对话往后滚,不会一直压在上下文最前面。 五十多个内置工具全程注册在位、随时可调,但默认只有核心几个把接口说明摆进上下文,其余的先给一份简目, 模型要用哪个再现场装载。心法也一样——真要套用某篇方法论时,它会开一个隔离的分身把这篇心法整个挂上去跑,跑完即弃,不污染主对话。

阶段 1调研写作 已卸载
阶段 2数据处理 装载中
阶段 3文档产出 待命

当前阶段递到手边的能力

心法 · 数据清洗流程
心法 · 异常值判定
工具 · code_exec
工具 · db_ops
工具 · file_ops

上一阶段的 5 项能力已随阶段切换退出上下文

缓存命中

让每一轮请求的开头,
逐字节不变

大模型没有记性。你每问一句,之前的全部对话都得原封不动重发一遍——第十轮要连着前九轮一起交上去。 累计花掉的输入量是平方级往上走的,聊到后面,钱和延迟一起陡起来。

推理侧留了一条后路,叫前缀缓存:这次请求的开头只要和上次逐字节相同,重复那段就不必重算, 按一到四折收费。我们走的是标准 OpenAI 协议,不挑模型,也不用谁家的私有缓存接口—— 换一家供应商、换一个型号,甚至换成自己机房里跑的推理服务,这套东西照样成立,一行代码都不用改。

难的从来不是开缓存,是让前缀真的不变。 一个有记忆、有体征、会调工具、会看屏幕的智能体,天生每一轮都在变:时间在走,通道在切,项目在换, 截图一张张往里塞,工具结果一段段往里堆。只要有一个字节漂了位,后面整段全部作废,重算重收费。 所以我们真正做的,是一套把「前缀不变」当硬约束来维护的上下文组织算法。 请求怎么分层、状态往哪儿放、历史能不能动、非动不可时怎么摊薄、压缩从哪一刀切下去——每一条都得为这个约束让路。

算法 01会变的,全赶到尾巴上
system人格 · 框架 · 项目约定从不改
tools核心工具接口从不改
历史第 1 … 第 N 轮只追加
以上逐字节相同 → 全部命中
新消息<env> 时间 · 通道 · 项目
+ 你这句话
每轮都变

环境状态本该写进系统提示词,那样每轮都会把它顶变。我们把它扣下来,等下一条用户消息发出时, 拼进这条消息的开头。稳定区一个字节不动。

算法 02历史只许追加,不许回头改
第 1 轮命中
第 2 轮命中
第 3 轮改了一句
第 4 轮全额重算
第 5 轮全额重算

回头去重、原地替换、压缩旧消息——这类看着很聪明的省 token 手法,全被我们禁掉了:改一个字, 后面每一轮都得从头算。非动不可的那种(比如清理旧截图),攒够二十帧才批量做一次,把损失摊薄。

算法 03切下去之前,先想清楚从哪切
早期历史
assistant · 调用 read_file
tool · 返回文件内容
✕ 粗切点落这儿,一问一答被劈两半
✓ 整对推到右边,才是安全切点
最近 8 条 · 原样保留

触发条件不是一个拍脑袋的绝对值,而是单次输入占到窗口预算的六成——换成大窗口的模型, 阈值自己等比放大。切点必须避开工具调用与它的返回,不能把一问一答劈成两半。 而这次摘要请求复用的还是同一套 system、同一份工具表、同一段历史, 连「做总结」这一刀本身都走在缓存上

被切走的那段历史,不是压掉了事。它是一次交接—— 提示词要求接班的模型拿到四样东西:当前进度与已经做出的关键决策、必须遵守的约束与用户偏好、 还剩哪些步骤、以及继续干活所需的关键数据。这份交接包带着 <previous_conversation_summary> 标签进来,接手的一方知道自己是在接手。

系统侧 · 不参与交接 任务主线与计划

长任务的阶段表和计划落在磁盘上,每一轮从文件重新读进系统提示词的固定槽位。 它们根本不在被切走的那段历史里——所以对话交接过三次,「这活分几个阶段、走到第几步、定过什么」照样在。

磁盘 · 留有回读路径 超长的工具输出

八千字符以上的结果压根没让它进对话:全文写盘,上下文里只留头尾各两千字,外加一个路径。 要细节的时候按这个路径读回来,读多少取多少。

收尾时 · 可检索 整段会话存档

任务收尾时把当时的完整消息流落成一份 jsonl 存档,之后可以列出历史会话、按正则搜、 按区间读回其中某几条。

边界说明。交接是有损的,我们不打算把它说成无损:对话中段被切走的原始逐字记录不再保留, 存档发生在任务收尾,存的是那一刻的消息流。所以真正需要长期留住的东西,走的从来不是这条路—— 重要结论当场写进核心笔记,任务结束后另有一条管道抽出日级摘要,这些都不参与对话交接、每轮重新注入。 那是记忆要解决的问题,和缓存是两件事。

一次真实请求的构成26,308 tokens
93.4%
24,576 命中 系统提示词 · 工具表 · 全部历史 按缓存价计
1,732 新增 这一轮的新消息与 <env> 按原价计

命中的那部分按缓存价重算,这一轮的输入开销少掉约七成

同一段对话往下走,连续四轮
94.7%第 3 轮
94.3%第 4 轮
93.9%第 5 轮
93.4%第 6 轮

历史只追加,前缀就一直站得住

以上是跑 kimi-k3 时从日志里取的真实读数。也有掉下去的时候——同一段跑批里出现过 23.7% 和 28.7%,那是缓存过期或者前缀被动过;几百 token 的短请求命中干脆是 0,因为够不着一千多 token 的起步门槛。它不是一条永远贴着顶的曲线。

协议无关标准 OpenAI 协议,换模型、换供应商都不用改
渲染是纯函数内部状态没变,发出去的字节就不会变
失效可摊薄非改不可的历史清理,攒够二十次才做一次
省了多少看得见命中部分按缓存价还原,逐轮列进账单

自进化

干过的活会变成本事,
闲下来它自己消化

«越用越强» 这四个字,在 OneKey 这里有四条具体的路径,而且其中两条是不需要你下命令的

01

锻造成工具

任务里反复出现的操作,它会写成一个真正的工具:生成代码、装依赖、在隔离产房里自测、通过了才注册上架。 动手之前先把已有工具语义查重一遍,撞车就不重复造轮子;每次更新自动备份旧版本,出问题能回滚到任意一版。

查重生成自测上架
02

沉淀成心法

不是所有经验都该变成代码。「这类活该怎么推进」「这个坑要绕开」——这些沉淀成 Markdown 写的心法,和工具是两套各自生长、互不拖累的体系。目前 32 篇,分流程型、专家型、能力型、模式型四类,检索时按科目召回。

工具 = 能跑的代码·心法 = 能读的方法论
03

求知欲:认知饥饿

这是六项生命体征里的一项,叫认知饥饿(cognitive_hunger)。它的读数来自一件很朴素的事:距离上一次把东西真正学进去(记忆落地)过了多久,以 24 小时为饱和窗口。

光干活不消化,这个值就一路涨。越过阈值,它不会等你开口——自己发起一轮进化复盘, 把这段时间干过的活翻出来,该结晶成工具的结晶,该写成心法的写下来。饿了就自己找东西吃,这是写在体征回路里的。

0.85 阈值
越界 → 触发进化链
04

睡眠里的沉淀

闲置一段时间后它会入睡,睡眠不是关机,是四件正事:把久未印证的画像项淡出遗忘;把反复出现的情景记忆晋升为长期记忆;把重复踩过的坑写成失败抗体;把成功的工具序列找出高频片段,列为能力结晶候选

醒来时,它比睡前更了解你一点。默认以「只报告不落笔」的方式运行,你可以逐项放行。

技能来源

内置的 52 个工具是地基,它自己锻造的是增量,外部现成的好技能也能收编进来——沿用同一套技能格式, 放进技能目录、通过自测、注册上架,就成了它身上的本事。工具、心法、外来技能,走的是同一条上架流水线。

生命体征

它有状态,
而且状态会改变它的行为

六项指标实时采样,越界就触发对应的自我调节——不是给你看的仪表盘装饰,是真的会改变它下一步怎么干。

上下文压力

当前上下文占预算的比例

越界 → 自动压缩历史,保住前缀缓存

精力

缓存命中率的倒数

越界 → 切到更便宜更快的模型

挫败感

连续空转、没有实质进展的轮数

越界 → 停下来找人商量,而不是硬撞

认知饥饿

距上次记忆落地的时长 / 24h

越界 → 主动发起进化,消化最近干过的活

社交联结

距上次与你互动的时长 / 4h

越界 → 主动来找你说句话

昼夜节律

按时刻的余弦曲线,凌晨最高

越界 → 进入睡眠,转做记忆整理

连接

它不是「装在微信里」,
底下是两层东西

一层是让外部软件能安全插进来的内核,一层是它对外说话用的渲染协议。前者管「怎么接进来、怎么活着」,后者管「说什么、怎么落到每个平台上」。

第一层内核:让别的软件能安全插进来

把 agent 塞进某个 IM,最后总会变成一堆写死的适配代码:这里拼个字符串,那里贴张图,换个平台推倒重来。 更麻烦的是这些代码和主程序长在一起——哪个平台的库抽了风,整个人跟着躺下。

所以在 OneKey 里,每个渠道都是一个跑在独立子进程里的插件。写插件的人只实现三个方法:接上、断开、发一条消息。 他不能直接 import 内核里的任何东西,只有一个入口——一个承诺大版本内向后兼容的 SDK。 想把收到的消息投进推理、想跨渠道推送、想写日志、想发 HTTP、想存点东西,全部经这个入口过一道; 其中发 HTTP 还得先在自己的清单里报备域名,没报备的地址根本走不出去。

主进程这头盯着它们活得怎么样:起不来有就绪超时,崩了按指数退避重启,六十秒内崩满三次就熔断—— 不再空转重启,并从别的还通着的渠道给你发一条告警。

主进程 推理 · 出站路由 · 生命周期监督
投递消息进推理 · 跨渠道推送 · 日志 · 白名单 HTTP · 键值存储
微信独立子进程
飞书独立子进程它自己写的
门户独立子进程

插件只实现「接上 / 断开 / 发消息」,且只能从这一个 SDK 入口拿内核的能力。它崩溃、它卡死、它的依赖装坏了,都传不到主程序这边来。

正因为插件的边界这么窄,接一个新软件才轮得到它自己动手。 它有一套渠道开发工具:生成骨架、写代码、装依赖、先在一个隔离的临时子进程里连通性自测, 过了才来请你审批;你批准之后才金丝雀上线——起一个新进程,就绪成功才切流量过去, 起不来就把新的杀掉,老的继续跑,你这边一点感觉都没有。随时可以回滚到上一份备份。

目前接了微信、飞书和门户直连——飞书那套适配器,是它自己写出来的,代码躺在外挂目录里, 旁边还留着几份历次上线的备份。

第二层渲染协议:同一句话,各平台各自翻译

内核里只产出一种东西:一个结构化信封——标着意图(进度 / 结果 / 提问 / 主动招呼 / 告警),装着一串内容块(文本、图片、文件、视频、卡片、进度条),带上来源。 内核从头到尾只面对这一种东西,它不知道微信长什么样。

落地的活交给每个渠道各自的出口,由它声明这个平台实际能发什么:能不能带图、能不能传文件、能不能编辑已经发出去的消息。 说清楚一点——适配的方向从来都是我们去迁就平台,微信不会为谁改规矩。这套结构省下的不是这份适配工作, 而是把它收进了一个固定的接口:翻译规则住在各自的出口里,平台的脾气全挡在那一层,往上走的内核一行都不用动。

发之前,每个出口按自己声明的能力把信封翻译一遍:发得走的附件就带走,发不走的在正文里留一句「[file: 周报.xlsx]」,绝不静默丢东西。卡片、进度条、消息改写这类富交互目前一律降级成文字段落——能力位留好了, 但还没有哪个渠道真的走原生渲染。同一句话到了不同软件里,长相不同,信息不掉。

出站还有一层路由:你从哪个渠道叫的它,回执就回哪个渠道;没指定就按「你最近人在哪」挑一条通得过去的路。 显式指定的渠道如果不通,它宁可报错也不偷偷换一条路发给你。

同一个信封,各自的出口按本平台能发什么翻译一遍——长相不同,信息不掉。

一个出站信封

{
  "intent": "result",
  "blocks": [
    { "type": "text",  "content": "周报已生成" },
    { "type": "file",  "name": "周报.xlsx" },
    { "type": "card",  "title": "待确认",
      "actions": ["发送", "改措辞"] }
  ],
  "origin": { "channel": "wechat" }
}
微信 text · image · file · video

周报已生成

📎 周报.xlsx

待确认
发送 / 改措辞

飞书 text · image · file · video 它自己写的

周报已生成

📎 周报.xlsx

待确认
发送 / 改措辞

门户主动气泡 text

周报已生成

[file: 周报.xlsx]

待确认
发送 / 改措辞

翻译住在出口里内核不认通道细节,换平台不动内核
从哪来回哪去出站路由认来源,不静默改道
子进程隔离外挂渠道崩溃自动熔断,主程序不受影响
自主接入脚手架 → 自测 → 审批 → 金丝雀 → 回滚

记忆

它的记忆会沉淀,
也会自己变淡

不是把聊天记录塞进向量库再捞出来。按人记东西的方式分开放——当下手里的、那天那件事、这儿的规矩、手上的熟练——然后趁睡着整理一遍。

现在多数 agent 的「记忆」是一件事:把说过的话存起来,用的时候搜回来。 这套东西的问题不在于不好用,而在于所有记忆都是一个规格——三个月前随口一句和你反复强调过五次的规矩, 在库里长得一模一样,谁也不比谁更该被想起来。

人不是这么记事的。刚才说的话、昨天干的活、这个圈子里的规矩、闭着眼也能做对的动作,是四种存法不一样的东西。 OneKey 照着这个分法来:

工作记忆working
这一轮手里握着的:最近几轮对话、今天的摘要、项目共识
每轮自动拼进提示词,不额外花一次模型调用
情景记忆episodic
「那天那件事」:与张总的合同,条款已核对,约定明早签署
每完成一件事落一句话,按天堆在本机 Markdown 里
语义记忆semantic
「这儿的规矩」:门户优先本地部署 · 对外话术避免「AI 味」
脱离了具体哪一天,按项目隔离,跟着项目走
程序性记忆procedural
「手熟了」:同一套操作做顺了,结晶成一条宏
下次不再看屏幕思考,直接回放;对不上就退回慢路
主人画像关于你这个人
偏好简洁回复 · 合同类先拟草稿再发 · 周五下午少打扰
跨项目跨会话,每一条都带一个置信度——这个数字下面有用

代谢睡着之后,它在整理记忆

闲置大约半小时,它会自己进入睡眠相位。睡着不是待机,是把白天堆下来的东西过一遍—— 这四件事各自对应人在离线状态下做的一类整理:

遗忘

有效分 = 置信度 × 0.5年龄 / 半衰期

画像里每一条都按半衰期指数衰减,默认三十天减半,跌破 0.2 列入淡出。 久未印证的说法会自己变轻,而不是永远算数。

晋升

情景 → 语义 · 重复 ≥ 2

扫一遍近期的一句话摘要,同一个要点反复出现达到阈值,就提名进长期记忆。 「又出现了一次」本身就是值得长期记住的信号——不需要谁来标注重要性。

抗体

同类失败 ≥ 3 → 一条护栏

判定「同类」的办法是给报错做指纹:把里面的路径、数字、引号内容全抹成占位符,剩下的骨架一样就算同一种病。 栽够次数,长出一条护栏心法。踩过的坑变成不再踩的本能。

结晶

重复成功的动作序列 → 一键能力

翻当天成功的轨迹,找反复出现的工具序列,提名固化。 这条和上面的程序性记忆是同一个道理,只是一个长在鼠标上,一个长在工具链上

改写自己的记忆,是它最谨慎的一件事。 每一次遗忘、晋升、结晶,都先走完整个流程、留下能核对的账,再落到记忆里—— 你能看见它记住了什么、忘掉了什么,也能随时冻结。宁可让它慢一点、透明一点, 也不让它在某天悄悄改掉你不知道的东西。

还有一件挺有意思的事:它有一项体征叫认知饥渴,量的是「距离上一次往记忆里沉淀东西,过去了多久」—— 读的就是那几个记忆文件的修改时间,一天封顶。饿过了头,会推着它主动去复盘、去沉淀。 这里的饥饿感不是比喻,是文件系统上的一个时间差。

闸门在你手里

能力越大,
越要能随时按停

本机优先

记忆与轨迹默认落在你自己的机器上,不上传是默认值。

逐个授权

操控按应用授权,一次性放行还是长期放行,只认你点的那张卡片。

敏感拦截

密码框、支付与删除确认窗、密钥管理类应用,要么先问你,要么直接拒。

三通道急停

快捷键、鼠标甩到屏幕角落、门户里一键——任意一条都能立刻冻结所有注入。

全程留痕

它替你点过的每一步都有截图、动作和校验记录,能在门户里逐步回放。

账本透明

每一轮用了哪个模型、花了多少钱,明细摆在面上。

界面

它长这样

桌面门户的几个页面,真实截图。

驾驶舱:本体体征面板与实时对话
驾驶舱 项目树、多会话、流式对话,顶栏挂着它此刻的体征
电脑操控:逐步轨迹回放
操控轨迹回放 它点过的每一步:截图、动作、校验,逐步翻看
记忆面板:主人画像与核心记忆
记忆面板 它记住了你什么,全摆在这——能改、能删、能让它闭嘴不记
用量与成本仪表盘
用量与成本 每轮用了哪个模型、花了几分钱,账本摆在明面上

来看它活着的样子

Windows 桌面端 · 本地门户 · 微信 / 飞书通道可选

当前版本 v0.1.1 · Windows x64 · 合作与咨询:onekeyjune@gmail.com