# 🊙 Metona Ollama Desktop 基于 TypeScript + Electron 的 [Ollama](https://ollama.com) 桌面 AI 聊倩客户端䞓䞺 Windows 打造。 > 💻 桌面版仓库 | 🌐 [Web 版历史存档](https://gitee.com/thzxx/metona-ollama-web) ![版本](https://img.shields.io/badge/version-3.2.3--desktop-brightgreen) ![平台](https://img.shields.io/badge/platform-Windows%20x64-blue) ![TypeScript](https://img.shields.io/badge/TypeScript-5.7-3178c6) ![Electron](https://img.shields.io/badge/Electron-33-47848f) ![Vite](https://img.shields.io/badge/Vite-5-646cff) ![协议](https://img.shields.io/badge/license-MIT-green) --- ## ✹ 功胜特性 ### 💬 对话 - **流匏对话** — ReadableStream 实时打字效果支持区制停止 - **倚暡型支持** — 自劚加蜜 Ollama 已安装暡型䞀键切换 - **Think 掚理** — 展匀/收起的深床思考过皋需暡型支持 - **倚暡态** — 囟片䞊䌠自劚检测 Vision 暡型胜力 - **文件分析** — 支持 50+ 种文本/代码栌匏单文件 ≀500KB ### 🔧 Tool Calling — AI 本地文件操䜜v3.0 新增 AI 可以圚对话䞭䞻劚调甚本地工具来完成任务所有操䜜圚甚户可视化监督䞋执行 | 工具 | 诎明 | 安党级别 | |------|------|----------| | 📄 `read_file` | 读取文件内容≀1MB支持行范囎 | 自劚 | | ✏ `write_file` | 写入文件自劚创建父目圕 | 需确讀 | | 📁 `list_directory` | 列出目圕支持递園、隐藏文件 | 自劚 | | 🔍 `search_files` | 按文件名/内容搜玢支持扩展名过滀 | 自劚 | | 📂 `create_directory` | 创建目圕递園创建 | 需确讀 | | 🗑 `delete_file` | 删陀文件/目圕 | 需确讀 | | 💻 `run_command` | 执行 Shell 呜什默讀犁甚 | 需确讀 | **Agent Loop**甚户请求 → 暡型返回 tool_calls → 客户端执行 → 回䌠结果 → 埪环盎到无工具调甚支持流匏 + 并行调甚 + 最倧 10 蜮保技。 > ⚠ 需芁暡型支持 Tool Calling掚荐 Qwen3、Llama 3.1+、Mistral ### 🖥 工䜜空闎 — 终端 & 文件浏览噚v3.2 新增 右䟧可折叠面板提䟛终端呜什行和文件浏览噚䞀䞪 Tab **呜什行 Tab** - 终端界面实时流匏星瀺呜什蟓出支持 ANSI 颜色 - 支持长时闎运行呜什劂 `ollama pull`**无超时限制** - 倚终端 Tab每䞪 Tab 独立进皋可随时停止 - `ollama pull` 等进床条实时展瀺`\r` 芆盖倄理 **文件 Tab** - 浏览工䜜空闎目圕目圕树展瀺 - 点击文件预览内容垊行号 - 支持䞊级目圕富航、刷新 **工䜜原理** ``` 甚户/AI 建议呜什 → 工䜜空闎执行按钮 → 䞻进皋 spawn 子进皋 │ ┌─────────────────────┘ â–Œ IPC 双向通信on/send 暡匏无超时 │ stdout/stderr 实时掚送 → 枲染进皋终端面板 │ 进皋退出 → 通知枲染进皋星瀺退出状态 ``` > ⚠ 侎 Tool Calling 的区别Tool Calling èµ° Agent Loop有超时工䜜空闎走独立进皋无超时由甚户䞻劚觊发。 ### 🧠 Agent 记忆系统v3.0 新增 AI 䌚自劚从对话䞭孊习并记䜏关键信息跚䌚话持续积环无需手劚配眮 **记忆类型** | 类型 | 诎明 | 瀺䟋 | |------|------|------| | 📌 事实 | 关于甚户的事实 | "甚户正圚匀发䞀䞪 Electron 应甚" | | ⚙ 偏奜 | 甚户的偏奜习惯 | "喜欢甚䞭文回答代码风栌简掁" | | 📏 规则 | 应遵守的规则 | "项目䞭䜿甚 TypeScript 䞥栌暡匏" | | 📝 事件 | 重芁事件和结论 | "已成功构建 Windows 安装包" | **工䜜流皋** ``` 䌚话结束 → LLM 自劚提取关键信息 → 去重检测 → 存入 IndexedDB ↓ 新消息发送 → 关键词+标筟+重芁性检玢 → 泚入 system prompt ↓ AI 基于记忆提䟛䞪性化回答 ``` **特性** - **自劚提取** — 对话 ≥6 条消息后自劚觊发LLM 智胜识别倌埗记䜏的信息 - **智胜检玢** — 关键词 + 标筟 + 重芁性加权 + 䜿甚频率 + 时闎衰减 - **持久化** — IndexedDB 独立存傚跚䌚话、跚浏览噚重启保留 - **可视化管理** — 记忆面板支持搜玢、筛选、猖蟑、删陀 - **完党可控** — 讟眮䞭䞀键匀关䞍圱响其他功胜 ### 📚 RAG 知识库 - 文档䞊䌠 → 自劚分块 → 向量化 → IndexedDB 持久化 - 语义检玢增区问答支持倚集合管理 - IVF 玢匕䌘化K-Means 聚类 + 倒排玢匕 - 需嵌入暡型劂 `nomic-embed-text` ### 📊 数据 - 历史记圕 IndexedDB 持久化支持搜玢、分页 - 富出栌匏Markdown / HTML / TXT / .metona 加密倇仜 - .metona 栌匏支持 AES-256-GCM 加密HTTPS或 XOR 混淆HTTP - 所有富入/富出均䜿甚 Electron 原生文件对话框䞍再䟝赖浏览噚䞋蜜 ### 🖥 桌面原生 | 特性 | 诎明 | |------|------| | Fluent Design 䞻题 | Windows 11 暗色风栌Mica 毛玻璃材莚 | | 执行日志面板 | 巊䟧面板实时星瀺应甚运行日志初始化、连接、暡型加蜜、工具调甚等纯运行时䞍持久化垞驻星瀺䞍可关闭 | | 工䜜空闎面板 | 右䟧面板终端呜什行实时流匏蟓出+ 文件浏览噚宜床可拖拜调敎 | | Token 消耗统计 | Header 实时星瀺圓前䌚话总 token 消耗 | | 系统托盘 | 最小化到托盘双击恢倍右键菜单 | | 原生菜单 | 文件 / 猖蟑 / 视囟 / 窗口 / 垮助完敎菜单 | | 原生文件对话框 | 文件选择/保存党郚䜿甚 Electron 原生对话框支持文件类型过滀 | | 系统通知 | Windows 原生通知䞭心掚送 | | 窗口管理 | 记忆窗口倧小䜍眮支持眮顶 | | 单实䟋锁 | 防止重倍启劚 | | 无 CORS 限制 | 盎连本地 Ollama无需配眮 OLLAMA_ORIGINS | --- ## 🏗 架构 v3.2 四倧子系统协调运䜜 ``` 甚户蟓入消息 │ ├─→ ① Agent 记忆检玢 → 泚入 system prompt ├─→ ② RAG 知识库检玢 → 远加到 system prompt ├─→ ③ Tool Calling 检查 → Agent Loop 或普通流匏 │ â–Œ Ollama API携垊组合后的 system prompt + tools │ â–Œ 流匏响应 → 枲染到聊倩区域含工具调甚卡片 │ â–Œ 保存䌚话 → 自劚提取记忆≥6 条消息时觊发 ④ 工䜜空闎独立通道 甚户手劚/AI 建议呜什 → spawn 子进皋 → IPC 流匏掚送 → 终端面板实时展瀺 ``` ``` ┌─────────────────────────────────────────────────────────────────┐ │ Electron 应甚 │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 枲染进皋 (Renderer) │ │ │ │ │ │ │ │ ┌─────────────┐ ┌──────────────┐ ┌────────────────────┐ │ │ │ │ │ chat-area │ │ input-area │ │ workspace-panel │ │ │ │ │ │ 消息枲染 │ │ 消息发送 │ │ 💻 呜什行 Tab │ │ │ │ │ │ 工具卡片 │ │ 记忆检玢 │ │ 📁 文件 Tab │ │ │ │ │ └──────┬──────┘ └──────┬───────┘ └─────────┬──────────┘ │ │ │ │ │ │ │ │ │ │ │ ┌──────┮───────────────┮─────────────────────┮──────────┐ │ │ │ │ │ 栞心服务层 │ │ │ │ │ │ agent-engine memory-manager rag workspace-panel │ │ │ │ │ │ tool-registry vector-store doc-proc │ │ │ │ │ └──────────────────────────┬────────────────────────────┘ │ │ │ │ │ │ │ │ │ ┌──────────────────────────┮────────────────────────────┐ │ │ │ │ │ ollama.ts (API) chat-db.ts (存傚) │ │ │ │ │ └──────────────────────────┬────────────────────────────┘ │ │ │ └─────────────────────────────┌──────────────────────────────┘ │ │ │ IPC │ │ ┌─────────────────────────────┮──────────────────────────────┐ │ │ │ 䞻进皋 (Main) │ │ │ │ main.ts menu.ts tray.ts ipc.ts preload.ts │ │ │ │ tool-handlers.ts tool-security.ts workspace.ts │ │ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ │ │ workspace.ts: spawn 进皋管理 · 流匏蟓出 · 安党检查 │ │ │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ``` --- ## 📥 䞋蜜 从 [Releases](https://gitee.com/thzxx/metona-ollama-desktop/releases) 页面䞋蜜 | 文件 | 类型 | |------|------| | `Metona Ollama Setup 3.2.3.exe` | NSIS 安装包可选目圕、创建快捷方匏 | > ⚠ v3.2.0 起䞍再提䟛䟿携版仅保留 NSIS 安装包。 > > ⚠ 未筟名版本銖次运行 Windows 可胜匹出安党譊告点击「仍芁运行」即可。 --- ## 🔚 从源码构建 ### 环境芁求 - Node.js v22+ - Windows 或 Linux亀叉猖译需 Wine 9.0+ ### 构建步骀 ```bash git clone https://gitee.com/thzxx/metona-ollama-desktop.git cd metona-ollama-desktop git checkout metona-ollama-desktop-v3.2.3 # 安装䟝赖囜内䜿甚 npmmirror 加速 npm config set registry https://registry.npmmirror.com npm install # 恢倍构建猓存Electron 二进制等銖次从镜像䞋蜜 bash restore-build-cache.sh # 构建 TypeScript npm run build # 匀发运行 npm start # 构建 Windows 安装包 ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm run dist ``` > 💡 Linux 亀叉猖译需安装 Wine`apt install wine`诊细构建指南见 [docs/BUILD.md](docs/BUILD.md) > > 💡 䞀键构建脚本`bash build-release.sh`自劚安装 Wine + 䟝赖 + 构建 ### 垞甚呜什 ```bash npm run build:renderer # 仅构建枲染进皋Vite npm run build:main # 仅构建䞻进皋tsc npm run build # 构建党郚 npm start # 构建并运行 npm run dist # 构建 Windows 安装包NSIS npm run dist:nsis # 仅 NSIS 安装包 ``` --- ## 📁 项目结构 ``` metona-ollama-desktop/ ├── src/ │ ├── main/ # Electron 䞻进皋 │ │ ├── main.ts # 应甚入口、窗口管理、workspace 初始化 │ │ ├── preload.ts # contextBridge 安党暎露含 workspace API │ │ ├── menu.ts # 原生菜单 │ │ ├── tray.ts # 系统托盘 │ │ ├── ipc.ts # IPCTool Calling + Workspace 流匏通信 │ │ ├── utils.ts # 工具凜数 │ │ ├── tool-handlers.ts # 🔧 7 䞪工具实现 │ │ ├── tool-security.ts # 🔧 路埄/呜什安党检查 │ │ └── workspace.ts # 🖥 spawn 进皋管理、流匏蟓出 │ └── renderer/ # 枲染进皋 │ ├── index.html # 入口 HTML含工䜜空闎面板 │ ├── main.ts # 入口党系统初始化 │ ├── types.d.ts # 完敎类型定义含 Workspace 类型 │ ├── api/ │ │ └── ollama.ts # Ollama REST API │ ├── db/ │ │ └── chat-db.ts # IndexedDB v2䌚话+记忆+向量 │ ├── state/ │ │ └── state.ts # 响应匏状态管理 │ ├── components/ │ │ ├── chat-area.ts # 消息枲染、工具调甚卡片 │ │ ├── input-area.ts # 消息发送、记忆检玢、自劚提取 │ │ ├── memory-panel.ts # 🧠 记忆管理面板 │ │ ├── workspace-panel.ts # 🖥 工䜜空闎面板终端+文件 │ │ ├── tool-confirm-modal.ts # 🔧 工具确讀对话框 │ │ ├── kb-modal.ts # RAG 知识库管理 │ │ ├── settings-modal.ts # 讟眮面板含工䜜空闎目圕 │ │ ├── history-modal.ts # 历史记圕 │ │ ├── header.ts # 顶郚富航 │ │ ├── model-bar.ts # 暡型选择栏 │ │ ├── toast.ts # 通知 │ │ └── lightbox.ts # 囟片预览 │ ├── services/ │ │ ├── memory-manager.ts # 🧠 记忆管理栞心 │ │ ├── agent-engine.ts # 🔧 Agent Loop 匕擎 │ │ ├── tool-registry.ts # 🔧 工具泚册调床 │ │ ├── rag.ts # RAG 检玢管线 │ │ ├── vector-store.ts # 向量存傚 + IVF 玢匕 │ │ ├── document-processor.ts # 文档分块 │ │ ├── log-service.ts # 结构化执行日志 │ │ └── crypto.ts # AES-256-GCM 加密 │ ├── utils/ │ │ ├── utils.ts # 工具凜数 │ │ ├── sanitizer.ts # HTML 净化噚 │ │ └── marked-config.ts # Markdown 枲染 │ └── styles/ │ └── style.css # Fluent Design 样匏含工䜜空闎面板 ├── assets/icons/ # 囟标资源 ├── docs/ │ ├── BUILD.md # 构建指南 │ └── CHANGELOG.md # 曎新日志 ├── vite.config.ts # Vite 配眮 ├── tsconfig.json / tsconfig.main.json # TypeScript 配眮 ├── package.json # 项目配眮 + electron-builder └── README.md ``` --- ## 🔌 Ollama API 接口 | 接口 | 甹途 | 调甚䜍眮 | |------|------|----------| | `GET /api/tags` | 已安装暡型列衚 | 暡型选择栏 | | `GET /api/ps` | 运行䞭暡型 | 讟眮面板 | | `GET /api/version` | Ollama 版本 | 连接检测 | | `POST /api/show` | 暡型诊情胜力检测 | Think/Vision 检测 | | `POST /api/chat` | 流匏聊倩支持 tools | 对话 / Agent Loop | | `POST /api/embed` | 生成嵌入向量 | RAG 知识库 | --- ## ⚙ 讟眮 | 讟眮 | 默讀倌 | 诎明 | |------|--------|------| | Ollama 服务地址 | `http://127.0.0.1:11434` | 本地 Ollama 地址 | | 系统提瀺词 | 关闭 | 自定义 AI 角色 | | 䞊䞋文长床 | 24576 tokens | `num_ctx`越倧记忆越长 | | 枩床 | 0.7 | 0=粟确2=创意 | | Think 暡匏 | 关闭 | 深床掚理需暡型支持 | | 工具调甚 | 关闭 | AI 䞻劚调甚本地工具 | | 呜什执行 | 关闭 | Shell 呜什执行高风险 | | Agent 记忆 | 匀启 | 自劚孊习+跚䌚话记忆 | | 工䜜空闎目圕 | `userData/workspace` | 呜什行默讀执行目圕 | --- ## 🛠 技术栈 - **TypeScript 5.7** — 䞥栌类型完敎接口定义 - **Electron 33** — 桌面封装Windows x64 - **Vite 5** — 枲染进皋构建、HMR 热曎新 - **IndexedDB** — 匂步持久化䌚话 + 向量 + 记忆 - **Fetch + ReadableStream** — 流匏 NDJSON 解析 - **CSS Variables** — 暗色䞻题毛玻璃效果 - **electron-builder** — NSIS + Portable 打包 - **零倖郚䟝赖** — Markdown 解析噚、SHA-256、HTML 净化噚党郚内联实现 --- ## 🔒 安党 ### 应甚安党 - 内眮 HTML 净化噚癜名单标筟 + 属性过滀 + URI 协议检查 - Markdown 铟接仅允讞 `http:` / `https:` / `mailto:` / `tel:` - 阻止 `javascript:` / `vbscript:` / `data:` 协议泚入 - contextIsolation + IPC 癜名单 + 单实䟋锁 ### Tool Calling 安党 - **路埄黑名单**自劚屏蔜 `/etc`, `/sys`, `/proc`, `~/.ssh`, `~/.gnupg` 等 - **写操䜜癜名单**仅允讞甚户目圕䞋的写入 - **呜什黑名单**`rm -rf /`, `mkfs`, `dd`, `shutdown`, 反匹 shell 检测等 - **甚户确讀**写入/删陀/呜什执行必须甚户确讀 - **安党提瀺词泚入**自劚向 system prompt 远加工具䜿甚安党规则 ### 工䜜空闎安党 - **IPC 双向通信**`on/send` 暡匏䞍走 `invoke/handle`无超时䜆有独立进皋管理 - **呜什安党检查**倍甚 Tool Calling 的呜什黑名单和路埄检查 - **目圕限制**文件浏览噚仅允讞圚工䜜空闎目圕内浏览 - **进皋生呜呚期**窗口关闭时自劚 `SIGTERM` 所有子进皋防止进皋泄挏 - **甚户控制**呜什由甚户手劚执行或确讀AI 仅建议䞍盎接执行 ### 记忆系统安党 - 记忆提取仅基于对话内容䞍读取文件系统 - 记忆存傚圚本地 IndexedDB䞍䞊䌠到任䜕服务噚 - 甚户可随时查看、猖蟑、删陀任意记忆条目 - 支持䞀键关闭自劚记忆功胜 --- ## 📋 曎新日志 完敎曎新日志和项目发展历皋请查看 [docs/CHANGELOG.md](docs/CHANGELOG.md)。 ### 最新版本 **v3.2.3** — 工䜜空闎面板垞驻星瀺 & Bug 修倍 - 🖥 工䜜空闎面板改䞺垞驻星瀺类䌌执行日志面板固定宜床 480px移陀关闭按钮和拖拜手柄 - 🔧 修倍 `tool-registry.ts` 猺少 `logInfo` 富入富臎 `run_command` 工具调甚匂垞 **v3.2.2** — 工䜜空闎深床集成 & AI Tool Calling 增区 - 🔧 工䜜空闎䞎 AI Tool Calling 深床集成新增 `run_command` 工具圚工䜜空闎䞭可视化执行 - 📊 构建流皋䌘化补充手劚猓存䞋蜜方案修倍 npm install Electron 䞋蜜超时问题 - 📝 曎新 docs/BUILD.md新增故障排查条目和手劚猓存完敎呜什 **v3.2.1** — 日志统䞀 & 构建䌘化 - ♻ 䞻进皋 5 倄 `console.log/error` 党郚枅陀通过 IPC 接入执行日志面板 - 📊 移陀䟿携版构建目标后续仅提䟛 NSIS 安装包 - 🗑 删陀 `docs/V3-TOOL-CALLING.md`曎新 README 和 CHANGELOG **v3.2.0** — 工䜜空闎面板 - 🖥 右䟧可折叠工䜜空闎面板呜什行 Tab + 文件浏览噚 Tab - 💻 终端界面实时流匏蟓出、ANSI 颜色支持、倚终端 Tab、无超时限制 - 📁 文件浏览噚目圕树、文件预览垊行号、䞊级富航 - 🔌 IPC 双向通信`on/send` 暡匏实现流匏掚送独立于 Agent Loop 超时䜓系 - ⚙ 讟眮面板新增工䜜空闎目圕配眮默讀 `userData/workspace` - 🔒 工䜜空闎安党倍甚呜什/路埄黑名单窗口关闭自劚枅理子进皋 - 📊 启劚时自劚创建工䜜空闎目圕 **v3.1.1** — 代码莚量 & 桌面原生化 - ♻ 枲染进皋 58 倄 console.log 党郚迁移至结构化 log-service - 🖥 所有文件对话框䞊䌠/保存/富入改甚 Electron 原生对话框 - 🪙 Header 新增圓前䌚话总 token 消耗统计 - 🧹 移陀浏览噚䞓甚代码fileToBase64/fileToText/downloadFile统䞀走 IPC 桥接 - 🔧 修倍 vector-store/importSessions 猖译错误修倍 token 统计星瀺 - 📊 新增 build-release.sh 䞀键构建 + restore-build-cache.sh 构建猓存恢倍 **v3.0.0-patch2** — 皳定性修倍 - 🔧 Tool Calling IPC 卡死修倍25 秒硬超时 + 倚层保技 - 🔧 Electron contextIsolation 兌容自定义 prompt/confirm 匹窗 - 🔧 日志面板默讀垞驻星瀺启劚日志䞍再䞢倱 - 🔧 新建䌚话时区制䞭断生成并恢倍发送按钮 - 📝 对霐 Ollama 官方 Tool Calling 文档 **v3.0.0** — Tool Calling & Agent 记忆系统 - 🔧 7 䞪本地工具 + Agent Loop 匕擎 + 安党暡型 - 🧠 自劚记忆提取 + 跚䌚话持久化 + 可视化管理 - ⚡ 记忆检玢 → RAG 检玢 → Tool Calling 䞉层协䜜 --- ## 📄 License MIT