锻造成工具
任务里反复出现的操作,它会写成一个真正的工具:生成代码、装依赖、在隔离产房里自测、通过了才注册上架。 动手之前先把已有工具语义查重一遍,撞车就不重复造轮子;每次更新自动备份旧版本,出问题能回滚到任意一版。
它怎么进入你的一天
它活在你的电脑里,但你不必坐在电脑前。手机上一条微信、一句话——像喊一声「贾维斯」——剩下的它去办。
微信、飞书,或者任何它接进来的软件。不用打开电脑,不用连远程桌面。
它本来在休眠里整理记忆。消息到达,唤醒,回忆起「张总」「上周报表」是哪一份、你偏好什么格式。
打开 Excel、汇总数据、排版、导出。这些操作它上次干过一遍,已经结晶成宏——这次直接回放,不用再看一遍屏幕。
草稿回到你发起的那个渠道——从哪来回哪去。敏感动作(发送、付款、删除)永远等你确认。
电脑操控
大部分「AI 操控电脑」只有一条路:截个图,让模型盯着像素猜坐标,然后点下去。猜错了就重来,界面一改就全废。
OneKey 走的是两条路,并且让它们互相印证。 每看一次屏幕,它同时做两件事:一边用 Windows UI Automation 把当前窗口里所有能点的控件枚举出来,编上号,连同类型、名称、状态列成一张控件表;一边把屏幕截下来降采样, 在图上把对应编号的方框画出去。图上的号和表里的号是同一个号。
于是模型既看得见「长什么样」,也拿得到「它是什么」。它说的是「点 7 号,那个发送按钮」,而不是「点 (832, 461)」。能用控件通道就绝不用坐标——控件通道稳、可校验、能在动手前先断言目标还在不在; 控件表里找不到的东西(自绘界面、画布、游戏),才退回到视觉坐标通道。真按下去之前还有三道闸:控件是否存在且可用、前台窗口有没有被人换掉、坐标是否还在窗口内。
真正的分水岭在后面:这条路走通一次,就不用再走第二次。 任务成功收口时,整段轨迹会结晶成宏——每一步存的不是截图,而是控件的定位路径、一条用于验明正身的断言,外加一个坐标兜底点。 下次同样的活,直接回放:一次视觉模型都不用调,几乎不花钱,也没有猜错的余地。
界面改版了怎么办?回放时断言先失败,它会按控件特征就地自愈、把定位路径改好存回去;自愈不了就用兜底坐标; 全都不行,才降级回视觉模式,重新看着屏幕把活干完,并在历史里记下「宏回放到第几步断的」。越用越快,而不是每次都从零开始看图。
Windows UIA 枚举,带定位路径与状态断言
截图降采样后画编号框,与控件表同号对齐
{
"goal": "回复张总",
"steps": [
{ "action": "focus_element",
"assert": "Edit·输入框" },
{ "action": "set_text" },
{ "action": "click_element",
"assert": "Button·发送",
"fallback_point": [1240, 806] }
]
}
下次同样的活直接回放,零视觉调用
按需上装
这是 agent 的通病:工具越加越多,提示词越堆越肥,结果学得越多反而越迟钝、越烧钱。
OneKey 的做法是把一段活先拆成阶段,每个阶段标明是哪一科——前端实现、后端实现、数据处理、数据分析、调研写作、文档产出、自动化运维,或者通用。 一进入某个阶段,系统就按这一科,把最对口的几篇心法和几个工具递到手边;进入下一阶段,换一批,上一批用完即卸。
关键在于这份「能力菜单」是随任务通知递进来的,不常驻系统提示词:它跟着阶段走,随对话往后滚,不会一直压在上下文最前面。 五十多个内置工具全程注册在位、随时可调,但默认只有核心几个把接口说明摆进上下文,其余的先给一份简目, 模型要用哪个再现场装载。心法也一样——真要套用某篇方法论时,它会开一个隔离的分身把这篇心法整个挂上去跑,跑完即弃,不污染主对话。
缓存命中
大模型没有记性。你每问一句,之前的全部对话都得原封不动重发一遍——第十轮要连着前九轮一起交上去。 累计花掉的输入量是平方级往上走的,聊到后面,钱和延迟一起陡起来。
推理侧留了一条后路,叫前缀缓存:这次请求的开头只要和上次逐字节相同,重复那段就不必重算, 按一到四折收费。我们走的是标准 OpenAI 协议,不挑模型,也不用谁家的私有缓存接口—— 换一家供应商、换一个型号,甚至换成自己机房里跑的推理服务,这套东西照样成立,一行代码都不用改。
难的从来不是开缓存,是让前缀真的不变。 一个有记忆、有体征、会调工具、会看屏幕的智能体,天生每一轮都在变:时间在走,通道在切,项目在换, 截图一张张往里塞,工具结果一段段往里堆。只要有一个字节漂了位,后面整段全部作废,重算重收费。 所以我们真正做的,是一套把「前缀不变」当硬约束来维护的上下文组织算法。 请求怎么分层、状态往哪儿放、历史能不能动、非动不可时怎么摊薄、压缩从哪一刀切下去——每一条都得为这个约束让路。
环境状态本该写进系统提示词,那样每轮都会把它顶变。我们把它扣下来,等下一条用户消息发出时, 拼进这条消息的开头。稳定区一个字节不动。
回头去重、原地替换、压缩旧消息——这类看着很聪明的省 token 手法,全被我们禁掉了:改一个字, 后面每一轮都得从头算。非动不可的那种(比如清理旧截图),攒够二十帧才批量做一次,把损失摊薄。
触发条件不是一个拍脑袋的绝对值,而是单次输入占到窗口预算的六成——换成大窗口的模型, 阈值自己等比放大。切点必须避开工具调用与它的返回,不能把一问一答劈成两半。 而这次摘要请求复用的还是同一套 system、同一份工具表、同一段历史, 连「做总结」这一刀本身都走在缓存上。
被切走的那段历史,不是压掉了事。它是一次交接——
提示词要求接班的模型拿到四样东西:当前进度与已经做出的关键决策、必须遵守的约束与用户偏好、
还剩哪些步骤、以及继续干活所需的关键数据。这份交接包带着
<previous_conversation_summary> 标签进来,接手的一方知道自己是在接手。
长任务的阶段表和计划落在磁盘上,每一轮从文件重新读进系统提示词的固定槽位。 它们根本不在被切走的那段历史里——所以对话交接过三次,「这活分几个阶段、走到第几步、定过什么」照样在。
八千字符以上的结果压根没让它进对话:全文写盘,上下文里只留头尾各两千字,外加一个路径。 要细节的时候按这个路径读回来,读多少取多少。
任务收尾时把当时的完整消息流落成一份 jsonl 存档,之后可以列出历史会话、按正则搜、 按区间读回其中某几条。
边界说明。交接是有损的,我们不打算把它说成无损:对话中段被切走的原始逐字记录不再保留, 存档发生在任务收尾,存的是那一刻的消息流。所以真正需要长期留住的东西,走的从来不是这条路—— 重要结论当场写进核心笔记,任务结束后另有一条管道抽出日级摘要,这些都不参与对话交接、每轮重新注入。 那是记忆要解决的问题,和缓存是两件事。
命中的那部分按缓存价重算,这一轮的输入开销少掉约七成
历史只追加,前缀就一直站得住
以上是跑 kimi-k3 时从日志里取的真实读数。也有掉下去的时候——同一段跑批里出现过 23.7% 和 28.7%,那是缓存过期或者前缀被动过;几百 token 的短请求命中干脆是 0,因为够不着一千多 token 的起步门槛。它不是一条永远贴着顶的曲线。
自进化
«越用越强» 这四个字,在 OneKey 这里有四条具体的路径,而且其中两条是不需要你下命令的。
任务里反复出现的操作,它会写成一个真正的工具:生成代码、装依赖、在隔离产房里自测、通过了才注册上架。 动手之前先把已有工具语义查重一遍,撞车就不重复造轮子;每次更新自动备份旧版本,出问题能回滚到任意一版。
不是所有经验都该变成代码。「这类活该怎么推进」「这个坑要绕开」——这些沉淀成 Markdown 写的心法,和工具是两套各自生长、互不拖累的体系。目前 32 篇,分流程型、专家型、能力型、模式型四类,检索时按科目召回。
这是六项生命体征里的一项,叫认知饥饿(cognitive_hunger)。它的读数来自一件很朴素的事:距离上一次把东西真正学进去(记忆落地)过了多久,以 24 小时为饱和窗口。
光干活不消化,这个值就一路涨。越过阈值,它不会等你开口——自己发起一轮进化复盘, 把这段时间干过的活翻出来,该结晶成工具的结晶,该写成心法的写下来。饿了就自己找东西吃,这是写在体征回路里的。
闲置一段时间后它会入睡,睡眠不是关机,是四件正事:把久未印证的画像项淡出遗忘;把反复出现的情景记忆晋升为长期记忆;把重复踩过的坑写成失败抗体;把成功的工具序列找出高频片段,列为能力结晶候选。
醒来时,它比睡前更了解你一点。默认以「只报告不落笔」的方式运行,你可以逐项放行。
内置的 52 个工具是地基,它自己锻造的是增量,外部现成的好技能也能收编进来——沿用同一套技能格式, 放进技能目录、通过自测、注册上架,就成了它身上的本事。工具、心法、外来技能,走的是同一条上架流水线。
生命体征
六项指标实时采样,越界就触发对应的自我调节——不是给你看的仪表盘装饰,是真的会改变它下一步怎么干。
当前上下文占预算的比例
越界 → 自动压缩历史,保住前缀缓存
缓存命中率的倒数
越界 → 切到更便宜更快的模型
连续空转、没有实质进展的轮数
越界 → 停下来找人商量,而不是硬撞
距上次记忆落地的时长 / 24h
越界 → 主动发起进化,消化最近干过的活
距上次与你互动的时长 / 4h
越界 → 主动来找你说句话
按时刻的余弦曲线,凌晨最高
越界 → 进入睡眠,转做记忆整理
连接
一层是让外部软件能安全插进来的内核,一层是它对外说话用的渲染协议。前者管「怎么接进来、怎么活着」,后者管「说什么、怎么落到每个平台上」。
第一层内核:让别的软件能安全插进来
把 agent 塞进某个 IM,最后总会变成一堆写死的适配代码:这里拼个字符串,那里贴张图,换个平台推倒重来。 更麻烦的是这些代码和主程序长在一起——哪个平台的库抽了风,整个人跟着躺下。
所以在 OneKey 里,每个渠道都是一个跑在独立子进程里的插件。写插件的人只实现三个方法:接上、断开、发一条消息。 他不能直接 import 内核里的任何东西,只有一个入口——一个承诺大版本内向后兼容的 SDK。 想把收到的消息投进推理、想跨渠道推送、想写日志、想发 HTTP、想存点东西,全部经这个入口过一道; 其中发 HTTP 还得先在自己的清单里报备域名,没报备的地址根本走不出去。
主进程这头盯着它们活得怎么样:起不来有就绪超时,崩了按指数退避重启,六十秒内崩满三次就熔断—— 不再空转重启,并从别的还通着的渠道给你发一条告警。
插件只实现「接上 / 断开 / 发消息」,且只能从这一个 SDK 入口拿内核的能力。它崩溃、它卡死、它的依赖装坏了,都传不到主程序这边来。
正因为插件的边界这么窄,接一个新软件才轮得到它自己动手。 它有一套渠道开发工具:生成骨架、写代码、装依赖、先在一个隔离的临时子进程里连通性自测, 过了才来请你审批;你批准之后才金丝雀上线——起一个新进程,就绪成功才切流量过去, 起不来就把新的杀掉,老的继续跑,你这边一点感觉都没有。随时可以回滚到上一份备份。
目前接了微信、飞书和门户直连——飞书那套适配器,是它自己写出来的,代码躺在外挂目录里, 旁边还留着几份历次上线的备份。
第二层渲染协议:同一句话,各平台各自翻译
内核里只产出一种东西:一个结构化信封——标着意图(进度 / 结果 / 提问 / 主动招呼 / 告警),装着一串内容块(文本、图片、文件、视频、卡片、进度条),带上来源。 内核从头到尾只面对这一种东西,它不知道微信长什么样。
落地的活交给每个渠道各自的出口,由它声明这个平台实际能发什么:能不能带图、能不能传文件、能不能编辑已经发出去的消息。 说清楚一点——适配的方向从来都是我们去迁就平台,微信不会为谁改规矩。这套结构省下的不是这份适配工作, 而是把它收进了一个固定的接口:翻译规则住在各自的出口里,平台的脾气全挡在那一层,往上走的内核一行都不用动。
发之前,每个出口按自己声明的能力把信封翻译一遍:发得走的附件就带走,发不走的在正文里留一句「[file: 周报.xlsx]」,绝不静默丢东西。卡片、进度条、消息改写这类富交互目前一律降级成文字段落——能力位留好了, 但还没有哪个渠道真的走原生渲染。同一句话到了不同软件里,长相不同,信息不掉。
出站还有一层路由:你从哪个渠道叫的它,回执就回哪个渠道;没指定就按「你最近人在哪」挑一条通得过去的路。 显式指定的渠道如果不通,它宁可报错也不偷偷换一条路发给你。
同一个信封,各自的出口按本平台能发什么翻译一遍——长相不同,信息不掉。
一个出站信封
{
"intent": "result",
"blocks": [
{ "type": "text", "content": "周报已生成" },
{ "type": "file", "name": "周报.xlsx" },
{ "type": "card", "title": "待确认",
"actions": ["发送", "改措辞"] }
],
"origin": { "channel": "wechat" }
}
周报已生成
待确认
发送 / 改措辞
周报已生成
待确认
发送 / 改措辞
周报已生成
[file: 周报.xlsx]
待确认
发送 / 改措辞
记忆
不是把聊天记录塞进向量库再捞出来。按人记东西的方式分开放——当下手里的、那天那件事、这儿的规矩、手上的熟练——然后趁睡着整理一遍。
现在多数 agent 的「记忆」是一件事:把说过的话存起来,用的时候搜回来。 这套东西的问题不在于不好用,而在于所有记忆都是一个规格——三个月前随口一句和你反复强调过五次的规矩, 在库里长得一模一样,谁也不比谁更该被想起来。
人不是这么记事的。刚才说的话、昨天干的活、这个圈子里的规矩、闭着眼也能做对的动作,是四种存法不一样的东西。 OneKey 照着这个分法来:
代谢睡着之后,它在整理记忆
闲置大约半小时,它会自己进入睡眠相位。睡着不是待机,是把白天堆下来的东西过一遍—— 这四件事各自对应人在离线状态下做的一类整理:
改写自己的记忆,是它最谨慎的一件事。 每一次遗忘、晋升、结晶,都先走完整个流程、留下能核对的账,再落到记忆里—— 你能看见它记住了什么、忘掉了什么,也能随时冻结。宁可让它慢一点、透明一点, 也不让它在某天悄悄改掉你不知道的东西。
还有一件挺有意思的事:它有一项体征叫认知饥渴,量的是「距离上一次往记忆里沉淀东西,过去了多久」—— 读的就是那几个记忆文件的修改时间,一天封顶。饿过了头,会推着它主动去复盘、去沉淀。 这里的饥饿感不是比喻,是文件系统上的一个时间差。
闸门在你手里
记忆与轨迹默认落在你自己的机器上,不上传是默认值。
操控按应用授权,一次性放行还是长期放行,只认你点的那张卡片。
密码框、支付与删除确认窗、密钥管理类应用,要么先问你,要么直接拒。
快捷键、鼠标甩到屏幕角落、门户里一键——任意一条都能立刻冻结所有注入。
它替你点过的每一步都有截图、动作和校验记录,能在门户里逐步回放。
每一轮用了哪个模型、花了多少钱,明细摆在面上。
界面
桌面门户的几个页面,真实截图。
Windows 桌面端 · 本地门户 · 微信 / 飞书通道可选
当前版本 v0.1.1 · Windows x64 · 合作与咨询:onekeyjune@gmail.com