“规划十二月旅行”这件事,周一拖到周三,周三拖到周五。真正难的不是做,而是开始:空白页、第一版提纲、连要决定哪些事都列不出来。

打开网易新闻 查看精彩图片

Ripe 把这些被反复推迟的任务当成植物养。你只写一句话说明拖着什么,再告诉它你什么时候回来,然后离开。在你不在的时间里,一个跑在本机的开放权重模型分小步推进,每一步都保存:读请求、拆工作、每步写一块、最后整体审一遍。回来时,等着的是一份计划、一版草稿或一张清单,外加一小串只有你能回答的问题。

植物只认真实保存的工作

每个任务是一株植物,而植物只在有真实产出被保存时才生长:

  • 代理理解请求时,种子发芽;
  • 每规划一步,茎上冒出一个花苞;
  • 每完成一步,展开一根可点击阅读的枝叶;
  • 第一块内容写出时开花,大部分工作完成时结果,全部审完才成熟;
  • 需要你回答的花苞会干枯,并显示一滴蓝色小水珠。

土壤里贯穿一条发光的菌丝网络,那就是代理。你能看到光脉冲从苗床边缘的蘑菇传向它正在喂养的植物;Ollama 一停,整张网络变灰。收获的任务以罐子形式保存在储藏室里。

点开一株植物,会看到它的标本页:植物被画成一张植物学图版,编号部位对应各块工作,旁边是任务所处状态——代理完成了什么、需要你什么、哪些可以读了,还有正在写的文字、代理的提问和一个阅读室。每一块都能编辑、复制、下载为 Markdown,或按你的要求重写(比如“更短更直接”),旧版本始终保留。

不猜,直接问

请求缺信息时,代理会指出来。问题分必答和可选,必答项只卡住最后一步,其余照常推进。正文里的未知内容写成 [[TBD: ...]] 标记,阅读室会把它高亮为缺口,而不是编一个答案填上。你回答之后,一键重写仍有缺口的那些块。

每株植物是由任务 id 生成的过程式 SVG,同一个任务每次长出的样子都一样。物种取决于代理判断你需要的结果类型:计划是柿子,文档是李子,演示是柠檬,消息是无花果。打开植物时,它会从苗床变形为标本页的图版。

为什么必须是开放、本地的模型

拖延的代价必须足够低。Ripe 处理的是你可能再也不回来的任务,按 token 计费的 API 会让每个被放弃的任务都变成账单;在这里,忽略一个任务的成本只是些电和时间,而时间正是拖延者愿意付出的东西。

慢一点没关系,前提是它属于你。没有速率限制,也没有延迟预算。一个每步要 40 秒的小模型放在聊天窗口里会显得迟钝,放在你根本不盯着看的花房里刚刚好。整个设计都建立在这上面:小步、边做边存、步与步之间歇一会儿。

人们拖着的事往往很私人:回复一位情绪不好的客户、旅行预算、家庭计划。这些都不离开这台机器,请求、草稿、回答和日志全部留在本地 SQLite 文件里。因为每一部分都开放,提示词、schema、队列及其限制都在仓库里,模型只是一个设置项。

省下来的时间

演示中的那次运行在搭载 M4 芯片的 MacBook Air 上完成,实际耗时约 20 分钟,全程无人看管。那次比平时慢,因为同一台笔记本还在录视频;不录像时,它读请求约 22 秒,规划约 11 秒,每块内容写 33 到 49 秒。

技术栈是 Next.js 16(App Router、React 19、TypeScript、Tailwind CSS 4、Motion、Radix UI),配 Prisma 7 和 SQLite,AI 全部来自本机 Ollama 上的 Gemma,模型可在界面里更换。代理不是聊天循环,而是一个队列:interpret、plan、generate、review、revise 各自是独立作业,解释、规划、审查使用结构化输出,每个响应都对照 Zod schema 校验,同时作为 JSON 格式发给 Ollama;内容本身以 Markdown 流式输出。

作业存在 SQLite 里,状态明确:queued → running → done | failed | cancelled。运行中的作业持有租约,进程中途死掉,重启后作业回到队列,日志记录这次中断,已保存的内容不会丢。工作进程接活前先检查 Ollama 健康状态,Ollama 挂了就不消费任何作业,任务自行等待并恢复——演示里那次停摆就是这么来的。每步最多三次尝试,退避递增,单次调用四分钟,每个任务最多 24 次运行,步间休息可配置。

界面读取的是数据库里的真实状态。你看到正在写的文字就是模型的流,约每 700 毫秒保存一次。生长只由已持久化的里程碑计算——请求已理解、计划已保存、步骤已完成、审查已保存——从不按时间流逝推算,所以一株看起来成熟的植物,背后确实每一块都写完并审过了。