Windows 桌面 AI 助手(基于 Electron,业务逻辑复用 dsh-winagent 插件服务层)。兼容 OpenAI 格式 API 与 本地 Ollama,以《明日方舟》安洁莉娜的桌宠形象陪伴聊天,同时内置完整 Windows 工具集(53+ 个工具)与 LLM Wiki 个人知识库——你只负责剪藏,AI 负责理解和沉淀。支持 skills(含 SKILL.md 格式) 与 MCP 扩展挂载,可打包为免安装便携版。
欢迎各位大佬的评论和指导,所有评论和邮件我都会认真阅读和回复,期待与大家交流!如有兴趣也欢迎加入此项目。 邮箱(email):530313@qq.com;
- 多 Provider:OpenAI / DeepSeek / 任意 OpenAI 兼容端 / 本地 Ollama,一键切换
- 模型自动拉取:Ollama
/api/tags、OpenAI 兼容/v1/models - 文件/图片/PDF 附件:图片自动以 vision 格式发送,文本文件内容内嵌;PDF(≤15MB)在 provider 支持时直接以文件输入发送(拒收自动降级);不支持 vision 的模型自动降级为视觉辅助或路径描述
- Vision 模型识别:自动按模型名关键词检测(
gpt-4o、vision、vl、llava、gemini、claude-3、qwen-vl、glm-4v等),也可在设置中手动指定「支持/不支持/自动检测」 - 视觉辅助(双模型协作):主模型为纯语言模型时,自动调用另一个视觉模型识别图片,再把识别结果回填给主模型继续完成任务。支持同一 API 下用两个模型(如主模型
mimo-v2.5-pro+ 视觉模型mimo-v2.5) - 流式输出开关:可关闭流式,改为生成完毕后一次性返回
- 深度思考开关:自动 / 开启 / 关闭三态,接口不认识参数时自动去参重试
- Token 消耗统计:顶栏实时显示会话累计 token,悬停查看输入/输出细分与最近一次用量
- 流式对话:Markdown 渲染、代码高亮、思维链折叠、工具调用可视化
- 完整 Windows 工具集(53+ 个):
- 文件:
list_directory、read_file、write_file、edit_file、multi_edit_file、delete_file、copy_file、move_file、search_files、find_files、get_file_info、create_directory、grep - 系统:
list_processes、kill_process、run_command、get_system_info、take_screenshot、list_startup_items、add_startup_item、remove_startup_item - 注册表:
registry_list、registry_read、registry_write、registry_delete_value、registry_delete_key - 输入模拟:
mouse_move、mouse_click、mouse_scroll、key_press、key_combination、type_text、get_cursor_pos、get_screen_size - 窗口:
find_windows、set_window_state、bring_window_to_front、close_window - 网络:
http_request、http_download - 文档生成与转换:
markdown_to_docx、write_xlsx、write_pptx、office_convert - 知识库:
search_knowledge_base、retrieve_knowledge、read_note、list_notes、read_raw_file、add_question、save_knowledge_output、lint_knowledge_base、merge_knowledge_pages、reflect_knowledge_base
- 文件:
- 文档生成(模型优先):模型产出 Markdown / 结构化 JSON,工具做确定性序列化——
markdown_to_docx(pandoc 检测到则优先,否则内置纯 JS 链)、write_xlsx(SheetJS)、write_pptx(pptxgenjs);数学公式以 Word 原生可编辑公式(OMML) 插入(非图片,双击可用公式编辑器修改) - 文档读取与视觉理解(混合回退链):PDF 附件直传 →
render_pdf_page整页渲染 PNG 视觉阅读(扫描件/复杂排版,pdfjs-dist + @napi-rs/canvas)→read_pdf/read_docx(with_images)等 skills 哑提取 + 模型结构化(纯 JS 零系统依赖);[[IMG:]]标记协议——skill 输出图片标记,Agent 自动转为视觉输入(非 vision 模型走视觉辅助) - 格式互转:
office_convert四级降级链(纯 JS SheetJS → pandoc → LibreOffice headless → Office COM),Office 文档 → PDF 等常用转换本机装有 Office 即可用;不可达时报错附安装指引 - Skills 挂载:
skills/目录下的脚本插件(node/python/command) - MCP 挂载:
mcp.json挂载外部 MCP server(stdio / HTTP) - 上下文压缩:长对话自动/手动压缩,避免超出上下文窗口
- 危险操作确认:删除/写注册表/结束进程/执行命令/模拟输入等默认弹窗确认
- Ollama 兼容优化:消息格式自动清洗(content null 处理、tool_calls 结构标准化、tool 结果补 name 字段),避免
invalid tool call arguments兼容性错误 - API Key 存储:
config.json中的apiKey以明文存于用户私有目录(%APPDATA%/com.winagent.app/),请勿分享该目录;旧版 DPAPI 密文(enc:v1:前缀)加载时自动清空,重填一次即可 - 上下文压缩(两阶段):阶段一免 LLM 轻量压缩(截断旧工具结果、剥离旧图片 base64),阶段二 LLM 摘要旧消息;摘要失败自动降级,不中断对话
- 便携:数据(
config.json、wiki/)保存在%APPDATA%/com.winagent.app/,遵循 Windows 应用数据规范 - Angelina 可爱主题:《明日方舟》安洁莉娜主题界面——奶油色系 UI、动态角色立绘(左侧常驻,随对话状态切换「思考/执行工具/识别图片/回答」动作动画)、空状态 GIF 动图
- 单一桌宠模式(Agent 能力合并):AI 以安洁莉娜的角色人设陪伴聊天(人设提示词可编辑),同时拥有专业 Agent 的完整工具能力——读文件、操作 Windows、检索知识库,系统提示词运行时自动附加工具清单,不会"拒绝访问本地文件"
- LLM Wiki 个人知识库(Karpathy 模式):基于 Andrej Karpathy
llm-wiki思路——你只负责剪藏,LLM 负责理解和沉淀。三层架构(raw 原始文件只读 / wiki 编译层 / outputs 输出),拖拽文件弹出分析要求弹窗(AI 编译 + 按你的要求定制分析,要求自动归纳为可复用 tag),支持概念对齐、confidence 体系、QUESTIONS 队列、LINT/REFLECT/MERGE - 对话自动 RAG:每轮提问自动检索知识库并把相关笔记(标题/路径/confidence/摘要)注入上下文——回答知识类问题优先依据库内知识、注明来源;未命中时明确告知「知识库中没有相关内容」再自答并标注,绝不冒充库内知识
- 文档自动解析:拖入 PDF / PPTX / DOCX / XLSX / PPT / DOC / XLS / Markdown / 文本,自动提取文本 → AI 分析 → 生成知识库页面(带进度条);PPT 通过 Office COM 转换,旧版格式全覆盖
- 知识库面板:侧边滑出,文件树分层展示(📥 raw 只读 / 📚 wiki 可编辑),中缝可拖拽调整宽度,量子粒子关系图谱
- SKILL.md 格式支持:除原生
manifest.json外,支持 Anthropic 官方SKILL.md格式 skill,GitHub 上的 skill 可直接放入skills/目录使用 - 图片生成提示词:需要图片时模型直接生成可复制的绘图 Prompt(可直接粘贴的英文 Prompt + 中文拆解,适配 Midjourney / Stable Diffusion / 即梦AI 等),不编造图片
- DSH 插件版(dsh-winagent):同一套 Agent 能力以插件形式装进 DeepSeek Harness(
dsh plugin --profile web add一条命令安装,详见下文「DSH 插件版」),在 DSH Web 界面里直接使用,无需桌面壳
普通用户:从 Releases 下载 WinAgent-<version>-win64.exe(便携版),双击即用——免安装、单文件,数据保存在 %APPDATA%/com.winagent.app/,覆盖升级直接用新 exe 替换旧文件即可。
开发者(需 Node.js 18+):
git clone https://github.com/HarrisXiu/WinAgent.git
cd WinAgent
npm install
npm run dev桌面版主进程复用
dsh-plugin/的服务层(dsh-winagentfile: 依赖);改了插件代码后先npm run plugin:build再npm run dev。
npm run dist # electron-vite build + electron-builder(便携版 exe → release/)
npm run pack # 仅打包目录不生成安装包(调试用)
npm run build:icon # 从 Angelina/PNG/送货.png 重新生成多尺寸 ICO 图标数据目录:应用数据保存在 %APPDATA%/com.winagent.app/(即 C:\Users\<用户名>\AppData\Roaming\com.winagent.app\),包括 config.json、wiki/(知识库)、skills/、mcp.json。首次启动时 skills 与 mcp.json 模板自动播种。
⚠ 注意:
config.json中包含 API Key(明文),请注意隐私保护、勿分享该目录。打包前请先关闭正在运行的应用(否则 exe/dll 被占用无法覆盖)。
- 安装 Ollama:https://ollama.com/download
- 启动服务并拉取一个**支持工具调用(function calling)**的模型:
ollama serve ollama pull llama3.1:8b
9b 及以下模型在 40+ 工具场景容易“忘记”或“编造”工具名,建议使用 14b+ 或改用 API。
- 在 WinAgent 顶栏选择
Ollama (本地)provider,点击刷新按钮拉取模型列表。
在“设置 → 模型 Providers”中填写 Base URL(需含 /v1)、API Key、模型。例如:
- OpenAI:
https://api.openai.com/v1 - DeepSeek:
https://api.deepseek.com/v1
- 点击输入框左侧 + 按钮选择文件,支持多选
- 图片显示缩略图预览,文本文件显示文件图标
- 图片:支持 vision 的模型(
gpt-4o、qwen2.5-vl、llava等)直接识别;不支持的模型走视觉辅助或降级为路径描述,不会报错。可在「设置 → 图片识别」中手动覆盖(自动检测 / 支持 / 不支持) - 文本文件(
.txt/.md/.json/.js/.ts/.py等):内容自动读取并拼入消息 - PDF(≤15MB):支持文件输入的模型直接以 document 形式发送(网关拒收自动降级为
read_pdf/render_pdf_page工具读取);超限传递路径信息 - 其他文件:传递文件名和路径信息,可配合工具操作
当主模型不支持图片(如 deepseek-chat、大多数本地 Ollama 模型)时,可让另一个视觉模型先“看图”,再把描述文本交回主模型接续完成任务。
工作流程
用户上传图片
↓
主模型不支持 vision?→ 否 → 直接 multipart 发给主模型
↓ 是
视觉辅助已启用且配置正确?→ 否 → 退化为路径描述 + 提示
↓ 是
视觉模型逐张识别图片 → 描述文本
↓
描述文本拼入用户消息 → 主模型继续推理/调用工具
配置方式(设置 → 视觉辅助)
| 项 | 说明 |
|---|---|
| 启用开关 | 勾选后才会在主模型不支持图片时触发 |
| 接口来源 | 选「与主模型同一 API」则复用当前 Provider 的 Base URL / API Key;也可选另一个 Provider |
| 视觉模型名 | 同一 API 双模型时必填;选了其他 Provider 时留空则用该 Provider 自己的模型 |
| 识别指令 | 给视觉模型的提示词,留空用内置默认(原文转写、公式用 LaTeX、表格用 Markdown) |
设置面板会实时回显实际调用的接口与模型,配置无效(模型名空、与主模型完全相同)时给出警告。
两种典型用法
| 场景 | 接口来源 | 视觉模型名 |
|---|---|---|
| 同一家 API 下两个模型 | 与主模型同一 API | 例如 mimo-v2.5(主模型为 mimo-v2.5-pro) |
| 跨家搭配 | 选另一个 Provider | 留空或填写覆盖模型名 |
每张图片单独一次请求,避免多图混淆;单张失败不影响其他图片和主流程。识别进度在状态栏实时显示。 若主模型被误判为支持图片(接口返回“不支持图片输入”),会自动降级走视觉辅助路径重试,不会直接报错。
设置 → 请求行为:
- 流式输出(默认开):关闭后不再逐字显示,等模型生成完毕一次性返回。部分网关对流式 + 工具调用兼容不佳时可关掉。
- 深度思考:
自动(默认)—— 不下发任何思考参数,由模型自己决定开启/关闭—— 同时下发enable_thinking、reasoning.enabled、thinking.type三种主流字段,兼容 Qwen3 / vLLM / OpenRouter / Claude 兼容端
若接口不认识思考参数并报错,客户端会自动去掉参数重试一次,不会因此失败。思维链内容兼容
reasoning_content(DeepSeek/Qwen)与reasoning(OpenRouter)两种字段。
顶栏实时显示本会话累计 token(如 12.3k tokens),鼠标悬停可看到:
- 会话累计的输入 / 输出 / 总计
- 最近一次请求的用量
- 是否为估算值
统计口径:
- 优先取接口返回的真实
usage(流式下通过stream_options.include_usage获取) - 接口未返回时本地估算,数字前加
~前缀 - 包含工具调用循环的每一轮、视觉辅助模型、上下文压缩摘要的开销
/clear或清空对话后归零
让 Agent 生成 Word / Excel / PPT,公式以 Word 原生可编辑公式(OMML)写入,而非图片——在 Word 中双击即可用公式编辑器修改。架构为模型优先三层管线:模型产出 Markdown / 结构化 JSON(理解、排版决策、内容生成都交给模型),工具只做确定性序列化。
例子:
帮我写一份关于二次方程的数学讲义,包含求根公式和判别式,保存到桌面 quadratic.docx 把这份报告做成 10 页 PPT,保存到桌面 report.pptx
| 工具 | 用途 |
|---|---|
markdown_to_docx |
Markdown 一键转 Word:# 标题、-/1. 列表、| 表格 |、$$块级公式$$/$行内公式$、--- 分页;检测到 pandoc 优先用 pandoc 引擎,否则内置纯 JS 引擎(零依赖,字体/字号/横向参数生效) |
write_xlsx |
创建 Excel:sheets JSON 数组精确控制({name, rows}),或直接给 Markdown 表格文本(数字字符串自动转数值) |
write_pptx |
创建 PowerPoint(16:9):slides JSON(title / subtitle / bullets / text / notes),三种版式(封面页 / 标题+要点 / 双栏要点) |
office_convert |
格式互转枢纽:xlsx↔csv/json、md↔docx↔html↔txt(需 pandoc)、任意 Office 文档 → PDF(LibreOffice / MS Office 自动探测)、.doc → .docx;四级降级链,不可达时报错附安装指引 |
PDF 附件(≤15MB)优先文件直传(provider 支持时,拒收自动降级);扫描件 / 复杂排版用 render_pdf_page 整页渲染成 PNG 由视觉模型直接看;常规文档用 read_pdf / read_docx 等 skills 哑提取文本(纯 JS 零系统依赖)+ 模型结构化。read_docx(with_images) 解包文档内嵌图片、extract_pdf_images 抽取 PDF 嵌入图——图片以 [[IMG:]] 标记返回,Agent 自动转为视觉输入(非 vision 模型走视觉辅助描述),base64 不进文本上下文。
用 LaTeX 语法,已验证支持分式、根号、上下标、积分、求和、希腊字母等:
行内:质能方程 $E = mc^2$ 表明…
块级:$$x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$$
实现为
LaTeX → MathML(temml)→ OMML(mathml2omml)→ OOXML 写入 docx(jszip),纯 JS 无原生模块,无需安装 Word 也能生成。已修复mml2omml双重转义 bug 和空公式位多余空格问题。
基于 Andrej Karpathy llm-wiki 思路的个人知识库,核心理念:你只负责剪藏,LLM 负责理解和沉淀——知识「编译一次、持续维护」,而非每次查询重新推导。
<vault>/(桌面版默认 %APPDATA%/com.winagent.app/wiki,插件版默认 $DSH_HOME/winagent/wiki,可在设置中修改)
├── raw/ 📥 原始文件(你拥有,AI 只读)—— 拖拽/复制文件进来自动处理
│ ├── articles/ clippings/ images/ pdfs/ notes/ personal/
├── wiki/ 📚 编译层(AI 维护,你可浏览/修正)
│ ├── index.md log.md overview.md QUESTIONS.md ANALYSIS_TAGS.md(系统文件,自动维护)
│ ├── sources/ 每篇来源的摘要页(Summary/Key Points/Concepts/Contradictions)
│ ├── concepts/ 概念页(中文 title + aliases + Evolution Log + confidence)
│ ├── entities/ 实体页(人物/工具/机构/论文)
│ └── synthesis/ outputs/ templates/
└── outputs/ 查询答案、lint 报告
- 剪藏:把任何文档(PDF / PPTX / DOCX / XLSX / PPT / DOC / XLS / Markdown / 文本)拖进窗口 → 弹出分析要求弹窗 → AI 编译生成 sources/concepts/entities 页面(带进度条),并按你的要求定制分析(报告追加到来源页
## Custom Analysis区块)。手动复制文件到 raw/ 目录也会被自动监视编译 - 分析要求 Tag:弹窗中可勾选历史分析 tag 快速复用常用分析方式——tag 由 AI 自动归纳(短标签 + 一句话模板),多选填入输入框后可继续编辑;也可点「直接编译入库」跳过定制分析、点「取消」放弃导入。Tag 存于
wiki/ANALYSIS_TAGS.md,可手动编辑/删除 - 浏览:点顶栏 📚 打开知识库面板——raw 层只读预览(不可变原则),wiki 层可编辑修正;文件树分层展示,中缝可拖拽调整宽度;量子粒子关系图谱可视化
- 对话检索(自动 RAG):每轮提问系统自动检索知识库并注入相关笔记(标题/路径/confidence/摘要),AI 回答知识类问题优先依据库内知识、注明来源并溯源到 wiki/sources/ 具体来源页;注入不够详细时 AI 自动调用
retrieve_knowledge深度检索(一次取多篇全文)或search_knowledge_base换关键词重试;未命中时明确告知「知识库中没有相关内容」再用自己的知识回答并标注 - 记录问题:说"我想搞清楚 X" → 加入 QUESTIONS.md 队列,之后摄入的新来源能回答时自动提示
- 健康检查:说"检查知识库" → LINT 10 项检查(frontmatter / broken links / 索引一致性 / stub / 近重复 / SHA-256 完整性 / stale / 别名重叠 / wikilink 格式 / 系统文件保护)
- 综合分析:说"综合分析知识库" → REFLECT 四阶段(反向检验 / 模式扫描 / 深度合成 / Gap Analysis)
- 去重合并:重复概念页 → AI 先与你确认方案再执行 MERGE(保留 redirect 页)
- 概念对齐:新来源提取的概念与已有概念页做 slug/aliases/语义匹配,命中则更新(Evolution Log 追加"强化/修正"),不重复建页
- 定制分析:拖入弹窗中输入的个性化分析要求注入 AI prompt(与契约 CLAUDE.md 同轨),报告逐条回应要求、不编造、引用原文注明位置
- 分析要求 Tag 模板:AI 把用户的要求归纳为「短标签 + 一句话模板」持久化到 ANALYSIS_TAGS.md,下次拖入弹窗直接勾选复用
- confidence 体系:1 来源 low → 3+ medium → 5+ 弹窗由你确认后晋升 high(你的主动背书,非计数器输出)
- possibly_outdated:来源超过 2 年自动标注
- SHA-256 完整性:每篇来源记录哈希,LINT 检测 raw 文件是否被篡改
- 个人写作:放入
raw/personal/的文章走个人写作流程(写入 My Position,不参与 confidence 计数)
config.json(%APPDATA%/com.winagent.app/ 目录下,首次运行自动生成):
/clear:清空对话/compact:压缩上下文
- Skills:见
skills/README.md。 - MCP:编辑
mcp.json,把要用的 server 的disabled去掉或设为false。
WinAgent 拥有较高系统权限(删文件、改注册表、执行命令、模拟输入、访问网络)。默认对危险操作弹窗确认;请谨慎开启“自动放行”。部分操作(写 HKLM、改系统目录)需以管理员身份运行。
API Key 存储:config.json 中的 apiKey 以明文保存于用户私有数据目录(桌面版 %APPDATA%/com.winagent.app/,插件版 $DSH_HOME/winagent/),均为本机当前用户的私有位置,请勿分享该目录或 config.json。旧版 DPAPI 密文(enc:v1: 前缀)加载时自动清空,需重填一次。
Electron + TypeScript + React + Vite(electron-vite)+ TailwindCSS。桌面版主进程是精简编排层(窗口 + IPC + 数据目录),全部业务逻辑(Agent 循环、53+ 工具、LLM Wiki、skills/MCP)复用 dsh-plugin/ 服务层(dsh-winagent file: 依赖)——一套 TS 代码同时服务桌面版与 DSH Web 插件。文档解析(PDF / PPTX / DOCX / XLSX)通过子进程调用插件自带解析脚本。
把 WinAgent 的完整 Agent 能力做成 DeepSeek Harness(DSH)Web 插件:OpenAI 兼容 API / 本地 Ollama + 53+ Windows 工具 + skills + MCP + LLM Wiki 知识库,装在 DSH Web 界面里直接使用。插件代码在仓库的 dsh-plugin/ 目录,数据目录为 $DSH_HOME/winagent/。
# 本地链接安装(开发):在 dsh 所在环境执行
dsh plugin --profile web add link:<本仓库绝对路径>\dsh-plugin
# 或发布 npm 后:
dsh plugin --profile web add dsh-winagent
# 或从 GitHub 安装(本仓库发布后):
dsh plugin --profile web add github:HarrisXiu/WinAgent安装完成后重启 dsh web,浏览器 F5 刷新:页面右下角出现 WinAgent 悬浮按钮,点击打开插件界面;插件也会出现在 DSH「设置 → 插件」清单里。
- 聊天界面:流式输出、思维链折叠、工具调用卡片、危险操作确认弹窗、图片/文本附件、视觉辅助
- 设置:Provider 管理(OpenAI 兼容 / Ollama)、请求行为、深度思考、危险工具放行、人设提示词、skills / mcp / vault 路径
- 知识库:文件树、全文搜索、编辑、URL 导入、上传文件自动编译入库(LLM Wiki)、LINT / REFLECT 工作流
- 文档处理:模型优先三层管线(读取回退链 /
[[IMG:]]视觉注入 / 生成 /office_convert互转);GET /winagent/api/capabilities返回本地能力探测结果 - 工具:53+ 内置 Windows 工具 + skills(manifest.json / SKILL.md)+ MCP(stdio / HTTP)挂载
cd dsh-plugin
npx tsc -p tsconfig.json # 或仓库根目录 npm run plugin:build说明:桌面版的个性化桌宠主题不在插件范围内;人设提示词仍可在插件设置中自由修改。插件运行在 dsh web 进程内,以当前 Windows 用户权限执行工具,危险操作默认弹窗确认。
主体回调 TS:桌面版回归 Electron,删除 Rust 后端
- 桌面版主进程重写为精简编排层(窗口 + IPC + 数据目录),全部业务逻辑复用
dsh-plugin/服务层(dsh-winagentfile: 依赖)——一套 TS 代码同时服务桌面版与 DSH Web 插件,不再维护两套实现 - 删除
src-tauri/与旧src/main/服务副本(git 历史保留);数据目录沿用%APPDATA%/com.winagent.app/,既有 wiki vault / config 无缝延续 - 拖拽改回 Electron
File.path+ HTML5 事件(drag-shim.ts派发同名自定义事件,App.tsx/WikiLayout.tsx零改动)
文档处理模型优先重构(Office/PDF 三层管线)
- 工具变薄变确定:模型承担理解/结构化/内容生成,工具只做哑提取与确定性序列化;删除旧工具(
generate_image_prompt、create_word_document、markdown_to_word、latex_formula_to_omml) - 生成整合:
markdown_to_docx(pandoc 检测优先 / 内置 temml+mathml2omml 纯 JS 链兜底)+ 新增write_xlsx(SheetJS)、write_pptx(pptxgenjs)、office_convert四级降级格式互转(纯 JS → pandoc → LibreOffice → Office COM) - 视觉理解链:新增
render_pdf_page(pdfjs-dist + @napi-rs/canvas 整页渲染)与extract_pdf_images(嵌入图抽取)skill;read_docx支持with_images解包 word/media/;[[IMG:]]标记协议——skill 输出图片标记,Agent 剥离转为视觉输入(非 vision 模型走视觉辅助),base64 不进文本上下文 - PDF 附件直传:provider 支持文件输入时 PDF(≤15MB)直接作为 document 输入发送,网关拒收自动降级为
read_pdf/render_pdf_page工具路径;ProviderConfig.supportsFiles可显式控制 - 能力探测基础设施:
capabilities.ts(pandoc / LibreOffice / Office COM / pdfjs 渲染链 / PyMuPDF,启动预热缓存)+GET /winagent/api/capabilities+ 系统提示词自动注入能力摘要 - skills 播种改为按文件夹增量合并(老数据目录自动获得新增 skill);可选依赖
pdfjs-dist/@napi-rs/canvas(未装时视觉渲染能力降级,其余不受影响)
LLM Wiki 知识增强(对话自动 RAG)
- 自动检索注入:每轮提问自动检索知识库,把相关笔记(标题/路径/confidence/摘要)注入上下文;未命中时明确提示「知识库中没有相关内容」,杜绝模型凭空作答而不告知
- 检索引擎重写:IDF 加权评分(BM25 简化版)+ 字段权重(title/aliases/tags/summary/content)+ aliases 单独索引 + 中文单字查询支持 + 归一化分数(0~1)
- System prompt 重构:人设与规则职责分离(
petPrompt纯人设、规则动态拼接),消除 4210 字符的重复规则块;知识库触发条件从关键词式放宽为「知识类问题优先依据库内知识作答」 - 新增
retrieve_knowledge深度检索工具(一次取多篇全文);merge_knowledge_pages升级为危险操作(强制确认弹窗);search 结果附带 confidence
AI 分析管线修复
- INGEST 输出截断/解析失败从静默空兜底改为如实报错(对齐契约 §9);REFLECT 增加 Limitations 字段(回音室风险标注落盘);QUERY 的 confidence 表述与契约 §7 对齐(high 仅由用户背书)
- 概念/实体提取数量口径统一(契约 §1);slug 统一纯英文 kebab(
slugifyKebab,契约 §0);批量摄入 abort 修复 null 解引用并取消在飞请求;REFLECT/QUERY 支持取消 - GraphEngine 悬空边修复 + AI 发现的关系(aiRelations)入图谱
从 Electron 迁移至 Tauri v2
- 整体架构从 Electron(Node.js 后端)迁移至 Tauri v2(Rust 后端),前端保持 React + Vite + TailwindCSS 不变
- IPC 通信从 Electron
contextBridge/ipcMain改为 Tauriinvoke/listen,前端通过tauri-bridge.ts适配层保持window.winagentAPI 兼容 - 配置 Tauri ACL 权限(
src-tauri/capabilities/default.json),为核心 IPC、事件、对话框、文件系统、shell 操作授予最小权限 - 数据目录从 exe 同级改为
%APPDATA%/com.winagent.app/,遵循 Windows 应用数据规范 - 打包格式从 zip(解压即用)改为 MSI / NSIS 安装包(Tauri bundler)
拖拽功能修复(Tauri 原生拖放)
- 从 Electron 的 HTML5
File.path方案改为 Tauri 原生onDragDropEvent,在tauri.conf.json中启用dragDropEnabled: true tauri-bridge.ts拦截 Tauri 拖放事件并派发tauri:dragenter/tauri:drop/tauri:dragleave自定义 DOM 事件App.tsx和WikiLayout.tsx监听自定义事件,使用 Tauri 返回的文件路径字符串替代File对象- 知识库窗口拖放同步适配,
WikiWindowApp.tsx的handleDropFiles/handleFilesPicked改为接收{name, path}对象
白屏问题修复
- 根因:前端缺少 Tauri IPC 桥接层,
window.winagentAPI 未定义导致 React 渲染崩溃 - 修复:在
main.tsx中于 React 渲染前导入tauri-bridge.ts,确保window.winagent在组件挂载前就绪 - 调整 CSP 配置以允许 Tauri 协议资源加载
对话与知识库功能修复
- 根因一:缺少 Tauri v2 ACL 权限声明,
invoke/listen调用被安全策略拦截 → 新建capabilities/default.json授予core:default、dialog:default、shell:default、fs:default等权限 - 根因二:
ToolRegistry::initialize()未被调用,AgentService使用独立的空注册表 → 改为共享Arc<ToolRegistry>,在lib.rssetup 阶段初始化并注入 - 根因三:
VaultManager::initialize()未调用,知识库目录结构不存在 → setup 阶段自动初始化 vault - 根因四:
SearchIndex和GraphEngine启动时未构建,搜索和图谱为空 → 从磁盘笔记重建索引与图 - wiki 工具注册移入
ToolRegistry::initialize()内部,避免lib.rs访问私有类型
AI 分析管线优化
- 无死锁取消:
AiPipeline从Mutex<AiPipeline>改为Arc<AiPipeline>(内部可变),配合tokio::sync::watch单调 epoch 实现非阻塞取消——取消请求可以立即送达正在运行的分析任务,不会因 Mutex 锁竞争而死锁 - guarded 任务竞速:每个分析步骤用
guarded()包装,在任务完成与取消信号之间竞速,取消时立即返回Cancelled错误 - JSON 解析鲁棒性:
complete_json函数处理 LLM 输出中常见的 prose 包裹、markdown 代码块围栏;extract_json_object用括号配对提取 JSON 主体;解析失败时发起一轮 repair 请求 让 LLM 修正格式 - UTF-8 安全截断:
snippet/clip_body函数按字符边界截断多字节字符串,避免 panic - 数据验证与清洗:
normalize_tags:trim、去重、限制 3-8 个标签、每个 2-8 字符sanitize_relations:验证 relation target 必须逐字匹配候选笔记路径,过滤 LLM 编造的路径slug_list/str_array:统一处理 LLM 返回的数组字段,容错字符串与数组混用dedupe_nonempty:去除空字符串与重复项
- 批量摄入中止(
batch_abort)正确调用AiPipeline::cancel(),而非无效的标志位
拖入分析弹窗(重构剪藏流程)
- 主窗口拖入文件不再无条件编译,改为弹出「分析要求」弹窗:文件列表 + 历史分析 tag 多选 + 可编辑输入框
- 三个入口:开始分析(编译 + 定制分析)/ 直接编译入库(降级,跳过定制分析)/ 取消(放弃导入)
- 弹窗内实时展示进度:导入 → AI 编译(sources/concepts/entities)→ 定制分析 → 归纳 tag;结果绿色卡片 5 秒渐隐消失
- 定制分析:用户要求注入 AI prompt(与契约 CLAUDE.md 同轨),报告逐条回应要求、不编造、原文引用注明位置,追加到来源页
## Custom Analysis区块(正文,可被检索) - 分析 Tag:AI 把每次要求归纳为「短标签 + 一句话模板」,多选填入输入框后可继续编辑;持久化于
wiki/ANALYSIS_TAGS.md(系统文件,可手动编辑/删除)
对话检索强化
- 对话中提及知识库/笔记/wiki 内容时,AI 主动调用
search_knowledge_base检索(返回标题 + AI 摘要 + 正文片段,通常可直接回答) - 命中不理想自动换关键词(同义词/英文/缩写)重试;需要细节时
read_note读全文 - 回答注明来源笔记标题,核心结论溯源到 wiki/sources/ 具体来源页,来源矛盾时显式标注分歧
- 检索结果随附 AI 摘要(SearchIndex 索引与检索链路扩展 summary 字段)
绿色成功提示 5 秒渐隐
- wiki 编译成功 toast / 主窗口处理卡片 / 独立窗口摄入提示:成功态 5 秒后淡出(300ms transition),错误提示保持常驻手动关闭
主题系统(CSS 变量驱动)
- 全部硬编码配色重构为 CSS 变量令牌(RGB 通道格式),Tailwind 语义色经
rgb(var(--x) / <alpha-value>)接线,133 处透明度修饰符(bg-accent/10等)正常 - 支持三种模式:浅色 / 深色 / 跟随系统(auto 模式随 Windows 亮暗自动切换,matchMedia 实时响应)
- 自定义主色:设置 → 外观 → accent / accent2 两个拾色器(含 hex 手输),其余色阶(hover 态、边框、浅色面板、光晕、按钮文字)由 colord 自动推导
- 对比度兜底:深色模式主色与背景自动提亮至 WCAG AA(≥3:1);主色上的文字色按对比度自动选黑/白;纯黑/纯白/荧光色等极端输入不产生不可读组合
- 跨窗口实时同步:
config:save广播config:changed,主窗口与知识库窗口任一修改主题,另一窗口即时生效 - 图谱(canvas)与 CodeMirror 编辑器跟随主题:canvas 从 CSS 变量读取调色板并订阅主题变更重绘,节点渐变由用户主色推导(自定义主色贯穿图谱);编辑器主题引用 CSS 变量,无需重建实例
- 代码高亮深色适配:
[data-theme='dark']下 github-dark 色板覆盖 - 修复启动闪色:
BrowserWindow.backgroundColor按解析后主题取值(原主窗口深色首帧与浅色 body 不一致) - 默认主题 = 原品牌配色(浅色 + 粉蓝 #f4719c / #6db7d9),「恢复默认配色」一键还原
AI 分析管线增强
analyze()注入知识库契约(CLAUDE.md 相关小节:总则 / wikilink / confidence / 个人写作 / 质量红线)——改契约 → AI 分析行为随之变化- 按页面类型定制审查规则(source / concept / entity / raw / 普通笔记)
- 新增质量建议输出(stub 提示、缺溯源 wikilink、可回答开放问题、矛盾检测)
- AIPanel 一键应用:插入摘要到正文顶部、插入关联笔记 wikilink(遵循契约铁律
[[slug]]裸 slug) - 修复 LINT 检查 2 把裸 slug 合规链接误判为断链(
pageIds补 basename);图谱链接解析同根因修复 - 契约截断改为行级(章节标题完整不切半),
extractContractSections按优先级抽取小节
文档读取 Skills 扩展
- 新增
read_docx、read_pptx、read_xlsx三个 skill,分别读取 Word / PowerPoint / Excel 文档文本(纯 JS 提取,无需 Office/LibreOffice) - 共享提取核心
skills/pdf/extract.js:支持 pdf/pptx/docx/xlsx/xlsm/doc/xls/ppt 全格式,各 skill 复用同一核心 read_pdf.js重构为瘦入口(-175 行),消除与新增 skills 的重复代码- GraphEngine 链接解析修复:
knownIds补 basename 裸 slug(GraphEngine.ts),与 LINT 检查 2 同根因——契约铁律[[slug]]裸 slug 链接在图谱中现在也能正确解析
知识库独立窗口(第二窗口)
- 主窗口顶栏点击 📖 图标弹出知识库独立窗口(
?view=wiki渲染WikiWindowApp),与主窗口解耦,可独立拖拽、缩放、关闭 - 独立窗口顶栏工具栏:批量摄入、AI 问答、健康检查、综合分析、去重合并、开放问题、URL 导入
- 批量摄入交互式标定流程:先编译第 1 篇供用户审查 → 确认质量达标后继续批量 → 可中途「调整契约规则」(编辑 CLAUDE.md 后立即生效)或停止
- 拖拽文件到独立窗口:1 个走单文件快路径,多个走批量标定
- Toast 通知系统:操作结果以右下角气泡提示(成功/失败),8 秒自动消失
- LINT 发现 SOURCE MODIFIED 时弹出重新摄入提示条,一键全部重编译
Wiki 浏览器增强
- 右侧详情面板四标签页:标签(Tag)、反链(Backlinks)、AI 分析、注释(Annotations)
- 注释功能:编辑模式选中文本 → 添加注释 → 右侧面板管理/删除
- 反向链接面板:显示引用当前笔记的所有页面,点击跳转
- 标签面板:当前笔记标签管理 + 全库标签云(含计数),点击按标签筛选
- AI 分析面板:对当前笔记调用 LLM 生成建议标签、关联概念、摘要
- ConfirmHighDialog:概念达 5+ 来源时弹窗确认是否晋升 confidence: high
- 量子粒子图谱视图:全库 wikilink 关系可视化
工作流扩展
- AI 问答(workflow:query):基于知识库检索回答,答案带 [[source]] 溯源 + Confidence Notes + Limitations,落盘 wiki/outputs/
- 去重合并(workflow:merge):Jaccard 相似度检测重复概念/实体,保留页吸收 aliases + Sources + Evolution Log,全库 wikilink 改写,被合并页替换为 redirect
- 综合分析(workflow:reflect):Stage 0 反向检验(SHA-256 校验来源完整性)+ Gap Analysis(识别知识缺口),生成 synthesis 报告
- 健康检查(workflow:lint):10 项检查含 SOURCE MODIFIED 检测(raw 文件 SHA-256 变化时提示重新摄入)
URL 导入
- 粘贴网页 URL → 抓取正文 → 保存到 raw/clippings/(含 source_url frontmatter)→ 自动 AI 编译为 sources/concepts/entities 页
修复:INGEST 管线无法处理非 .md 文件
- 文件监听器(
VaultManager.startWatching)原先只放行.md文件,PDF/Word/PPT/Excel/图片等放入raw/后不触发自动编译 → 新增INGESTIBLE_EXTS常量覆盖全部可摄入格式,watcher 按扩展名过滤 listNotes()只列出.md文件,启动补偿扫描ingestPendingRawFiles()无法发现未编译的非 Markdown 文件 → 新增listRawFiles()方法递归扫描raw/下所有可摄入文件,ingestPendingRawFiles()改用此方法AiPipeline.ingestSource()的maxTokens从 1500 提高到 3000,减少复杂来源 JSON 输出被截断导致解析失败的概率- LLM 输出无法解析为 JSON 时输出
console.warn日志,便于排查
修复:Wiki 界面内容过长无法滚动
- flexbox height 链断裂:
WikiWindowApp包裹WikiLayout的容器非 flex 布局,导致子元素flex-1无效、高度由内容撑开 → 容器加flex flex-col,整条 height 链贯通 WikiEditor根元素h-full→min-h-0 flex-1,所有MarkdownPreview包裹容器加flex flex-col+min-h-0 overflow-hiddenMarkdownPreview自身h-full overflow-auto→min-h-0 flex-1 overflow-auto,内容过长时在 flex 布局中正确滚动
LLM Wiki 个人知识库(Karpathy 模式)
- 三层架构:raw/(原始文件只读)+ wiki/(编译层)+ outputs/,目录自动初始化
- 拖拽任意文档(PDF/PPTX/DOCX/XLSX/PPT/DOC/XLS/MD/TXT)→ 自动导入 raw/ → 提取文本 → AI 编译为 sources/concepts/entities 页面,带实时进度条
- 概念名称对齐(slug + aliases 匹配,避免重复建页)、Evolution Log、confidence 体系(5+ 来源用户确认晋升 high)
- possibly_outdated 标注、SHA-256 完整性、个人写作流程(raw/personal/)
- 系统文件自动维护:index.md / log.md / overview.md / QUESTIONS.md
- 知识库面板:分层文件树(raw 只读 / wiki 可编辑)、中缝拖拽调宽、量子粒子图谱、raw 源码/预览切换
- Agent 知识库工具 9 个:search_knowledge_base、read_note、list_notes、read_raw_file、add_question、save_knowledge_output、lint_knowledge_base(9 项检查)、merge_knowledge_pages、reflect_knowledge_base
- raw/ 目录自动监视:任何方式放入的文件自动编译(防抖 + 去重)
Agent 模式合并入桌宠模式
- 移除模式切换,单一安洁莉娜桌宠:人设 + 完整 Agent 工具能力
- 系统提示词运行时自动附加工具清单与执行规则,不再"拒绝访问本地文件"
文档格式支持
- PDF(pdf-parse)、PPTX/DOCX/XLSX(jszip)、PPT(Office COM 转换)、DOC(word-extractor)、XLS(SheetJS)全格式文本提取
- 旧版二进制格式识别、未知二进制 NUL 检测,提取失败给出明确原因
其他
- SKILL.md 格式适配(Anthropic 官方 skill 可直接挂载)+ PDF 读取 skill
- skills 路径打包回退(resources/skills)、pdf-parse 1.x require 加载修复
- 注释功能修复(CodeMirror 选中文本获取)、预览滚动修复、系统文件保护
- 打包模式改为 zip(解压即用)+ 首次启动询问桌面快捷方式
- 版本号 0.2.0
Angelina 主题界面
- 全面换装《明日方舟》安洁莉娜可爱风:奶油色浅色主题、玫瑰粉主色 + 天蓝点缀、粉色渐变光晕
- 空状态展示安洁莉娜「坐坐」GIF 动图,漂浮气泡/爱心/魔法棒/云朵装饰
- 左侧常驻大立绘:随对话实时状态切换动画——思考中📖看书 / 执行工具🧭探险 / 识别图片📷拍照 / 回答中🪑坐坐,并显示状态文字
- AI 消息头像动态化,思考占位显示跳动三点 + 状态提示
- 代码高亮切换为浅色主题,Markdown 样式整体适配
Agent / 桌宠双模式
- 新增
chatMode配置(agent/pet),顶栏胶囊按钮一键切换 - 桌宠模式使用可编辑的安洁莉娜人设提示词(
petPrompt),角色扮演 + 保留工具能力「跑腿」 - 设置 → 系统提示词页可切换模式并编辑对应提示词;切换模式自动清空会话
图片生成提示词
- 新增
generate_image_prompt内置工具:返回可复制英文 Prompt + 中文拆解 + 使用建议 - 支持 17 种风格关键词(写实/动漫/赛博朋克/水彩/3D/国风等)与 6 种宽高比
- 系统提示词新增「图片生成规则」:需要图片时只输出提示词,不编造图片
其他
- 打包图标更换为安洁莉娜角色图(多尺寸 ICO)
- 修复
3D对象键语法错误
视觉辅助(双模型协作)
- 新增
visionAssist配置(enabled/providerId/model/prompt) - 主模型不支持 vision 时,自动调用选定的视觉模型逐张识别图片,描述文本回填给主模型继续任务
- 识别指令可自定义,默认要求原文转写、公式用 LaTeX、表格用 Markdown
- 新增
vision事件(start/done/error),状态栏实时显示识别进度 - 单张图片识别失败不中断整体流程,错误以文本形式告知主模型
- 设置界面新增「视觉辅助」区:开关、接口来源选择、视觉模型名、指令编辑框,实时回显实际调用目标并对无效配置告警
detectVision()抽为公共函数,关键词列表提升为模块级常量ConfigStore.load()对visionAssist做深合并,兼容旧配置
同一 API 双模型
visionAssist新增model字段;providerId留空表示复用主 Provider 的 baseUrl / apiKey,仅换模型名- 新增
resolveVisionProvider()统一解析接口来源与模型,解析结果强制标记supportsVision: true,避免关键词误判 - 同 API 同模型时返回 undefined,防止自己调自己
流式输出开关
- 新增
stream配置(默认 true) OpenAIClient实现非流式请求路径,支持tool_calls/reasoning_content解析,并回调一次让界面拿到内容
深度思考开关
- 新增
thinkingMode配置(auto/on/off) - 同时下发
enable_thinking、reasoning.enabled、thinking.type,兼容主流网关 - 接口不认识参数时自动去参重试一次
- 流式解析兼容 OpenRouter 的
delta.reasoning字段
Token 消耗统计
- 新增
TokenUsage类型与usage事件 - 优先使用接口真实
usage;流式下自动下发stream_options.include_usage - 接口未返回时本地估算,显示时加
~前缀区分 - 统计覆盖每轮工具循环、视觉辅助模型与上下文压缩摘要
- 顶栏显示会话累计,悬停查看输入/输出细分与最近一次用量;清空对话后归零
修复
- 主模型被误判为支持 vision 导致 404(
No endpoints found that support image input):新增isImageUnsupportedError()识别各网关文案,自动降级走视觉辅助路径重试(仅一次,防死循环) - 从自动检测关键词中移除
mimo:mimo-v2.5-pro实际不支持图片输入,属误报 buildUserContent()抽出并支持forceNoVision,降级路径复用同一逻辑- 降级时按
role定位最后一条用户消息,避免上下文压缩后下标错位
Word 文档与公式
- 新增
create_word_document、markdown_to_word、latex_formula_to_omml三个内置工具 - LaTeX → MathML(temml)→ OMML(mathml2omml)→ OOXML(jszip)纯 JS 管线,无需安装 Word
- 修复
mml2omml双重转义 bug:正则<m:t误匹配<m:type导致结构标签被转义为<...>,Word 无法打开 - 修复公式空位多余空格:trim
m:t文本内容,移除xml:space="preserve",清理空m:r残留 create_word_document的blocks参数从string改为array类型,消除双重 JSON 编码导致的解析失败
Vision 图片识别
- 新增
supportsVision字段(ProviderConfig),支持三态:undefined(自动检测)/true(强制支持)/false(强制不支持) - 设置界面新增「图片识别」下拉选择(自动检测 / 支持 / 不支持)
- 自动检测关键词扩充:
mimo、glm-4v、yi-vl、internvl、qwen2.5-vl等 - 添加
[Vision]检测日志,便于排查模型识别问题
安全
- API Key 加密存储:Electron
safeStorage(Windows DPAPI),enc:v1:前缀,绑定用户 - 旧版明文
apiKey首次启动自动迁移为密文 - 解密失败时清空
apiKey,不泄露错误信息 save()磁盘写密文、内存保持明文,正常使用不受影响
上下文压缩
- 重构 token 估算:正确处理 multipart 消息(文本 + 图片)的 token 开销
- 两阶段压缩算法:阶段一截断旧工具结果 + 剥离旧图片 base64(免 LLM),阶段二 LLM 摘要旧消息
- LLM 摘要失败自动降级返回阶段一结果,不中断当前请求
safeSplitIndex:确保压缩切分点不以tool消息开头,避免 API 报错
{ "activeProviderId": "ollama", "providers": [ // apiKey 以明文保存于用户私有目录,请勿分享 config.json { "id": "ollama", "label": "Ollama (本地)", "type": "ollama", "baseUrl": "http://localhost:11434", "apiKey": "", "model": "qwen2.5:32b", "supportsVision": undefined }, // supportsVision: undefined=自动检测, true=强制支持, false=强制不支持 ], "temperature": 0.3, "maxTokens": 4096, "autoApproveTools": false, "compactThresholdTokens": 24000, "keepRecentTurns": 6, "skillsDir": "skills", "mcpConfigPath": "mcp.json", "petPrompt": "…", // 人设提示词(纯人设;工具清单与执行规则由系统动态拼接,勿写进人设) "knowledgeRag": { "enabled": true, // 对话自动 RAG:每轮提问自动检索知识库并注入结果 "topK": 3, // 每次注入的最大条数 "minScore": 0.12 // 注入的相关度阈值(归一化 0~1) }, "visionAssist": { "enabled": false, // 主模型不支持图片时,是否调用视觉模型代为识别 "providerId": "", // 空 = 与主模型同一 API;否则指定另一个 provider id "model": "", // 视觉模型名,同一 API 双模型时必填 "prompt": "" // 识别指令,留空用内置默认 }, "stream": true, // 流式输出 "thinkingMode": "auto" // 深度思考:auto / on / off }