[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-2919":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":15,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":16,"rankGlobal":10,"rankLanguage":10,"license":17,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":10,"pushedAt":10,"updatedAt":22,"readmeContent":23,"aiSummary":24,"trendingCount":15,"starSnapshotCount":15,"syncStatus":25,"lastSyncTime":26,"discoverSource":27},2919,"OpenMantis","LiangNiang\u002FOpenMantis","LiangNiang","Lightweight multi-platform AI agent chat framework. Connect multiple LLMs to Feishu\u002FWeCom\u002FQQ with composable tools, long-term memory, scheduling & browser automation. | 轻量级多平台 AI  Agent 聊天框架，连接多个 LLM 到飞书\u002F企业微信\u002FQQ，支持可组合工具、长期记忆、定时任务和浏览器自动化。","",null,"TypeScript",112,9,8,0,43,"Apache License 2.0",false,"main",true,[],"2026-06-12 04:00:16","# OpenMantis\n\n[中文](README.md) | [English](README.en.md)\n\n**基于 Bun + Vercel AI SDK 构建的个人 Agent 聊天框架——一次部署，自己用。**\n\n[![License: Apache 2.0](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-Apache%202.0-blue.svg?style=flat-square)](LICENSE)\n[![Bun](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fruntime-Bun-f9f1e1?style=flat-square&logo=bun)](https:\u002F\u002Fbun.sh)\n[![TypeScript](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTypeScript-6.0-3178C6?style=flat-square&logo=typescript&logoColor=white)](https:\u002F\u002Fwww.typescriptlang.org\u002F)\n[![AI SDK](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FAI_SDK-v6-black?style=flat-square&logo=vercel&logoColor=white)](https:\u002F\u002Fai-sdk.dev)\n[![PRs Welcome](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPRs-welcome-brightgreen.svg?style=flat-square)](https:\u002F\u002Fgithub.com\u002FLiangNiang\u002FOpenMantis\u002Fpulls)\n\n[![Feishu](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F飞书-Feishu-4f46e5?style=flat-square&logo=bytedance&logoColor=white)](packages\u002Fchannel-feishu)\n[![WeCom](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F企业微信-WeCom-07c160?style=flat-square&logo=wechat&logoColor=white)](packages\u002Fchannel-wecom)\n[![QQ](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FQQ-12b7f5?style=flat-square&logo=qq&logoColor=white)](packages\u002Fchannel-qq)\n\n将多个 LLM 供应商连接到多个通讯平台，配合可组合的工具、定时任务、浏览器自动化、记忆系统、定时任务等能力 —— 一次部署，全部搞定。\n\n> [!NOTE]\n> OpenMantis 是为**个人单用户**使用而设计的：假设只有一位用户（项目所有者本人）通过飞书\u002F企业微信\u002FQQ 等渠道与 Agent 对话。因此**不内置多租户、用户隔离或权限管理**，记忆、路由、调度等均不按用户区分。\n\n---\n\n## 特性\n\n- **多 LLM 供应商** — OpenAI、Anthropic、字节跳动\u002F豆包、DeepSeek、小米 MiMo，以及任意 OpenAI 兼容端点。支持按通道或按会话切换 LLM 供应商。\n- **多平台** — 飞书\u002FLark、企业微信、QQ。每个平台均支持流式响应和附件处理，飞书额外支持交互式卡片 UI 和单渠道接入多个飞书应用。\n- **可组合工具** — Bash、文件读写、网页搜索（Tavily、Exa）、RSS、TTS、记忆、定时任务等。通过配置启用或禁用工具组。\n- **技能系统** — 内置技能（天气、DOCX\u002FXLSX 生成、前端设计等）以及用户自定义技能。\n- **定时任务** — 固定间隔、Cron 表达式或一次性定时任务，通过完整的 Agent 管线执行。\n- **浏览器自动化** — 内置 `browser` 工具组通过 [agent-browser](https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fagent-browser) 驱动真实浏览器，支持每会话隔离配置文件、CDP 模式复用本地 Chrome，以及 CDP 不可达时自动回退到隔离模式。\n- **Web 管理面板** — 首次运行自动启动配置向导，支持中英文和供应商连接测试。\n- **深度思考** — OpenAI 推理强度控制，Anthropic 自适应思考。\n- **长期记忆** — 基于认知科学的四类型记忆模型（语义 \u002F 程序 \u002F 情景 \u002F 前瞻）。每条记忆是带 frontmatter 的独立 Markdown 文件，统一存放并由单一 `MEMORY.md` 索引始终注入系统提示词；LLM 驱动的冲突检测避免重复写入。\n- **会话管理** — 持久化消息路由，包含消息历史和通道-消息路由绑定。\n- **自动续接 + Recap** — 路由空闲超过阈值时自动开启新会话，旧会话异步生成结构化摘要（目标 \u002F 决策 \u002F 改动 \u002F 待办）归档到 `route.recaps[]`，并向频道推送一条简洁通知；也可手动 `\u002Frecap`。\n\n## 前置要求\n\n- 至少一个 LLM 供应商的 API Key\n- 通道凭证（飞书应用、企业微信机器人或 QQ 机器人）\n- 从源码运行时需要 [Bun](https:\u002F\u002Fbun.sh)；使用预编译二进制则无需安装任何运行时\n\n## 快速开始\n\n### 方式一：预编译二进制（推荐）\n\n从 [Releases](https:\u002F\u002Fgithub.com\u002FLiangNiang\u002FOpenMantis\u002Freleases) 下载对应平台的二进制文件，无需安装 Bun 或任何依赖：\n\n```bash\nchmod +x openmantis-linux-x64\n.\u002Fopenmantis-linux-x64 init      # 初始化内置技能\n.\u002Fopenmantis-linux-x64 start     # 启动守护进程\n```\n\n> [!IMPORTANT]\n> macOS 用户：从 GitHub Releases 下载的二进制会被系统打上 `com.apple.quarantine` 隔离标记，首次运行可能被 Gatekeeper 拦截（提示「无法打开，因为无法验证开发者」）。执行以下命令移除隔离标记即可：\n>\n> ```bash\n> xattr -d com.apple.quarantine .\u002Fopenmantis-darwin-arm64\n> chmod +x .\u002Fopenmantis-darwin-arm64\n> ```\n\n> [!IMPORTANT]\n> Windows 用户：请勿双击 `.exe` 运行（会出现黑色窗口一闪而过），它是命令行程序。请打开 **PowerShell** 或 **CMD**，切换到文件所在目录后执行：\n>\n> ```powershell\n> .\\openmantis-windows-x64.exe init      # 初始化内置技能\n> .\\openmantis-windows-x64.exe start     # 启动守护进程\n> ```\n\n### 方式二：从源码运行\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FLiangNiang\u002FOpenMantis.git\ncd OpenMantis\nbun install\nbun run dev                      # 开发模式（前台运行）\n```\n\n### 首次配置\n\n首次启动时，OpenMantis 会自动在 `http:\u002F\u002F127.0.0.1:7777` 打开**配置向导**，按步骤配置供应商、通道和工具即可。配置完成后重启生效。\n\n运行时数据存储在 `~\u002F.openmantis\u002F`（可通过 `OPENMANTIS_DATA_DIR` 环境变量自定义）。\n\n### CLI 命令\n\n```bash\nopenmantis start       # 启动守护进程\nopenmantis stop        # 停止\nopenmantis restart     # 重启\nopenmantis status      # 查看运行状态\nopenmantis log         # 实时查看日志\nopenmantis run         # 前台运行（适用于 Docker 或调试）\nopenmantis init        # 初始化内置技能（--force 强制覆盖）\n```\n\n## 使用示例\n\n| | 说明 |\n|---|---|\n| ![飞书渠道 Tools 调用](examples\u002Fimgs\u002F01.gif) | 飞书渠道展示 Tools 调用，结束后自动折叠 |\n| ![定时任务](examples\u002Fimgs\u002F02.gif) | 定时任务 |\n| ![记忆](examples\u002Fimgs\u002F03.gif) | 记忆存储与记忆召回 |\n\n## 架构\n\n![架构图](assets\u002Farchitecture.zh.svg)\n\n消息从通道适配器流入 **Gateway**，由其管理会话（消息路由）并创建 Agent。**AgentFactory** 每轮解析 LLM 供应商、工具和系统提示词（含 `MEMORY.md` 索引），然后委托 **ToolLoopAgent** 进行流式执行。**Scheduler** 也可以按 cron \u002F interval \u002F at 触发完整 Agent 管线。\n\n## 项目结构\n\n```\nOpenMantis\u002F\n├── src\u002F\n│   ├── cli.ts                    # CLI 入口（start\u002Fstop\u002Frestart\u002Frun\u002Finit）\n│   ├── index.ts                  # 主应用逻辑\n│   ├── daemon.ts                 # 守护进程管理\n│   └── init.ts                   # 内置技能提取\n├── packages\u002F\n│   ├── common\u002F                   # 共享类型、日志、配置 Schema\n│   ├── core\u002F                     # Agent、Gateway、命令、工具\n│   ├── scheduler\u002F                # Cron\u002F间隔\u002F一次性定时任务\n│   ├── tts\u002F                      # 文字转语音供应商\n│   ├── channel-feishu\u002F           # 飞书\u002FLark 适配器\n│   ├── channel-wecom\u002F            # 企业微信适配器\n│   ├── channel-qq\u002F               # QQ 适配器\n│   ├── web\u002F                      # React 19 + Vite + Tailwind v4 管理面板\n│   └── web-server\u002F               # Hono API 服务器\n├── skills\u002Fbuiltin\u002F               # 内置 Agent 技能\n├── scripts\u002Fbuild.ts              # 二进制构建脚本\n└── ~\u002F.openmantis\u002F                # 运行时数据（配置、消息路由、技能、日志）\n```\n\n## LLM 供应商\n\n| LLM 供应商 | 包 | 说明 |\n|--------|-----|------|\n| OpenAI | `@ai-sdk\u002Fopenai` | GPT-4o、o 系列等 |\n| Anthropic | `@ai-sdk\u002Fanthropic` | Claude，支持自适应思考 |\n| 字节跳动\u002F豆包 | `@ai-sdk\u002Fopenai-compatible` | 通过火山引擎 Ark |\n| DeepSeek | `@ai-sdk\u002Fdeepseek` | DeepSeek 官方 API |\n| 小米 MiMo | `@ai-sdk\u002Fopenai-compatible` | 可选网页搜索插件 |\n| OpenAI 兼容 | `@ai-sdk\u002Fopenai-compatible` | 任意 OpenAI 兼容端点 |\n\nLLM 供应商优先级：消息路由覆盖 > 通道绑定 > 通道配置 > 全局默认。\n\n## 工具\n\n工具按组管理，通过 `excludeTools` 配置数组进行开关：\n\n| 工具组 | 工具 | 说明 |\n|--------|------|------|\n| `bash` | `bash`, `bash_write`, `bash_wait`, `bash_kill` | 基于 PTY 的 Shell 执行，支持超时、交互输入和会话管理 |\n| `file` | `file_read`, `file_write`, `file_edit` | 文件读取（支持偏移\u002F限制）、创建\u002F覆盖、部分编辑（字符串替换或行范围） |\n| `search` | `file_search`, `content_search` | Glob 模式匹配 + 正则内容搜索（ripgrep 后端） |\n| `skills` | `skill_*` | 每个加载的技能动态生成对应工具 |\n| `browser` | `browser`, `browser_kill`, `browser_help` | 驱动真实浏览器（基于 agent-browser），支持 snapshot\u002Fref 工作流、隔离配置文件与 CDP 模式、CDP 不可达自动回退 |\n| `tavily` | `tavilySearch`, `tavilyExtract`, `tavilyCrawl`, `tavilyMap` | 网页搜索、URL 内容提取、站点爬取和站点地图生成 |\n| `exa` | `exaWebSearch` | 基于 Exa 神经搜索引擎的语义网页搜索 |\n| `schedule` | `create_schedule`, `list_schedules`, `get_schedule`, `cancel_schedule`, `edit_schedule` | 创建\u002F列出\u002F查看\u002F取消\u002F编辑定时任务（every\u002Fcron\u002Fat） |\n| `rss` | `rssFetch`, `rssDiscover` | 解析 RSS\u002FAtom 订阅源，从网站发现订阅源 URL |\n| `whisper` | `audio_transcribe` | 音频\u002F视频文件转文字，支持 SRT 字幕和时间戳 |\n| `tts` | `tts_speak` | 基于小米 TTS 的文字转语音合成，支持风格和表情控制 |\n| `memory` | `save_memory`, `forget_memory`, `update_memory`, `load_route_context` | 长期记忆四类型（semantic\u002Fprocedural\u002Fepisodic\u002Fprospective），统一存放并按需读取索引指向的单文件；历史会话通过 routeId 加载 |\n| `message` | `send_message` | 向指定通道发送消息（网关上下文可用时自动注入） |\n\n通道特定工具（飞书文件上传、文档创建等）会根据当前通道自动注入。\n\n## 技能\n\n内置技能在首次运行 `openmantis init` 时提取到 `~\u002F.openmantis\u002Fskills\u002Fbuiltin\u002F`，用户自定义技能放在 `~\u002F.openmantis\u002Fskills\u002Fcustom\u002F`。\n\n| 技能 | 说明 |\n|------|------|\n| `docx` | 创建、读取、编辑和操作 Word 文档（.docx） |\n| `xlsx` | 处理电子表格文件（.xlsx、.xlsm、.csv、.tsv） |\n| `weather` | 通过 wttr.in 或 Open-Meteo 获取天气和预报 |\n| `frontend-design` | 生成生产级前端界面（React 组件、仪表盘等） |\n| `skill-manager` | 管理 OpenMantis 技能的完整生命周期（创建、发现、安装、审计） |\n\n## 斜杠命令\n\n用户通过聊天中的 `\u002F` 命令与 Agent 交互：\n\n| 命令 | 说明 |\n|------|------|\n| `\u002Fhelp` | 显示可用命令 |\n| `\u002Fnew` | 开始新消息路由 |\n| `\u002Fclear [id]` | 删除消息路由（不传 id 时删当前路由并切到一条新的） |\n| `\u002Fstop` | 强制停止进行中的对话 |\n| `\u002Flist` | 列出所有消息路由 |\n| `\u002Fhistory` | 查看当前消息路由的消息 |\n| `\u002Fresume \u003Cid>` | 恢复之前的消息路由 |\n| `\u002Frecap` | 对当前路由生成结构化摘要并归档（目标 \u002F 决策 \u002F 改动 \u002F 待办） |\n| `\u002Fchannel` | 显示当前通道类型和 ID |\n| `\u002Fschedule \u003Clist\\|delete\\|pause\\|resume>` | 管理定时任务 |\n| `\u002Fvoice [on\\|off]` | 切换 TTS 语音模式（仅飞书\u002F企业微信） |\n| `\u002Fremember \u003Ccontent>` | 提示 agent 在下一轮调用 `save_memory` 保存（v2 起命令层不再裸写，由 agent 判断 type\u002Fsubject） |\n| `\u002Fforget \u003Ckeyword>` | 按关键词模糊匹配记忆，命中后删除文件并同步移除 `MEMORY.md` 索引 |\n| `\u002Fmemories` | 显示 `MEMORY.md` 索引 |\n| `\u002Fbot-open-id` | 显示机器人 open_id（仅飞书） |\n\n## 浏览器自动化\n\nOpenMantis 通过内置的 `browser` 工具组驱动真实浏览器，底层为 [agent-browser](https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fagent-browser) CLI。\n\n```bash\nnpm install -g agent-browser\nagent-browser install   # 下载 Chrome\n```\n\n在配置中启用：\n\n```json\n{\n  \"browser\": {\n    \"enabled\": true\n  }\n}\n```\n\nAgent 通过三个工具操作浏览器：\n\n- **`browser_help`** — 加载 agent-browser 的版本匹配文档（snapshot\u002Fref 工作流、常用命令等），应在开始之前先调用。\n- **`browser`** — 执行 agent-browser 子命令（如 `[\"open\", \"https:\u002F\u002F...\"]`、`[\"snapshot\", \"-i\"]`），`--cdp` \u002F `--auto-connect` 等 CDP 标志由 OpenMantis 自动注入，禁止在 `args` 中手动传入。`eval --stdin` 等需要 stdin 的子命令可通过 `stdin` 字段传入内容。\n- **`browser_kill`** — 终止卡住的 session（通常建议直接延长 `timeout` 而不是 kill）。\n\n默认使用 agent-browser 自带的浏览器配置文件。如需复用本地 Chrome 会话，请改用 **CDP 模式**：\n\n```bash\ngoogle-chrome --remote-debugging-port=9222\n```\n\n> [!IMPORTANT]\n> CDP 模式下，所有对话共享你的真实浏览器（Cookie、会话、标签页）。请勿将 Agent 指向敏感账户。\n\n## 定时任务\n\n三种定时任务模式：\n\n- **`every`** — 固定间隔（如每 30 分钟）\n- **`cron`** — 5 字段 Cron 表达式，支持时区（默认：`Asia\u002FShanghai`）\n- **`at`** — 一次性定时执行\n\n任务通过完整的 Agent 管线执行，结果发送到创建任务的通道。\n\n## 记忆系统\n\n基于人类认知科学的四类型模型。每条记忆是一个带 frontmatter 的独立 Markdown 文件，统一存放在 `~\u002F.openmantis\u002Fmemories\u002F\u003Ctype>\u002F` 下，根目录的 `MEMORY.md` 索引始终注入系统提示词，单条文件由 Agent 按需 Read。\n\n![记忆系统](assets\u002Fmemory.zh.svg)\n\n| 类型 | 对应人类记忆 | 用途 | 强制结构 |\n|---|---|---|---|\n| `semantic` | 语义记忆 | 关于某个主体的稳定事实（用户身份、第三方实体、外部资源指针） | 自由文本 |\n| `procedural` | 程序性记忆 | Agent 应该如何行动（人格、风格、用户对其的纠正\u002F确认） | body 必须含 `**Why:**` 和 `**How to apply:**` |\n| `episodic` | 情景记忆 | 过去发生的有意义事件（生病、跳槽、家庭事件等） | frontmatter 必须有 `when` (YYYY-MM-DD) |\n| `prospective` | 前瞻记忆 | 未来要做 \u002F 会发生的事 | frontmatter 必须有 `trigger` 或 `deadline` |\n\n**主体（subject）** 作为 frontmatter 元数据：`user` \u002F `agent` \u002F `world` \u002F `reference`。\n\n**两层防御避免重复**：\n1. Agent 看到注入的 `MEMORY.md` 索引，可主动识别已存在 memory 不再写\n2. 真调 `save_memory` 时，`detectConflictV2` 用 LLM 判定是否 duplicate \u002F conflict，命中则建议改用 `update_memory`\n\n**索引上限**：`MEMORY.md` 软警告 400 行 \u002F 硬上限 500 行。撞硬线时拒绝写入并回滚已写文件。\n\n## 自动续接与 Recap\n\n长对话会让历史消息越堆越多、上下文越来越脏。OpenMantis 通过**空闲自动新建路由 + 结构化 Recap 归档**自动管理会话边界，无需用户手动 `\u002Fnew`。\n\n**触发逻辑**：当一条新消息到达，绑定的路由距离上次活动超过 `idleMinutes`（默认 120 分钟），网关会：\n\n1. 创建一条全新的空路由并把当前频道绑定切过去；\n2. 如果旧路由消息数 ≥ 3 且开启了 `recap`，**异步**调用 LLM 对旧路由生成结构化摘要（包含 `goal` \u002F `decisions` \u002F `changes` \u002F `todos` 四段），追加到 `oldRoute.recaps[]` 持久化；\n3. 向新路由的首条回复**前置一行提示**：`🆕 空闲超过 X 分钟，已开启新对话（旧会话已归档，\u002Flist 可查看）`；\n4. Recap 完成后再单独向频道推送一条灰色提示：`📋 上次对话已归档：{标题}（\u002Flist 可查看）`（飞书\u002F企业微信带颜色，QQ 走纯文本）。\n\nRecap 是 fire-and-forget 的，失败不会影响主对话；通知失败也不会让 recap 状态被回滚。\n\n**配置**（`autoNewRoute`，可在 Web 面板「高级」中调整）：\n\n```json\n{\n  \"autoNewRoute\": {\n    \"enabled\": true,\n    \"idleMinutes\": 120,\n    \"recap\": true\n  }\n}\n```\n\n- `enabled`：关闭后路由永远不会自动切换，行为退回到旧版（只能手动 `\u002Fnew`）\n- `idleMinutes`：空闲多久才视为「已结束」，正整数分钟数\n- `recap`：关闭后只切换路由，不再生成摘要也不推送归档通知\n\n任何时候都可以手动执行 `\u002Frecap`，对当前路由立即生成一次摘要（同步等待 LLM 返回）。\n\n## Roadmap\n\n### Phase 1\n\n- [ ] **飞书深度集成** — 扩展飞书原生能力（审批流、日历、邮件、云文档等）\n- [ ] **多 Agent 编排** — 支持 Multi-Agent 与 Sub-Agent 协作，实现复杂任务拆解与并行执行\n- [x] **记忆系统重构** — 重新设计存储与检索架构，提升长期记忆的准确性与可扩展性\n- [ ] **Telegram 渠道** — 新增 Telegram Bot 适配器\n\n> 欢迎提交 [PR](https:\u002F\u002Fgithub.com\u002FLiangNiang\u002FOpenMantis\u002Fpulls) 帮助完善！\n\n## 调试参数\n\n```bash\nLOG_LEVEL=debug      # 详细日志\nDEBUG_PROMPT=true    # 打印系统提示词\n```\n\n## 脚本参考\n\n**开发调试：**\n\n```bash\nbun run dev            # 开发模式（监听 + 调试日志）\nbun run dev:full       # 开发模式（后端 + Vite 开发服务器）\nbun run typecheck      # TypeScript 类型检查\nbun run check          # Biome 代码检查 + 格式化\nbun run build:web      # 构建 Web 前端\n```\n\n**构建二进制：**\n\n```bash\nbun run build:bin      # 构建当前平台二进制\nbun run build:bin:all  # 构建全平台二进制（Linux\u002FmacOS\u002FWindows，x64\u002FARM64）\n```\n\n> **注意：** `dev:full` 模式下，Vite 会自动选择可用端口启动前端开发服务器，请直接访问 Vite 输出的地址（如 `http:\u002F\u002Flocalhost:5173`）。API 请求会由 Vite 自动代理到后端（默认 `localhost:7777`）。\n\n## 联系\n\n- **Email**: liangniangbaby@gmail.com\n- **GitHub**: [@LiangNiang](https:\u002F\u002Fgithub.com\u002FLiangNiang)\n","OpenMantis 是一个轻量级的多平台 AI Agent 聊天框架，旨在将多个大型语言模型（LLM）与飞书、企业微信和QQ等通讯平台连接起来。该项目利用Bun和Vercel AI SDK构建，支持可组合工具、长期记忆管理、定时任务执行以及浏览器自动化等功能。其核心功能包括多LLM供应商接入、跨平台消息处理、丰富的内置及自定义技能系统、基于认知科学的记忆模型等。适合个人用户在需要一个智能助手来协助日常事务管理、信息查询或特定任务自动化时使用。",2,"2026-06-11 02:51:41","CREATED_QUERY"]