RWork
作者个人站:https://softwarescience.top/ · 本项目主页:https://softwarescience.top/projects/rwork(版本、截图与下载都在那儿)
本地优先的 AI 工作台:对话、流式回复,以及一份留在本机的大模型用量审计账本。
界面用 gpui-kit(GPUI 组件库)构建,网络走 tokio + reqwest,
数据存在一个嵌入式 SQLite 文件里。全部界面文案默认简体中文,可切换英文,字体内置
Maple Mono NF CN,不需要任何系统安装。
cargo run -p rwork-app
依赖 Rust 1.90+(edition 2024)与 MSVC 工具链。首次启动会在
%APPDATA%\RWork\rwork.db 建库,并预置一个 DeepSeek 服务配置,填上 API 密钥即可对话。
文档
| 文件 | 内容 |
|---|---|
FEATURES.md |
功能清单 + 界面 ASCII 示意图(「有什么、长什么样」) |
REQUIREMENTS.md |
需求来源、已完成与未完成的状态(含验证方式与前置条件) |
AGENTS.md |
开发约定(硬性要求:注释与说明一律中文) |
功能
对话
- 流式输出,逐字上屏;带思考通道的模型(DeepSeek Reasoner、Claude 思考模式)单独展示推理内容。
- 随时停止:已生成的内容保留并照常入库。
- 上下文预算:接近窗口时先做结构化压缩——用户原话一个字不动,助手的长回答截断并标明,
推理整段丢掉,工具输出压成摘要;超长的工具输出把全文存成工作区里的文件、只把引用交给模型
(引用用
read读得回来,因此「后来需要那份原始输出」不必重跑一次工具)。 再超出才按条裁剪,并在对话里说明省略了多少条,而不是悄悄丢掉。 - 压缩与裁剪都记进这一轮的统计(压了几条、丢了几条、省了多少 token、存了几个文件), 所以「它怎么忘了刚才说的」不必再去翻日志。
- 历史对话列表可搜索,标题取首条消息首行。
工具调用(function calling)
- 助手可以读写文件、按内容或通配符搜索、执行 shell 命令。三个接口方言都支持:OpenAI 兼容的
delta.tool_calls[]、Anthropic 的tool_use/input_json_delta内容块、Ollama 的对象式参数。 - 流式拼接按 provider 给的 index 分组:参数分片跨帧拼接,id 缺失时补一个,缺名字的调用被丢弃 (跑错工具比不跑更糟)。对象式参数按字段合并而不是字符串拼接。
- 一轮可以连续多轮调用,直到模型不再请求工具,或达到轮次上限(默认 12 轮,可配)。
- 工具结果和调用请求一起入库,重开对话时原样回放——provider 会拒绝没有对应请求的工具结果。
权限(分层 + 内容研判 + 历史授权)
- 三个层级:
read/write/exec,工具的声明可以按参数变化(bash遇到rm -rf自己升级成 强制确认,遇到rm -rf /直接拒绝)。 - 三种模式:每次都问 / 自动写入 / 全部放行。模式只说明「这一轮能做到多少」,不代表某个文件安全。
- 授权可记住,作用域分层:本次会话 < 工具 < 工具组(整个 MCP server)< 目录 < 工具+目录 < 单个文件。
更具体的作用域优先,且拒绝优先于允许,所以针对
.env的拒绝不会被目录级允许覆盖。 - 内容研判在决定前跑:office 文档、PDF、压缩包、图片是容器格式,按文本改写会破坏它们,直接拒绝; 版本库内部目录同样拒绝。密钥文件、工作区外路径、符号链接、只读文件、大文件、整文件覆盖会升级为 需要确认——即使模式是「全部放行」。
- 历史授权学习:同类调用反复被批准后沉淀为规则,并且区分来源——你手写的规则显示为「手动设置」, 引擎推断的显示为「多次批准后记住」,两者都能单独撤销。
- 用户意图:只有你的话能预授权。「把这几个 import 改一下」会预授权它点名的文件;「只看不改」 则整轮拒绝所有写入与执行。绝不从模型输出推断权限——能自己放宽权限的模型会让其它保证失效。
- 每个工具的调用都进审计账本(成功/拒绝/失败、耗时、决定),与模型调用分开统计, 所以「求助了多少次 API」和「它实际动了什么」都能查。
模型目录(models.dev)
- 价格与上下文窗口不在代码里硬编码,而是从 models.dev 导入: 213 个服务、7 700+ 个模型,gzip 传输约 457 KB。
- 导入后缓存进数据库(精简形式约 1 MB),之后离线可用。
- 「同步模型目录」按缺口填充:只写空的字段,手填的价格不会被覆盖;单行「✨」按钮做同一件事。
- 匹配要求命中接口地址或服务名。没有「谁有这个模型 id 就用谁」的兜底——中转站会用同样的 id
发布加价后的价格(上游唯一的
deepseek-chat条目来自一个网关,输入价约为 DeepSeek 自家费率的三分之一), 把它挂到直连端点上会污染审计数字。匹配不到的模型如实显示「参数未知」。 - 种子配置不含任何价格:猜一个数字和用户手填的值无法区分,也就永远无法被自动纠正。
用量审计
- 每次调用(成功、失败、取消)都写一条审计记录:模型、服务、五个 token 计数、费用、耗时、 首字延迟、结果。
- 按窗口(近 7/30/90 天、近一年、全部)展示调用次数、总 token、预估费用、成功率、平均耗时、 首字延迟。
- 日历热点图:26 周、周一起始,可按调用次数 / Token 数 / 费用三种口径着色;悬停显示当天明细。
- 按天趋势(折线=调用次数,柱形=Token)与按模型汇总(调用、输入、输出、缓存、费用、占比、平均耗时)。
- 调用明细表按需分页,滚动到底自动加载下一页。
历史留存
- 可配置「保留 N 天」(7/30/90/180/365/永久),超期数据在启动时清理,也可随时手动清理。
- 置顶对话默认豁免;可选清理后
VACUUM压缩。 - 清理前会显示「将清理多少条」,不会先斩后奏。
附件
- 图片走多模态原生通道(按图像 token 计费,不按 base64 长度估);文本 ≤ 24 000 字节直接内联。
- Office / PDF / 表格不内置解析器:把路径交给模型,由它自己写脚本读。格式的多样性没有尽头 (xlsx 的共享字符串表、Excel 1904 时制、PDF 扫描件),每支持一种就欠一笔债,而模型本来就会写代码。
- 单文件 32 MB、一次 8 个;不认识的扩展名一律拒绝。
- 任何一条转换失败都中止发送——静默丢掉一个文件,会让人以为模型看过了而据此判断答案。
脚本运行环境
- 检测 node / python 并读版本;存在但跑不起来不算可用(Windows 商店的占位别名会命中这条)。
- 缺失时一键安装:从国内镜像下载(npmmirror / 华为云),解压到用户目录,不装系统、不提权。
run_script工具替模型做掉与任务无关的机械工作:脚本落文件再跑(绕开命令行转义)、 缺包自动装(走镜像源)、缺解释器在写脚本之前就拒绝。
Skill 与 MCP
- Skill = YAML frontmatter + markdown;导入
.zip/.skill或选目录扫描(存目录、每次启动重扫)。 系统提示里只放索引,正文由skill工具按需读取——正文动辄几千字,无条件注入每轮都在付费。 - MCP 配置照抄生态形状(
{"mcpServers":{...}}),从别处复制的配置能直接粘进来; 启动时连接、工具注册成<服务器>__<工具>,审批档位是执行。远程传输如实说不支持。
长期记忆与任务(核心行为页)
- 记忆:关键词触发(纯函数,不调模型)+ 手动整合。作用域分会话 / 项目 / 全局, 召回按相似度分三档注入:强=全文、中=一行、弱=只留一行索引(阈值用真实 模型量过);没有嵌入模型时退关键词,且不砍任何一条的篇幅。整合时认出的 决定与待办不看相似度:它们按类别每轮单独成节(「已经定下的 / 接下来要做」), 事实则按相关度只收最像的几条;这一节按会话缓存,换话题或记忆集合变了才重建。 否则「三个月前定下的方案」跟今天的问题一个词都不重合,表现就是模型把已经 定下来的方案当成还没定的选项重新问一遍。
- 人机交互留档:有过审批的那一步在运行链路里写「问过:总是允许」,没等到回答 写「问了,没等到回答」(与「拒绝」分开——前者什么都没发生);记忆与定时任务 候选的「不记 / 不建」也各落一行,候选卡上因此写着「这类提议你已经跳过 N 次」。 三者与账本、链路共用同一个 id,「它为什么老是问同一件事」查得到。
- 执行计划:像多件事的输入先拆成带完成条件的步骤(依赖构成 DAG),按图执行; 每步做完按条件审计(文件存在/非空/含文字/JSON 有字段),上游失效退回最早 那一步、受影响的步骤一起重做;重试与回滚都有上限,有副作用的步骤重跑前先问。
- 任务:cron 用图形化编辑器选(频率 + 时刻 + 中文说明 + 下次执行预览),不用手写——
这个
cron库的星期编号与标准不同(1=周日、拒绝 0),让人写等于让人踩坑。 - 漏跑检测:应用没运行时错过的执行不会被自动补做,而是列出最近两次让你决定。 总数照实说(错过 2 次和 47 次是两回事),但只列最近两次(更早的你想不起来)。
- 与窗口能力一致:工具在创建时圈定(无人值守时审批弹窗没人能回答),运行时按名单过滤, 并固定用最严格的审批模式;裁决结果如实记进历史。
- 无人值守:关掉窗口只是把界面收进托盘,进程继续跑、定时任务照常执行(真要退出走
托盘菜单里的「退出」;设置页「后台与启动」里也可以关掉常驻);托盘图标右键可打开主界面;
开机自启是可开的开关(
HKCU\...\Run一条"<程序>" --silent),静默启动只驻留托盘。 只有一个实例:再启动一次会把已有窗口叫回来,而不是起第二个进程各跑一遍任务 (due_tasks是查一次、改一次两步,两个进程会各跑一遍)。 - 被杀之后接着做:进程被杀(或断电)时那一轮任务在库里留下「跑到哪一步」;下次启动 接着做一次——复用原来那段会话,提示词里写清「上一次执行在第 N 步被打断,请接着那次 继续」。没有跨任务的通用队列:只有定时任务的这一轮会被接着做。
- 上下文与对话共用同一套组装(基座系统提示词、记忆、skill 索引、结构化压缩与按条裁剪): 无人值守的任务跑十几轮也不会把窗口撑爆,压缩过的工具输出同样能读回原文。
- 每次模型调用与每次工具调用都进同一本账(用量、费用、耗时、首字延迟、裁决), 与对话那条路同一张表——否则不跑对话的那几天,「这个月花了多少」会是假的。
外部智能体(omp)
- 对话可以交给本机的 omp 跑:设置里打开「外部智能体接管回合」, 这一轮由它决定做什么,过程照常镜像进这个对话——正文逐字上屏、思考单独展示、 它调用的每个工具与结果都进历史,关掉应用再打开还是同一份记录。
- 写入类工具由 RWork 提供(启动时用
--tools把它的内置工具收成只读, 再通过set_host_tools把write/edit/bash交给它)。因此它每一次改动工作区 或执行命令都要过 RWork 的权限判定、内容研判、审计与文件出处登记—— 「谁执行谁负责」不是一句话:它来请求,我们判定并执行。 它请求我们执行的那些在历史里标成host,它自己跑的标成external。 - 它报的用量与费用原样进账本,归在「外部智能体(omp)」名下,因此审计页能把 「它花的」与「RWork 自己花的」分开统计。价格取自它的价格表,不按我们的表重算。
- 它的读与搜索用它自己的工具(风险落在「读」这一档上),而那些在记录里是转述; 它的上下文压缩也是它自己的——这两件事界面上都照实写了,没有包装成「受 RWork 管辖」。 对话里的工具块会把这件事说全:它自己执行的读/搜索标「由它自己执行(转述)」, 它自己执行的写标「未经 RWork 的写入」。读为什么可以不设边界(我们自己的读同样是 自动放行、同样不做工作区包含检查)与残余风险,见 架构文档 §8 第 3 条(威胁模型)。
- 服务器不常驻也不预装:只有打开这个开关、并且真的发出第一句话时才起进程; 按对话复用它(对方自己的上下文才接得上),切走对话或退出应用时收掉。
多智能体流水线
- 新建对话时选一串智能体,按点击顺序接力,后一位看到前一位的全部产出。
- 每位保留自己的模型、系统提示词、工具白名单与审批模式(不合并)—— 因此「便宜模型做规划、强模型执行」天然成立。
- 内置 10 个角色(编程 6 + 文件/数据 4),每个都写明「不该做什么」。
其中「报告成文」刻意没有
write/edit(只能写新版本,不可能覆盖你的原始文件), 「代码评审」也没有写入工具(评审自己动手就失去独立性)。 - 「编程」与「代码实现」是两个角色而不是重复:后者是流水线里的一棒(提示词里写着 「按上一位给出的计划改代码」),前者是单人对话的默认档位——单人对话里没有上一位, 让实现者去等一个不会来的计划只会让它空转。
- 角色的模型、提示词、工具白名单、审批档位都真的生效(选择器与流水线查的是同一份 清单,引擎按那一位的档位判定),所以「选一个只读角色」是机制保证而非常识。
- 评审位会真的驱动退回:退回时把意见交给上一位重做一次,最多一轮。
本地数据
- 单文件 SQLite(WAL、
synchronous=NORMAL、外键开启)。 - 审计记录不挂在对话下:删掉对话不会抹掉「曾经花过这些 token」这一事实。
完整清单与界面示意图见 FEATURES.md;未完成项与前置条件见 REQUIREMENTS.md。
架构
crates/
rwork-core 领域模型、token 记账、留存策略、i18n 表、格式化(无 IO);
外部进程的两套客户端(MCP 与外部 coding agent 的 RPC)也在这里
rwork-store SQLite:迁移、对话/消息仓储、审计聚合查询、长期记忆(分层 + 向量召回)
rwork-embed 本地小模型推理:纯 CPU、纯 Rust(candle)的文本嵌入
rwork-ocr 本地 OCR:百度 PP-OCRv6 的 ONNX 模型(det + rec)+ onnxruntime,
把图片里的文字读出来(模型与运行时按需下载)
rwork-llm Provider 协议(OpenAI 兼容 / Anthropic / Ollama)、流式分帧、HTTP 传输
rwork-tools 内置工具(read/write/edit/glob/grep/refs/run_script/skill/write_version/bash)、
内容研判、执行脚本、工具注册表、MCP 桥接
rwork-app GPUI 桌面外壳:启动管线、对话页 / 核心行为页 / 审计页 / 设置页、
回合驱动与多智能体流水线、定时任务调度循环;
外部智能体那一轮也在这一层(`external.rs`:收事件、镜像进库)
rwork-integration-tests
跨 crate 端到端测试(真实 HTTP + 真实 SQLite)
vendor/
gpui-base gpui-base 0.6.1 的本地副本,带**一行必要补丁**(行内排版测量用错
字体,见 `UPSTREAM_REPORT.md` 与 `vendor/gpui-base/VENDORED.md`)。
由根 `Cargo.toml` 的 `[patch.crates-io]` 接进构建:写在这里的是
「上游还没修、我们先带着走」的东西,上游修好后整份删掉。
首屏渐进刷新
窗口先出现,内容分层补齐,任何一侧慢都不会拖住其它部分:
- 运行时与数据库先就绪(都快),内置字体在首帧之前注册,避免中文落到替代字体上。
- 打开窗口,渲染侧栏、导航和启动清单。此时已经可以交互。
- 启动管线依次报告「打开数据库 → 读取设置 → 载入模型服务 → 汇总审计」,每完成一步只重绘那一条。
- 每个数据卡片各自持有
Loading | Ready | Failed状态,各自发查询、各自重绘; 某张卡片失败只会显示那张卡片的错误,不会让整页空白。 - 慢查询(请求明细)滚动到才加载。
这也是热力图必须由 observe 驱动重建的原因:它是按天数据的派生视图,查询返回前构建只会得到一张空日历。
数据流
GPUI 界面线程 ──渲染──> 页面实体 ──spawn──> tokio 运行时
│ │
│ ├─ spawn_blocking: SQLite 查询
│ └─ reqwest: 流式 SSE
│
逐帧 delta 重绘 ── 完成后写入消息 + 审计记录
界面线程只负责渲染,不做 IO。
配置
设置页可编辑,落在数据库的 meta 表(键为 settings 的 JSON),也可手改后重启:
| 项 | 说明 |
|---|---|
locale |
zh-CN / en,默认 zh-CN |
theme |
system / light / dark |
font_size / mono_font_size |
界面与等宽字号 |
retention |
enabled / days / keep_pinned / run_at_startup / vacuum_after |
audit_window_days |
审计页默认窗口 |
heatmap_metric |
热点图着色口径 |
providers[] |
服务名、类型、Base URL、密钥、模型列表(含上下文窗口与四档价格) |
catalog(meta 表,非设置项) |
models.dev 的精简副本 + 抓取时间,供离线填充 |
approval_mode |
always_ask / write / yolo |
workspace |
新建会话的默认工作空间。每段会话记住自己的那一个(侧栏切换器会同时改全局默认与当前会话);工具读写、授权作用域、项目范围记忆都相对会话的工作空间解析 |
enabled_tools |
提供给模型的工具名列表;空 = 全部 |
external_agent |
外部智能体:enabled / command(默认 omp)/ args(默认 --mode rpc)。默认关闭;打开后这一轮由它执行,过程镜像进对话,账本归在「外部智能体(omp)」名下 |
tool_policies |
按工具覆盖的策略(allow / deny / prompt) |
learn_from_history / learn_threshold |
是否从重复批准中沉淀规则,以及门槛次数 |
max_tool_rounds |
一条消息最多几轮工具调用 |
permission_grant 表 |
已记住的授权:作用域、效果、来源、使用次数 |
max_context_tokens |
发送给模型的上下文预算 |
last_page |
上次停留的页面,启动时恢复 |
密钥按明文存在本机数据库文件里,不会外传。
用环境变量可以改数据库位置:RWORK_DB=D:\somewhere\rwork.db。
日志
与大模型的每一次往来都进日志:用户发出的每一句(会话、正文开头、附件数、团队人数、
当时生效的模型、审批档位、工作区)、请求(服务、模型、接口地址、消息条数、工具数)、
回答(结束原因、五个 token 计数、耗时、首字延迟、正文与工具调用数)、每一次工具调用
(工具名、目标、裁决、耗时、成败)、审批被怎么回答的(允许/拒绝、是否记住)、
上下文是否被压缩或裁剪(丢了几条)、执行计划的每一步(条件成立/不满足/退回重做),
以及命令与脚本内部的两个阶段(起进程、装包、运行、结束或超时),最后是每轮一行小结
(轮数、工具调用次数、总用时、计划落在哪)。定时任务那条路(无人值守)同样有:
定时任务到点,开始执行(任务名、计划时刻、迟了多久)、任务开始(作用域、智能体、
模型、工具数、工作目录)、每一轮的 任务:开始一轮、工具前后两行、以及
任务结束 / 任务失败;轮次用尽时会明确记一行(那条路没有收尾轮,与对话不同)。目的很具体:「卡住了」「为什么这么慢」
「它怎么忘了刚才说的」这类问题只能从日志上判断。
%APPDATA%\RWork\logs\rwork.log.2026-09-16
默认 info 档;RUST_LOG=rwork=debug 会额外打出请求体、模型正文片段、工具参数、
每条消息落库的 id、系统提示的字节数。一天一个文件(用 tracing-appender 的
按天轮转),只保留最近 10 个文件:按日期直接打开「昨天那份」。两条要记住:
日期是 UTC 的(东八区就是本地早上 8 点换文件),以及单日没有大小上限
(库不提供按大小的轮转,换来的是这条按天找的直觉)。同一条日志也会写到标准错误,
因此从终端 cargo run 时能直接看到。
开发约定
见 AGENTS.md。其中一条是硬性要求:注释与说明一律用中文(含模块文档、文档注释、行内注释、
提交信息)。i18n 表的英文列、文档注释里围栏内的 JSON/代码示例、代码标识符不在此列。
cargo test -p rwork-integration-tests --test convention
这条测试会扫描全部源码并列出不含中文的注释行,要求为零违规。它断言的是源码文本而非行为—— 一般情况下测试不该这么做,这里是有意为之:一条只能靠人肉遵守的要求等于没有要求。
测试
cargo test --workspace
单元测试覆盖 token 记账(缓存/推理 token 不重复计数)、热点图分档、留存截止时间、 i18n 覆盖率(每个键两种语言都必须有值)、流式分帧(逐字节切分不破帧、多字节字符跨块重组)、 各 Provider 的 SSE/NDJSON 解析、代价公式、上下文裁剪。
工具侧另有针对协议陷阱的测试:参数分片跨帧拼接、并行调用按 index 分组、缺 id 时补号、
缺名字时丢弃、对象式参数按字段合并、Anthropic 空 input 不被当成参数、工具结果与请求按 id 配对;
权限侧覆盖:拒绝不可被模式或宽泛授权覆盖、更具体的作用域优先、.docx 无法按文本编辑、
密钥文件在「全部放行」下仍要确认、只读指令拒绝写入、重复批准沉淀为规则。
tests/tool_loop.rs 跑的是整条工具循环:脚本化的服务器先回一个工具调用、再回答案,
断言从服务器侧做——第二个请求体里必须带着调用请求、调用 id 和配对的工具结果,
否则「结果回填」这件事就是没发生。覆盖 read、write、grep、并行调用、只读轮次拒绝写入、
以及「目录级允许 + 单文件拒绝」的组合。
端到端测试在本地起一个真实 HTTP 服务,流式返回 SSE,验证:分片文本与入库文本一致、
usage 归一化、审计聚合与热点图单元、请求体(含 include_usage 与鉴权头位置)、
失败调用入库、清理只删除超期数据、进程重启后历史仍在。
模型目录另有一个连真实上游的核查工具(需要联网,故不放进测试):
cargo run -p rwork-integration-tests --example verify_catalog
它会拉取完整目录、解析、对一份没有价格的配置做一次填充,并断言:直连端点命中的是厂商自家价格、 中转站独有 id 不被填充、重复填充是幂等的。models.dev 改结构时先跑它。
vendor/gpui-base 的补丁有一条门禁兜底:crates/rwork-integration-tests/tests/vendor_patch.rs
会检查那个副本里的两处改动还在(更新副本时把它覆盖掉,是这条链路唯一的失效方式,
而且它不会以别的方式表现出来——程序照样编译、照样跑,只是正文又开始叠字)。
行为验证是在真实程序里做的,数据见 UPSTREAM_REPORT.md。
已知取舍
- 一个 SQLite 连接加互斥锁:单用户桌面应用,查询都很小,WAL 让并发读不受写阻塞。
- 权限引擎是确定性的纯函数,不做「让模型判断是否安全」这一步:安全边界依赖模型的判断力就不成其为边界。
- 缓存 token 按缓存读/写各自的单价计费;提供商差异(DeepSeek 缓存命中更便宜、 Anthropic 另报缓存写入)由价格字段表达,而不是写死在代码里。未标注价格的模型不计费, 审计页的费用卡会说明「未标注价格,费用无法估算」,而不是显示一个 0 让人以为记录坏了。
- 推理 token 按输出价计费。上游 7 758 个条目里只有 39 个另报
cost.reasoning, 其余要么没有、要么与输出价相同,所以不为这 0.5% 多开一个配置字段。
版本历史
| 版本 | 改了什么(只写用户看得见的) |
|---|---|
| 0.4.0 | 实验运行器(第一版,只做预览规划)。设置页新增「实验」分页:启用开关、并行/顺序、k(1–3)、最大 rollout 数、输出目录;点「生成预览计划」会真的写出这次实验的 namespace、阶段表、R=4k / P=3k 预算与输出路径,并拒绝「预算小于 4k」或「未启用」的情况。不发模型请求,所以不会产生费用;真实 rollout 的开关等执行器接上再加。所有开关都有消费者:关闭时其余控件不渲染,关闭状态下调用规划器直接报错。 |
| 0.3.0 | 第一批 Harness² 吸收项(三个实验分支接线后合入)。① 设置页「会话交互轮次」新增提示词纪律开关(默认关闭):开启后系统提示追加「无评分标准 / 证据是数据 / always-on 成本 / 交付物形状」四块;A/B 里源材料注入指令的执行率从 3/4 降到 0/4,擅自加列从 2/4 降到 0/4,代价是系统提示 587→1193 字符。② 设置页 skill 卡片新增检查当前 harness:把 skill 的 name/description、是否在系统提示里被触发、非法目录名逐条列出,只读、不改设置。③ 落盘件索引:.rwork/<会话>/context/ 与 pastes/ 的文件有了可查询的元数据(路径、种类、字符数、sha256、会话归属),索引写入移到后台;删除会话时清掉该会话的索引与上下文目录,全局 pastes/ 文件保留。 |
| 0.2.0 | 一句话里塞了好几件事时,每件事各自去查记忆。整句只算一个向量时,它是几件事的平均——跟哪一件都不够像,于是「明显相关的事实」那一节会空掉(只有强档才给全文),而关键词那条路更直白:整句是当短语查的,长消息几乎必然查不到。现在按分项边界切开(编号、带圈数字、项目符号、行首的「另外/然后/最后」这类词、分号——普通换行不算),逐段召回再合并:同一条被多段命中时保留分数最高的那次。段数上限 5,超出的并进最后一段;普通消息切不出第二段,行为与从前逐字一致。 「换了话题」的判据从「整句像不像」改成「有几段不像」:一句话里两处都明显偏离当前话题就直接算换(以前要等到下一轮),只偏一处仍然先观察一轮;显式说法(「另外问一下…」)立刻算,并且重心落到那一段而不是整句平均。 |
| 0.1.1 | 记忆的「最近使用」以前是一个没人写的字段:它显示的是那条记忆的写入时刻,召回排序里那句「按最近使用」实际等价于按创建时间——用过的不会升权,久不用的也不会降权。现在每次召回都真的记一次取用(只追加、一行一次),核心行为页每条记忆后面能看到「被取用 N 次」,从没进过提示词的写「还从未被取用」。配套一条规矩:一轮只命中一条记忆时才算那条的成败,命中多条时谁也不记功并如实标出「同时命中」——一次成功给五条各记一次「赢」等于把噪声当信号。 模型在拆解结果后面补一句带方括号的话,整次拆解会静默退回「按顺序做」:旧写法取「第一个 [ 到最后一个 ]」,被解释文字撑坏就解析失败,界面上只表现为「计划没生成」。现在按括号配对取,没闭合就不猜。命令与脚本的输出会带终端颜色码进上下文( cargo/git/pytest 默认带色):那是给终端的指令,模型一个字都不需要,却照样按 token 付费,实时输出里还会显示成方块。现在进上下文与进度通道之前都会剥掉。定时任务失败一次就是终局:cron 型要等到下一个周期(可能一天以后),间隔型要再等一个间隔。现在计划触发的那一轮失败后会再试一次(约 60 秒后,只一次),执行历史里标明「将重试 <时刻>」;同一件事也不会被并行做两遍——到点触发、你点「补做」、重启后接着做共用一道门,上一个还在跑时后一个会如实说「上一次还在跑」。 |
| 0.1.0 | 首个版本(本节的起点)。 |
许可
MIT。内置字体 Maple Mono NF CN 依 SIL Open Font License 分发,
许可证随字体存放在 assets/fonts/MapleMono-NF-CN-LICENSE.txt。
关于
这个项目由 CodeLife Leon 独立开发与维护。更多项目、各项目发版信息、赞赏与联系方式都在个人站:
- 个人站:https://softwarescience.top/
- 本项目主页:https://softwarescience.top/projects/rwork
- 下载与发版:https://softwarescience.top/releases/rwork
- 赞赏支持:https://softwarescience.top/sponsor(自愿,不影响任何版本的发布)
问题反馈与需求建议:优先在仓库提 Issue,也可以邮件 virgil_lgp@163.com。