# CogitoAgent **Repository Path**: cnt-code/cogito-agent ## Basic Information - **Project Name**: CogitoAgent - **Description**: 🔥CogitoAgent — 云端驱动、本地执行的自主AI智能体。持续思考、自动分析,集成文件管理、代码执行、网页搜索、数据库等实工具,安全高效。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: project - **Homepage**: https://snowleopard-io.github.io/CogitoAgent/ - **GVP Project**: No ## Statistics - **Stars**: 23 - **Forks**: 5 - **Created**: 2026-06-07 - **Last Updated**: 2026-06-28 ## Categories & Tags **Categories**: ai **Tags**: Nodejs, JavaScript, 智能体, 人工智能, Electron ## README # CogitoAgent > **Think Continuously · Act Autonomously · Stay Private** Cogito, ergo sum — CogitoAgent 不仅仅是一个工具,它是你本地环境中的自主思维伙伴。 **CogitoAgent** 是一款运行于本地的自主 AI 智能体,融合了文件管理、知识挖掘、系统操作、代码执行与联网能力。它直接在用户配置的工作目录下运行,**无需上传任何文件至第三方服务器**,在保障数据隐私安全的同时,提供持续运转的智能助理服务。 ![CogitoAgent 控制面板模式](introduction/dashboard.png) 不同于传统的聊天机器人,CogitoAgent 具备 **持续思考**、**自主探索** 和 **工具执行** 的能力,能够在后台主动发现和整理用户的本地文件资产,并可通过扩展工具集获得更多能力。

版本 Node 许可证 状态

--- ## 核心特性 | 特性 | 说明 | |------|------| | **隐私优先** | 所有数据本地存储,不上传任何文件到第三方服务器 | | **持续思考** | 每3秒自动触发思考循环,主动分析当前任务状态 | | **工具执行** | 内置 19 个工具模块,支持文件操作、代码执行、Git、数据库、OCR、Office 文档等 | | **安全沙箱** | JavaScript 代码执行采用 `isolated-vm` 进程级隔离 | | **多会话管理** | 支持多个独立对话会话,会话数据持久化存储 | | **桌面模式** | Electron 桌面窗口,与终端 Agent 通过 WebSocket 通信 | --- ## 🚀 快速开始 ### 环境要求 - **Node.js** 22.12 或更高版本 - **npm** 或 **yarn** 包管理器 - **Python** 3.x(可选,用于 Python 代码执行) > **国内用户注意**:若 `npm install` 下载 Electron 二进制文件失败,请先设置镜像源再安装: > ```bash > $env:ELECTRON_MIRROR = "https://npmmirror.com/mirrors/electron/" > npm install > ``` ### 安装步骤 ```bash # 克隆项目 git clone https://gitee.com/cnt-code/cogito-agent.git cd cogito-agent # 安装依赖 npm install # 启动程序 npm start ``` ### 首次配置 首次运行会自动引导完成以下配置: 1. **API Base URL** - 支持 OpenAI 兼容的第三方 API 2. **API Key** - 您的 API 密钥 3. **模型名称** - 如 gpt-4o、claude-3-sonnet 等 4. **工作区路径** - AI 可以访问的目录(默认为用户主目录) 5. **人设选择** - 选择预设的 AI 人设 ### 日常使用 程序支持两种运行模式: | 命令 | 模式 | 说明 | |------|------|------| | `npm start` | 设置向导 | 首次配置或修改配置,不启动 Agent | | `npm run electron:desktop` | 桌面模式 | Electron 桌面悬浮窗 + 终端 Agent,通过 WebSocket 通信 | | `npm run electron:dashboard` | Dashboard 模式 | 全窗口 Electron 仪表盘,带会话管理和工具调用可视化 | | `npm run cli` | CLI 模式 | 仅终端 Agent,不启动 Electron(适合纯命令行环境) | #### 设置向导 ```bash npm start ``` 首次运行会自动打开欢迎页面并引导完成配置。如果已配置,会提示使用正确的启动命令。 #### 桌面模式 ```bash npm run electron:desktop ``` Electron 主进程会自动拉起终端 Agent,创建桌面窗口并连接。 **交互方式:** - **桌面窗口** — 半透明毛玻璃对话框 + 虚拟人物视频,直接在桌面上输入 - **终端输入** — 在启动终端中直接输入指令,按 ENTER 发送 - **ENTER** — 打断当前 AI 思考,进入输入状态 - **exit** — 退出程序(或直接关闭桌面窗口) ![](introduction/desktop.png) #### Dashboard 模式 ```bash npm run electron:dashboard ``` 全窗口 Electron 仪表盘,采用左侧边栏 + 主内容区布局,提供会话管理、对话和工具调用可视化的集成工作空间。 **布局结构:** | 区域 | 组件 | 说明 | |------|------|------| | 左侧边栏 | 会话列表 | 动态列出所有会话,点击切换,支持新建会话 | | 主内容区 | 对话视图 | 消息展示,支持流式 AI 回复和工具调用卡片 | | 主内容区 | 欢迎页 | 未选择会话时显示,含快捷功能卡片和输入框 | **功能特性:** - **会话管理** — 从侧边栏浏览、切换和创建会话;会话历史跨重启持久化 - **工具可视化** — 工具调用显示为黄色卡片,结果显示为绿色可折叠卡片,错误显示为红色卡片 - **流式输出** — 实时流式 AI 回复,采用双缓冲和 rAF 节流优化渲染,无闪烁 - **技能探索** — 按分类浏览所有可用工具(14 个分类,约 30 个工具),标注危险等级 - **快捷操作** — 新建任务、技能浏览器等快捷入口 **界面示意:** ![](introduction/dashboard.png) #### CLI 模式 ```bash npm run cli ``` 纯命令行模式,不启动 Electron 和 WebSocket 服务,直接在终端交互。 适合: - 服务器环境 - 无图形界面的远程连接 - 资源受限环境 #### 会话选择器 启动时(CLI 和 Electron 模式)会显示会话选择界面,用户可以选择进入已有会话或创建新会话。 **CLI 模式会话选择:** ``` ──────────────────────────────────────────── 📋 选择会话: 0 - 创建新会话 1 - 默认会话 ◀ 当前 最后活跃: 06/20 15:30 2 - 工作讨论 最后活跃: 06/19 10:22 ──────────────────────────────────────────── 请输入编号: _ ``` 输入编号直接进入对应会话,输入 `0` 创建新会话。 **Electron 模式会话选择:** 桌面窗口启动后显示会话列表,点击会话卡片进入对应会话,点击"新建会话"按钮创建新会话。 --- ## 持续思考循环 Agent 的核心是一个持续运行的思考循环。启动后,Agent 每隔 3 秒(可通过 `thinkingInterval` 配置)自动触发一轮思考流程: 1. 构建当前消息上下文(包括系统 prompt、工具注册表、历史对话) 2. 调用 AI API(流式返回) 3. 解析 AI 输出: - 普通文本 → 直接追加到回复 - 工具调用 → 执行工具函数,结果追加到上下文 - WAIT 标记 → 暂停,等待用户输入 用户可随时通过 `ENTER` 打断当前思考,直接输入指令。 ## 工具系统 工具系统由 `registry.js` 统一管理,所有工具函数通过 `[TOOL] functionName(args) [/TOOL]` 格式调用。 ### 工具分类 | 分类 | 文件 | 主要功能 | |------|------|----------| | 文件操作 | `file.js` | `ls`, `read`, `create`, `copy`, `mkdir`, `delete`, `move` | | 网页工具 | `web.js` | `search`, `browse`, `fetchPage`, `searchOnEngine` | | 浏览器自动化 | `browser.js` | `initBrowser`, `clickElement`, `fillField`, `takeScreenshot` | | 系统操作 | `system.js` | `listApps`, `openApp`, `closeApp` | | 代码执行 | `code.js` | `executeCode`, `runJavaScript`, `runPython` | | Git | `git.js` | `gitStatus`, `gitCommit`, `gitPush`, `gitPull`, `gitDiff`, `gitLog` | | 任务管理 | `task.js` | `createTask`, `getTasks`, `completeTask`, `splitTask` | | 记忆系统 | `memory.js` | `addMemory`, `searchMemory`, `getRelatedMemories`, `deleteMemory` | | 数据处理 | `data.js` | `readCSV`, `writeJSON`, `csvToJSON`, `queryData` | | 数据库 | `db.js` | `executeSQL`, `query`, `insert`, `update`, `createTable`, `getTables` | | 邮件 | `email.js` | `sendEmail`, `sendTextEmail`, `sendHtmlEmail` | | 系统监控 | `monitor.js` | `getCPUInfo`, `getMemoryInfo`, `monitorSystem` | | 定时任务 | `scheduler.js` | `addScheduleTask`, `getScheduleTasks`, `toggleScheduleTask` | | 图像识别 | `ocr.js` | `ocr`, `ocrBatch` | | Office 文档 | `office.js` | `createPpt`, `createWord`, `createExcel`, `readExcel` | ### 工具注册机制 工具函数统一注册到注册表,包含以下元数据: ```javascript { name: '函数名', description: '函数描述', parameters: { /* JSON Schema */ }, category: '分类', dangerLevel: 'none | low | medium | high', // 危险操作需用户确认 fn: async (args) => { /* 实现 */ } } ``` ### 工具调用示例 ``` AI: [TOOL] ls("/project/src") [/TOOL] → 返回目录文件列表 AI: [TOOL] runPython("print('hello')") [/TOOL] → 执行 Python 代码,返回输出 ``` > 详细工具开发文档参见 [src/agent/tools/TOOL_DEVELOPMENT.md](src/agent/tools/TOOL_DEVELOPMENT.md) ### 浏览器自动化详解 浏览器自动化工具基于 Playwright 实现,支持网页交互、截图、表单填写等操作。 ![](introduction/web.png) #### 核心工具 | 工具 | 说明 | 参数 | |------|------|------| | `initBrowser` | 初始化浏览器实例 | 无 | | `navigateTo` | 导航到指定 URL | `url` | | `clickElement` | 点击页面元素 | `selector` | | `fillField` | 填写表单字段 | `selector`, `value` | | `takeScreenshot` | 截取页面截图 | `selector`(可选) | | `getText` | 获取元素文本 | `selector` | | `waitForElement` | 等待元素出现 | `selector`, `timeout` | | `closeBrowser` | 关闭浏览器实例 | 无 | #### 使用示例 **基本网页浏览:** ```javascript // 初始化浏览器 [TOOL] initBrowser() [/TOOL] // 导航到网页 [TOOL] navigateTo("https://example.com") [/TOOL] // 截取整页截图 [TOOL] takeScreenshot() [/TOOL] // 关闭浏览器 [TOOL] closeBrowser() [/TOOL] ``` **表单填写与提交:** ```javascript // 初始化并导航 [TOOL] initBrowser() [/TOOL] [TOOL] navigateTo("https://login.example.com") [/TOOL] // 填写登录表单 [TOOL] fillField("#username", "myuser") [/TOOL] [TOOL] fillField("#password", "mypassword") [/TOOL] // 点击登录按钮 [TOOL] clickElement("#login-button") [/TOOL] // 等待登录成功 [TOOL] waitForElement(".dashboard", 5000) [/TOOL] // 截取登录后页面 [TOOL] takeScreenshot() [/TOOL] ``` **数据抓取:** ```javascript // 导航到目标页面 [TOOL] navigateTo("https://news.example.com") [/TOOL] // 获取标题列表 [TOOL] getText(".article-title") [/TOOL] // 截取特定区域 [TOOL] takeScreenshot(".main-content") [/TOOL] ``` #### 浏览器配置 **浏览器类型:** 默认使用 Chromium,可通过配置切换: ```json { "browser": { "type": "chromium", // chromium | firefox | webkit "headless": true, // 无头模式 "timeout": 30000 // 默认超时(ms) } } ``` **安全限制:** - 浏览器实例最多存活 5 分钟 - 自动关闭长时间未操作的浏览器 - 禁止访问本地文件系统 URL(file://) - 截图自动保存到临时目录,定期清理 #### 最佳实践 1. **及时关闭浏览器** - 避免资源浪费 2. **使用无头模式** - 提高执行效率 3. **合理设置超时** - 防止页面加载卡死 4. **选择器优先级** - ID > Class > XPath 5. **错误处理** - 检查元素是否存在再操作 ### 数据库操作详解 数据库工具支持 SQLite 数据库的创建、查询、插入、更新等操作。 #### 核心工具 | 工具 | 说明 | 参数 | |------|------|------| | `executeSQL` | 执行任意 SQL 语句 | `sql` | | `query` | 执行查询语句 | `sql`, `params`(可选) | | `insert` | 插入数据 | `table`, `data` | | `update` | 更新数据 | `table`, `data`, `where` | | `delete` | 删除数据 | `table`, `where` | | `executeTransaction` | 执行事务 | `statements` | | `createTable` | 创建表 | `tableName`, `schema` | | `listTables` | 列出所有表 | 无 | #### 使用示例 **创建表:** ```javascript [TOOL] createTable("users", { id: "INTEGER PRIMARY KEY AUTOINCREMENT", name: "TEXT NOT NULL", email: "TEXT UNIQUE", created_at: "INTEGER" }) [/TOOL] ``` **插入数据:** ```javascript // 单条插入 [TOOL] insert("users", { name: "张三", email: "zhangsan@example.com", created_at: Date.now() }) [/TOOL] // 批量插入 [TOOL] executeTransaction([ { sql: "INSERT INTO users (name, email) VALUES (?, ?)", params: ["张三", "zhang@example.com"] }, { sql: "INSERT INTO users (name, email) VALUES (?, ?)", params: ["李四", "li@example.com"] } ]) [/TOOL] ``` **查询数据:** ```javascript // 简单查询 [TOOL] query("SELECT * FROM users") [/TOOL] // 条件查询 [TOOL] query("SELECT * FROM users WHERE name = ?", ["张三"]) [/TOOL] // 排序查询 [TOOL] query("SELECT * FROM users ORDER BY created_at DESC LIMIT 10") [/TOOL] ``` **更新数据:** ```javascript [TOOL] update("users", { email: "newemail@example.com" }, { name: "张三" } ) [/TOOL] ``` **删除数据:** ```javascript [TOOL] delete("users", { name: "张三" }) [/TOOL] ``` **事务操作:** ```javascript [TOOL] executeTransaction([ { sql: "UPDATE accounts SET balance = balance - 100 WHERE id = 1" }, { sql: "UPDATE accounts SET balance = balance + 100 WHERE id = 2" }, { sql: "INSERT INTO transactions (from_id, to_id, amount) VALUES (1, 2, 100)" } ]) [/TOOL] ``` #### 数据库配置 **数据库路径:** ```json { "database": { "path": "./data/mydb.db", "timeout": 5000 } } ``` **安全限制:** - 只能访问工作区内的数据库文件 - 禁止执行 DROP DATABASE 等危险操作 - 事务失败自动回滚 - 查询结果最多返回 1000 行 #### 数据库管理 **列出所有表:** ```javascript [TOOL] listTables() [/TOOL] // → ["users", "tasks", "memories"] ``` **获取表结构:** ```javascript [TOOL] query("PRAGMA table_info(users)") [/TOOL] ``` **数据库备份:** ```javascript // 导出数据库 [TOOL] executeSQL("SELECT * FROM users") [/TOOL] // 将结果保存为 JSON 文件 [TOOL] create("./backup/users.json", JSON.stringify(result)) [/TOOL] ``` #### 最佳实践 1. **使用事务** - 批量操作时使用事务提高性能 2. **参数化查询** - 防止 SQL 注入 3. **索引优化** - 为常用查询字段创建索引 4. **定期备份** - 导出重要数据 5. **错误处理** - 检查 SQL 执行结果 ### 图像文字识别(OCR)详解 OCR 工具基于视觉大模型(如 Qwen2.5-VL-32B-Instruct)实现图像文字识别能力,支持常见图片格式的文字提取。 #### 核心工具 | 工具 | 说明 | 参数 | |------|------|------| | `ocr` | 识别单张图片中的文字 | `imagePath`(图片路径,支持相对/绝对路径) | | `ocrBatch` | 批量识别多张图片文字 | `images`(多个图片路径,用英文逗号分隔) | #### 支持格式 | 格式 | 扩展名 | 说明 | |------|--------|------| | JPEG | `.jpg` `.jpeg` | 最常用的压缩图片格式 | | PNG | `.png` | 无损压缩,支持透明背景 | | WebP | `.webp` | 现代高效压缩格式 | | BMP | `.bmp` | 位图,无压缩 | | GIF | `.gif` | 动图(取第一帧) | #### 使用示例 **单张图片识别:** ```javascript // 识别本地图片中的文字 [TOOL] ocr("/path/to/screenshot.png") [/TOOL] // → 返回识别出的文本内容 // 识别工作区内的图片 [TOOL] ocr("documents/invoice.jpg") [/TOOL] // → 识别发票图片中的文字信息 ``` **批量识别多张图片:** ```javascript // 批量识别多张截图 [TOOL] ocrBatch("img1.jpg, img2.png, img3.webp") [/TOOL] // → 依次返回每张图片的识别结果 ``` **配合其他工具使用:** ```javascript // 先获取目录下的图片文件,再识别 [TOOL] ls("./screenshots") [/TOOL] // → ["page1.png", "page2.png", "page3.png"] // 识别其中一张图片 [TOOL] ocr("./screenshots/page1.png") [/TOOL] // → 返回图片中的文字内容 ``` #### OCR 配置 在 `config.json` 中配置 OCR 相关参数: ```json { "ocr": { "provider": "", // OCR 服务提供商(可选) "baseURL": "", // OCR API 基础地址,不填则使用 api.baseURL "apiKey": "", // OCR API 密钥(必需) "model": "Qwen2.5-VL-32B-Instruct" // 视觉模型名称 } } ``` **配置说明:** | 字段 | 必需 | 说明 | 默认值 | |------|------|------|--------| | `apiKey` | ✅ | OCR 服务的 API 密钥 | - | | `baseURL` | ⚠️ | API 服务地址,不填则使用主 API 地址 | `api.baseURL` | | `model` | ✅ | 视觉大模型名称,需支持图像输入 | `Qwen2.5-VL-32B-Instruct` | | `provider` | ⚠️ | 服务商标识,用于区分不同提供商 | - | #### 支持的视觉模型 | 模型名称 | 说明 | |----------|------| | `Qwen2.5-VL-32B-Instruct` | 阿里通义千问视觉模型,推荐使用 | | `gpt-4o` / `gpt-4o-mini` | OpenAI 视觉模型,需配置对应 API | | `claude-3-opus` / `claude-3-sonnet` | Anthropic 视觉模型 | | `gemini-1.5-pro` / `gemini-1.5-flash` | Google 视觉模型 | #### 图片要求 | 项目 | 限制 | 说明 | |------|------|------| | 文件大小 | ≤ 10 MB | 过大的图片会导致 API 请求失败 | | 格式支持 | 5 种 | JPEG、PNG、WebP、BMP、GIF | | 文字清晰度 | 建议 ≥ 12pt | 过小或模糊的文字可能识别不准确 | | 路径编码 | UTF-8 | 中文路径需确保文件系统支持 | #### 使用流程 ``` 1. 在 config.json 中配置 ocr.apiKey 和 ocr.model 2. 在对话中让 Agent 调用 ocr(imagePath) 3. Agent 将图片编码为 base64,通过多模态 API 发送 4. AI 模型识别图片中的文字并返回结果 5. 结果以文本形式追加到对话上下文中 ``` #### 最佳实践 1. **确保图片清晰度** - 文字越大越清晰,识别效果越好 2. **控制图片大小** - 建议压缩到 5MB 以内,加快处理速度 3. **合理使用批量** - `ocrBatch` 会依次调用 API,注意 API 频率限制 4. **路径正确** - 相对路径相对于配置的 workspace,或使用绝对路径 5. **API 密钥保护** - 不要将 `config.json` 提交到公开仓库 #### 常见问题 | 问题 | 原因 | 解决方案 | |------|------|----------| | 提示「API 密钥未配置」 | `ocr.apiKey` 为空 | 在 config.json 中填入正确的 API 密钥 | | 「文件不存在」 | 图片路径错误 | 检查路径是否正确,相对路径是否相对于 workspace | | 「格式不支持」 | 文件扩展名不在支持列表 | 将图片转换为 JPEG/PNG/WebP 等格式 | | 「文件过大」 | 图片超过 10MB | 使用图片压缩工具减小文件大小 | | API 请求超时/失败 | 网络问题或 API 服务不可用 | 检查网络连接,确认 API 服务正常 | #### 环境变量配置 也可以通过环境变量配置 OCR(优先级高于 config.json): ```bash # OCR API 密钥(必需) OCR_API_KEY=your-ocr-api-key-here # OCR API 基础地址(可选,不填则使用主 API 地址) OCR_API_BASE_URL=https://api.example.com/v1 # OCR 视觉模型名称(可选,默认为 Qwen2.5-VL-32B-Instruct) OCR_MODEL=Qwen2.5-VL-32B-Instruct # OCR 服务提供商(可选) OCR_PROVIDER=qwen ``` ### Office 文档工具详解 Office 文档工具支持创建 PPT 演示文稿、Word 文档和 Excel 表格,基于纯 JavaScript 库实现,无需安装 Office 软件。 #### 核心工具 | 工具 | 说明 | 参数 | |------|------|------| | `createPpt` | 创建 PPT 演示文稿 | `options`(对象)或 `outputPath, title, content`(位置参数) | | `createWord` | 创建 Word 文档 | `options`(对象)或 `outputPath, title, content`(位置参数) | | `createExcel` | 创建 Excel 表格 | `options`(对象)或 `outputPath, sheetName, data`(位置参数) | | `readExcel` | 读取 Excel 文件 | `filePath`(文件路径) | #### 支持的格式 | 文档类型 | 扩展名 | 核心库 | |----------|--------|--------| | 演示文稿 | `.pptx` | pptxgenjs | | 文档 | `.docx` | docx | | 表格 | `.xlsx` | xlsx (SheetJS) | #### 使用示例 **创建简单 PPT(位置参数):** ```javascript [TOOL] createPpt("data/presentation.pptx", "项目报告", "这是项目报告的内容") [/TOOL] ``` **创建复杂 PPT(对象参数):** ```javascript [TOOL] createPpt({ outputPath: "data/presentation.pptx", title: "季度汇报", author: "CogitoAgent", slides: [ { title: "封面", content: "2024年Q2季度汇报" }, { title: "业绩概览", bullets: ["营收增长25%", "用户增长30%", "市场份额提升5%"] }, { title: "数据分析", image: "data/chart.png" } ] }) [/TOOL] ``` **创建 Word 文档:** ```javascript [TOOL] createWord({ outputPath: "data/report.docx", title: "项目报告", paragraphs: [ { type: "heading", text: "第一章 项目概述", level: 1 }, { type: "text", text: "本项目旨在..." }, { type: "heading", text: "核心成果", level: 2 }, { type: "list", items: ["完成系统设计", "实现核心功能", "通过测试验证"] }, { type: "heading", text: "数据统计", level: 2 }, { type: "table", rows: [["指标", "数值"], ["用户数", "10000"], ["转化率", "25%"]] } ] }) [/TOOL] ``` **创建 Excel 表格:** ```javascript [TOOL] createExcel({ outputPath: "data/sales.xlsx", sheets: [ { name: "销售数据", data: [ ["产品", "销量", "金额"], ["A产品", 100, 5000], ["B产品", 200, 8000], ["C产品", 150, 6000] ] }, { name: "库存数据", data: [ ["产品", "库存"], ["A产品", 50], ["B产品", 30] ] } ] }) [/TOOL] ``` **读取 Excel 文件:** ```javascript [TOOL] readExcel("data/sales.xlsx") [/TOOL] // → { "销售数据": [["产品","销量",...], ...], "库存数据": [...] } ``` #### PPT 幻灯片参数说明 每张幻灯片支持以下字段: | 字段 | 类型 | 说明 | |------|------|------| | `title` | string | 幻灯片标题 | | `content` | string | 正文内容 | | `bullets` | string[] | 要点列表(项目符号) | | `image` | string | 图片文件路径 | #### Word 段落类型说明 | 类型 | 参数 | 说明 | |------|------|------| | `heading` | `text`, `level`(1-6) | 标题段落 | | `text` | `text` | 正文段落 | | `list` | `items`(string[]) | 列表段落 | | `table` | `rows`(二维数组) | 表格段落 | | `image` | `src`, `width`, `height` | 图片段落 | #### Excel 数据格式 - `sheets` 为数组,每项包含 `name`(表名)和 `data`(二维数组) - `data` 的第一行通常作为表头 - 单元格值可以是字符串或数字 #### 两种调用方式 所有 Office 创建工具都支持两种调用方式: | 方式 | 语法 | 适用场景 | |------|------|----------| | **位置参数** | `createPpt(outputPath, title, content)` | 快速创建简单文档 | | **对象参数** | `createPpt({ outputPath, slides, ... })` | 创建复杂格式文档 | #### 最佳实践 1. **使用正确扩展名** - PPT 用 `.pptx`,Word 用 `.docx`,Excel 用 `.xlsx` 2. **路径使用相对路径** - 相对于工作区目录,或使用绝对路径 3. **图片提前准备** - 插入的图片需确保文件存在 4. **数据格式正确** - Excel 数据使用二维数组,表头在第一行 5. **大文档注意性能** - 过多幻灯片/表格可能增加生成时间 #### 常见问题 | 问题 | 原因 | 解决方案 | |------|------|----------| | 提示「缺少 outputPath 参数」 | 未指定输出路径 | 确保传入正确的文件路径参数 | | 生成的文件打不开 | 扩展名不正确 | 确保使用正确的扩展名(.pptx/.docx/.xlsx) | | 图片不显示 | 图片路径错误或文件不存在 | 检查图片路径是否正确,文件是否存在 | | 中文乱码 | 编码问题 | 确保使用 UTF-8 编码,库已内置中文支持 | ## 记忆系统 记忆系统基于 SQLite 实现,提供长期信息存储和语义检索能力。 ### 核心操作 | 操作 | 函数 | 说明 | |------|------|------| | 添加记忆 | `addMemory(content, tags, metadata)` | 存储信息及标签 | | 搜索记忆 | `searchMemory(keyword)` | 关键词模糊搜索 | | 语义搜索 | `getRelatedMemories(text)` | 基于嵌入向量的语义搜索 | | 删除记忆 | `deleteMemory(id)` | 按 ID 删除 | ### 数据结构 ```sql CREATE TABLE memories ( id TEXT PRIMARY KEY, content TEXT NOT NULL, tags TEXT, -- JSON 数组 embedding BLOB, -- 嵌入向量 metadata TEXT, -- JSON 对象 created_at INTEGER ); ``` ### 检索机制 - **关键词搜索**:LIKE 模糊匹配 - **语义搜索**:计算余弦相似度,返回相关记忆 ## 任务管理系统 任务管理系统基于 SQLite 存储,支持任务的创建、分解、状态追踪。 ### 数据结构 ```sql CREATE TABLE tasks ( id TEXT PRIMARY KEY, title TEXT NOT NULL, description TEXT, status TEXT DEFAULT 'pending', -- pending | in_progress | completed priority TEXT DEFAULT 'middle', -- low | middle | high parent_id TEXT, created_at INTEGER, completed_at INTEGER ); ``` ### 核心操作 | 操作 | 函数 | 说明 | |------|------|------| | 创建任务 | `createTask(title, description, priority)` | 新建任务 | | 获取任务 | `getTasks(filter)` | 按状态/优先级筛选 | | 更新状态 | `completeTask(id)` | 标记为已完成 | | 分解任务 | `splitTask(parentId, subtasks)` | 拆分为子任务 | ### 任务状态流转 ``` pending → in_progress → completed ``` 子任务完成会自动更新父任务状态。 ## 代码执行沙箱 代码执行模块使用 `isolated-vm` 实现进程级隔离,保障系统安全。 ### JavaScript 执行 | 安全措施 | 说明 | |----------|------| | 进程隔离 | 在独立 v8 isolate 中执行 | | 对象冻结 | 深度冻结 JSON、Math、Array 等内置对象 | | 危险对象禁用 | 禁止 `eval`、`Function`、`Proxy`、`process`、`require` | | 内存限制 | 128MB | | 超时控制 | 30秒自动终止 | ### Python 执行 | 安全措施 | 说明 | |----------|------| | 临时文件 | 代码写入临时 .py 文件执行 | | 命令注入防护 | 禁止 `subprocess`、`os.system` 等 | | 超时控制 | 执行完成后自动删除临时文件 | ### 执行流程 ``` runJavaScript(code) → 创建 isolate → 注入冻结的内置对象 → 执行代码 → 返回结果或错误 → 销毁 isolate ``` ## 预设人设 人设配置存储在 `personas/` 目录,每个文件定义一个角色的人格特征。 ### 人设文件格式 ```javascript // personas/explorer.js module.exports = { name: 'explorer', description: '探索者', prompt: '你是一个细心的探索者,擅长发现文件结构和代码逻辑...', temperature: 0.7, maxTokens: 2000 }; ``` ### 可用人设 | 人设 | 说明 | |------|------| | explorer | 文件探索、项目理解 | | scholar | 知识研究、深度分析 | | assistant | 日常任务、简单问答 | | creative | 写作、创意生成 | | critic | 代码审查、建议改进 | | teacher | 教学、知识讲解 | | wenchen | 文学创作 | | wujiang | 决策执行、紧急处理 | | yingwei | 战略规划、项目管理 | | zhanshi | 技术攻关、问题解决 | | moushi | 策略分析、风险评估 | | jianguan | 质量把控、流程管理 | | xiake | 自由探索 | 切换命令:`/persona ` ### 人设系统详解 #### 人设文件结构 每个人设文件包含以下内容: ```markdown # 人设名称 你是一个[角色描述]。 ## 性格特点 - 特点1 - 特点2 - 特点3 ## 说话风格 - 风格描述 - 常用表达方式 ## 行为模式 - 主要行为特征 - 交互偏好 ``` #### 人设切换机制 切换人设时会触发以下操作: 1. **加载新人设文件** - 从 `personas/<角色名>/persona.md` 目录读取对应的文件 2. **重建系统提示词** - 将新人设内容注入到系统提示词头部 3. **清空当前上下文** - 防止旧人设的对话历史影响新行为 4. **保存历史记录** - 归档当前会话对话 #### 自定义人设 创建自定义人设的步骤: 1. 在 `personas/` 目录创建新的文件夹(英文命名) 2. 在文件夹内创建 `persona.md` 文件,按照上述结构编写人设内容 3. 使用 `/persona <文件夹名>` 命令切换 **示例:创建"程序员"人设** ```markdown # 程序员 (Programmer) 你是一个经验丰富的程序员,专注于代码质量和最佳实践。 ## 性格特点 - 注重代码规范和可读性 - 喜欢使用现代编程技术 - 强调测试和文档的重要性 - 对性能优化有深入研究 ## 说话风格 - 使用技术术语准确 - 提供代码示例和最佳实践建议 - 常用:"让我看看代码"、"这个可以优化" ## 行为模式 - 主动分析代码结构 - 提供重构建议 - 推荐合适的工具和库 - 关注错误处理和边界情况 ``` #### 人设热切换 CogitoAgent 支持人设热切换,无需重启程序: - 使用 `/persona ` 命令即可立即切换 - 系统提示词会动态重新构建 - 当前工作区路径会自动注入到新人设中 ## 多会话管理 `sessions/` 模块支持多个独立对话会话,每个会话维护独立的上下文。 ### 会话存储 ``` data/sessions/ ├── session_abc123.json # 会话元数据 ├── session_def456.json └── ... ``` ### 会话元数据结构 ```javascript { id: "abc123", name: "项目A讨论", createdAt: 1718000000000, updatedAt: 1718001000000, messageCount: 45, contextTokens: 8500, persona: "explorer" } ``` ### 会话命令 | 命令 | 说明 | |------|------| | `/sessions` | 列出所有会话 | | `/new` | 创建新会话 | | `/switch ` | 切换会话 | | `/delete ` | 删除会话 | | `/rename ` | 重命名当前会话 | ### 上下文管理 - **上下文窗口**:自动压缩(150轮 或 100K token) - **会话隔离**:切换会话时清空当前上下文 ### WebSocket 通信详解 #### WebSocket 服务端 WebSocket 服务端运行在 Agent 进程中,默认端口 `9527`。 **核心功能:** | 功能 | 说明 | |------|------| | 连接管理 | 支持多个客户端同时连接 | | 消息广播 | 向所有客户端广播消息 | | 心跳机制 | 自动检测连接状态 | | 错误处理 | 连接断开自动清理 | **消息格式:** ```javascript { type: "message_type", data: { /* 消息内容 */ } } ``` **消息类型:** | 类型 | 说明 | |------|------| | `user_input` | 用户输入消息 | | `assistant_response` | AI 回复消息 | | `tool_call` | 工具调用通知 | | `tool_result` | 工具执行结果 | | `state_change` | 状态变化通知 | | `error` | 错误消息 | #### Electron 客户端 Electron 主进程通过 WebSocket 连接到 Agent: **连接流程:** 1. Electron 主进程启动 Agent 子进程 2. Agent 启动 WebSocket 服务端(端口 9527) 3. Electron 通过 `agent-bridge.js` 建立 WebSocket 连接 4. 双向通信:用户输入 → Agent → AI → 流式回复 → Electron 界面 **IPC 桥接:** ```javascript // Electron 主进程 → WebSocket ipcMain.on('user-input', (event, message) => { ws.send(JSON.stringify({ type: 'user_input', data: message })); }); // WebSocket → Electron 主进程 ws.on('message', (raw) => { const msg = JSON.parse(raw); mainWindow.webContents.send('ws-message', msg); }); ``` #### 自定义 WebSocket 客户端 可以开发自定义客户端连接到 Agent: ```javascript const WebSocket = require('ws'); const ws = new WebSocket('ws://localhost:9527'); ws.on('open', () => { console.log('已连接到 Agent'); // 发送用户消息 ws.send(JSON.stringify({ type: 'user_input', data: '你好,请帮我分析这个项目' })); }); ws.on('message', (raw) => { const msg = JSON.parse(raw); console.log('收到消息:', msg.type); if (msg.type === 'assistant_response') { console.log('AI 回复:', msg.data); } }); ``` #### WebSocket 配置 **端口配置:** 可通过环境变量修改 WebSocket 端口: ```bash WS_PORT=9527 # 默认端口 ``` **连接参数:** | 参数 | 默认值 | 说明 | |------|--------|------| | 端口 | 9527 | WebSocket 服务端口 | | 重连间隔 | 3000ms | 断开后自动重连间隔 | | 心跳间隔 | 30000ms | 心跳检测间隔 | ## 桌面模式 桌面模式基于 Electron 实现,提供 GUI 交互界面。 ### 架构 ```mermaid flowchart TB subgraph ElectronApp["Electron 桌面应用"] Main["main.js
(主进程)"] Preload["preload.cjs
(上下文桥接)"] Main -- "IPC" --> Preload end subgraph AgentProcess["Agent 独立进程"] WSServer["ws-server.js
(WebSocket服务端)"] TerminalUI["终端 UI
(readline)"] WSServer --> TerminalUI end Main <==>|"WebSocket
ws://:9527"| WSServer ``` ### 窗口 | 窗口 | 文件 | 说明 | |------|------|------| | 悬浮窗 | `electron/desktop/` | 半透明毛玻璃悬浮窗 + 虚拟人物视频(桌面模式) | | 仪表盘 | `electron/dashboard/` | 全窗口仪表盘,含会话列表、对话、工具调用记录(Dashboard 模式) | ### 主要进程 | 进程 | 文件 | 职责 | |------|------|------| | 主进程 | `electron/main.js` | 窗口管理、系统托盘、模式路由 | | 预加载 | `electron/preload.cjs` | 安全上下文桥接 | | 桥接器 | `electron/agent-bridge.js` | WebSocket ↔ IPC 转换 | | WebSocket | `src/io/ws-server.js` | 实时通信(端口9527) | ### 窗口特性 | 特性 | 实现 | |------|------| | 无边框窗口 | `frame: false` | | 半透明背景 | `transparent: true` + CSS `backdrop-filter` | | 始终置顶 | `alwaysOnTop: true` | | 点击穿透 | `enableMouseEvents: false`(可配置) | --- ## 项目结构 ``` cogito-agent/ ├── src/ # 源代码目录 │ ├── agent/ # 智能体核心模块 │ │ ├── Agent.js # 核心智能体 │ │ ├── state.js # 状态机 │ │ ├── registry.js # 工具注册表 │ │ ├── commands.js # 命令处理 │ │ ├── session.js # 多会话管理 + 系统提示词 │ │ ├── mcp.js # MCP 协议服务器 │ │ ├── plugin.js # 插件系统 │ │ ├── tracing.js # 轻量可观测性 │ │ ├── retry.js # 重试与熔断机制 │ │ ├── tools/ # 工具集(19个模块) │ │ │ ├── index.js # 工具统一导出 │ │ │ ├── path.js # 路径安全工具 │ │ │ ├── file.js # 文件操作 │ │ │ ├── web.js # 网页工具 │ │ │ ├── browser.js # 浏览器自动化 │ │ │ ├── system.js # 系统操作 │ │ │ ├── code.js # 代码执行 │ │ │ ├── sandbox.js # 沙箱安全 │ │ │ ├── git.js # Git 版本控制 │ │ │ ├── task.js # 任务管理 │ │ │ ├── memory.js # 记忆系统 │ │ │ ├── data.js # 数据处理 │ │ │ ├── db.js # 数据库 │ │ │ ├── email.js # 邮件功能 │ │ │ ├── monitor.js # 系统监控 │ │ │ ├── scheduler.js # 定时任务 │ │ │ ├── ocr.js # 图像文字识别(OCR) │ │ │ ├── office.js # Office文档(PPT/Word/Excel) │ │ │ ├── storage.js # 文件存储 │ │ │ └── TOOL_DEVELOPMENT.md # 工具开发文档 │ │ └── ... │ ├── api/ # API 层 │ │ ├── client.js # OpenAI 兼容 API 客户端 │ │ ├── webSearch.js # 联网搜索模块 │ │ └── models.js # 多模型管理 │ ├── io/ # 输入输出 │ │ ├── terminal.js # 终端 UI │ │ ├── logger.js # 日志管理 │ │ └── ws-server.js # WebSocket 服务 │ ├── config.js # 配置管理 │ └── index.js # 应用入口 ├── electron/ # Electron 桌面模式 │ ├── main.js # 主进程 │ ├── preload.cjs # 安全上下文桥接 │ ├── agent-bridge.js # WebSocket ↔ IPC 桥接 │ ├── desktop/ # 悬浮窗 UI │ │ ├── index.html │ │ ├── renderer.js │ │ └── style.css │ ├── dashboard/ # 仪表盘窗口 UI │ │ ├── index.html │ │ ├── renderer.js │ │ └── style.css │ ├── setup/ # 配置向导 UI │ │ ├── setup.html │ │ ├── setup-renderer.js │ │ └── setup-style.css │ └── assets/ # 桌面资源 │ ├── zhanshi.mp4 # 虚拟人物视频 │ └── README.md ├── personas/ # 13种预设人设 ├── tests/ # 测试文件 └── data/ # 运行时数据(自动创建) ``` --- ## 常用命令速查 ### 会话管理 | 命令 | 说明 | |------|------| | `/sessions` | 查看所有会话列表 | | `/new` | 创建新会话 | | `/switch ` | 切换到指定会话 | | `/delete ` | 删除指定会话 | | `/rename ` | 重命名当前会话 | ### 系统命令 | 命令 | 说明 | |------|------| | `/help` | 显示帮助信息 | | `/status` | 显示当前状态 | | `/config` | 显示配置信息 | | `/clear` | 清屏 | | `/persona ` | 切换人设 | | `/debug` | 切换调试模式 | ### 交互快捷键 | 按键 | 说明 | |------|------| | `ENTER` | 打断当前思考,进入输入状态 | | `exit` | 退出程序 | --- ## 配置说明 ### 配置文件 (config.json) ```json { "api": { "baseUrl": "https://api.openai.com/v1", "apiKey": "your-api-key", "model": "gpt-4o" }, "workspace": "./", "persona": "explorer", "thinkingInterval": 3000, "database": { "path": "./data/example.db" }, "code": { "maxExecutionTime": 30000, "maxOutputSize": 100000 }, "ocr": { "provider": "", "baseURL": "", "apiKey": "", "model": "Qwen2.5-VL-32B-Instruct" }, "tools": { "enabledCategories": ["file", "web", "code", "git", "task", "memory", "data"] } } ``` ### 环境变量 (.env) 敏感配置建议使用环境变量: ```bash COGITO_API_KEY=your-api-key-here COGITO_API_BASE_URL=https://api.openai.com/v1 COGITO_MODEL=gpt-4o COGITO_WORKSPACE=/home/user/projects COGITO_EMAIL_PASSWORD=your-email-password ``` ### 工具分类配置 按需加载工具分类,减少 Token 消耗: | 分类 | 说明 | |------|------| | `file` | 文件操作 | | `web` | 网络工具 | | `browser` | 浏览器自动化 | | `system` | 系统操作 | | `code` | 代码执行 | | `git` | Git 版本控制 | | `task` | 任务管理 | | `memory` | 记忆系统 | | `data` | 数据处理 | | `db` | 数据库 | | `email` | 邮件功能 | | `monitor` | 系统监控 | | `scheduler` | 定时任务 | | `ocr` | 图像文字识别 | | `office` | Office文档(PPT/Word/Excel) | ### 环境变量完整列表 所有可用的环境变量配置: #### API 配置 | 环境变量 | 说明 | 默认值 | |----------|------|--------| | `COGITO_API_KEY` | API 密钥(必需) | - | | `COGITO_API_BASE_URL` | API 服务地址 | `https://api.openai.com/v1` | | `COGITO_API_PROVIDER` | API 服务商名称 | `openai` | | `COGITO_MODEL` | 模型名称 | `gpt-4o` | #### 多模型 API 密钥 | 环境变量 | 说明 | |----------|------| | `OPENAI_API_KEY` | OpenAI API 密钥 | | `MOARK_API_KEY` | Moark API 密钥 | | `ANTHROPIC_API_KEY` | Anthropic API 密钥 | | `GOOGLE_API_KEY` | Google API 密钥 | #### 思考与执行配置 | 环境变量 | 说明 | 默认值 | |----------|------|--------| | `COGITO_THINKING_INTERVAL` | 思考间隔(毫秒) | `3000` | | `COGITO_CODE_TIMEOUT` | 代码执行超时(毫秒) | `30000` | | `COGITO_CODE_MAX_OUTPUT` | 代码输出最大大小(字符) | `100000` | #### 数据库配置 | 环境变量 | 说明 | 默认值 | |----------|------|--------| | `COGITO_DATABASE_PATH` | SQLite 数据库文件路径 | `./data/example.db` | #### 邮件配置 | 环境变量 | 说明 | 默认值 | |----------|------|--------| | `COGITO_EMAIL_HOST` | SMTP 服务器地址 | - | | `COGITO_EMAIL_PORT` | SMTP 端口 | `587` | | `COGITO_EMAIL_USER` | 邮箱用户名 | - | | `COGITO_EMAIL_PASSWORD` | 邮箱密码 | - | | `COGITO_EMAIL_FROM` | 发件人邮箱地址 | - | #### 工作区配置 | 环境变量 | 说明 | 默认值 | |----------|------|--------| | `COGITO_WORKSPACE` | 工作区根路径 | 用户主目录 | #### WebSocket 配置 | 环境变量 | 说明 | 默认值 | |----------|------|--------| | `WS_PORT` | WebSocket 端口 | `9527` | | `DISABLE_WS` | 禁用 WebSocket 服务 | `false` | #### 调试配置 | 环境变量 | 说明 | 默认值 | |----------|------|--------| | `DEBUG` | 启用调试模式 | `false` | | `NODE_ENV` | 运行环境 | `development` | ### 高级配置选项 #### 上下文压缩策略 **压缩触发条件:** - 对话轮数超过 150 轮 - Token 数量超过 100K(估算) **压缩策略:** ```javascript { COMPRESS_TURNS: 150, // 触发压缩的轮数阈值 KEEP_RECENT_TURNS: 10, // 压缩时保留的最近轮数 MAX_TOKEN_ESTIMATE: 100000, // Token 上限(估算) WARN_TOKEN_THRESHOLD: 80000 // Token 警告阈值(80%) } ``` **压缩流程:** 1. 提取最近 10 轮对话 2. 归档之前的对话到文件 3. 生成上下文摘要 4. 重建对话历史 **Token 估算方法:** - 中文字符:约 1 token ≈ 1.5 字符 - 英文字符:约 1 token ≈ 4 字符 #### 工具输出截断配置 不同工具的输出截断限制: | 工具 | 截断限制 | 说明 | |------|----------|------| | `ls` | 5000字符 | 目录列表较短 | | `gitLog` | 10000字符 | Git 日志中等 | | `gitDiff` | 10000字符 | Git 差异中等 | | `executeCode` | 50000字符 | 代码执行结果较长 | | `runJavaScript` | 50000字符 | JS 执行结果 | | `runPython` | 50000字符 | Python 执行结果 | | `read` | 20000字符 | 文件内容中等 | | `executeSQL` | 20000字符 | 数据库查询结果 | | `searchMemory` | 10000字符 | 搜索结果 | | `default` | 10000字符 | 默认限制 | #### 会话归档策略 **归档触发:** - 切换会话时自动归档当前会话 - 压缩历史时归档旧对话 **归档文件:** ``` data/sessions/ ├── session_abc123.json # 当前会话 ├── session_abc123_archive.json # 归档文件(最多保留3个) └── meta.json # 会话元数据 ``` **归档保留策略:** - 每个会话最多保留 3 个归档文件 - 归档文件包含时间戳和对话内容 #### 思考间隔优化 **调整思考间隔:** ```javascript // config.json { "chat": { "thinkingInterval": 3000 // 默认 3 秒 } } // 或通过环境变量 COGITO_THINKING_INTERVAL=5000 // 5 秒 ``` **建议值:** | 场景 | 建议间隔 | 说明 | |------|----------|------| | 快速响应 | 1000-2000ms | 适合频繁交互 | | 正常使用 | 3000ms | 默认值,平衡性能 | | 资源受限 | 5000-10000ms | 减少API调用频率 | | 后台运行 | 10000ms+ | 最小化资源占用 | --- ## Docker 部署 ### 环境要求 - Docker 20.10+ - Docker Compose 2.0+ ### 快速启动 ```bash # 克隆项目 git clone https://gitee.com/cnt-code/cogito-agent.git cd cogito-agent # 创建配置文件 cp config.example.json config.json # 编辑 config.json 填入 API Key # 启动容器 docker-compose up -d # 查看日志 docker-compose logs -f ``` ### 配置说明 通过环境变量覆盖配置: | 环境变量 | 说明 | 默认值 | |----------|------|--------| | `COGITO_API_KEY` | API 密钥 | - | | `COGITO_API_BASE_URL` | API 地址 | `https://api.openai.com/v1` | | `COGITO_MODEL` | 模型名称 | `gpt-4o` | | `COGITO_WORKSPACE` | 工作区目录 | `./workspace` | | `THINKING_INTERVAL` | 思考间隔(ms) | `3000` | ### 手动构建 ```bash # 构建镜像 docker build -t cogito-agent . # 运行容器 docker run -d \ --name cogito-agent \ -p 9527:9527 \ -v ./config.json:/app/config.json:ro \ -e COGITO_API_KEY=your-key \ cogito-agent ``` ### Docker Compose 生产配置 ```yaml version: '3.8' services: cogito-agent: image: cogito-agent:latest container_name: cogito-agent restart: always ports: - "9527:9527" environment: - COGITO_API_KEY=${COGITO_API_KEY} - COGITO_API_BASE_URL=${COGITO_API_BASE_URL} - COGITO_MODEL=${COGITO_MODEL:-gpt-4o} - THINKING_INTERVAL=3000 volumes: - ./config.json:/app/config.json:ro - ./data:/app/data - ${COGITO_WORKSPACE:-./workspace}:/app/workspace ``` --- ## CI/CD 集成(暂未启用) 项目暂时未启用 Gitee Go 流水线: | 工作流 | 触发条件 | 功能 | |--------|----------|------| | `ci.yml` | push/PR | 自动化测试、Docker 构建 | | `release.yml` | tag v* | 构建镜像、创建 Gitee 发行版 | **使用步骤:** 1. 在 Gitee 仓库 -> 服务 -> Gitee Go 中启用流水线功能 2. 配置 Docker 镜像仓库凭证(可选,用于推送镜像) 3. 推送代码触发 CI: ```bash git push origin develop ``` 4. 发布版本时打标签: ```bash git tag v1.0.0 git push origin v1.0.0 ``` **Gitee Go 流水线说明:** - CI 流水线在 push 和 PR 时自动运行,包括测试和 Docker 镜像构建 - Release 流水线在打 tag 时触发,需手动确认执行 - 镜像构建完成后可手动推送到 Docker 仓库 --- ## 应用场景示例 ### 文件探索 ```javascript // 分析项目结构 [TOOL] ls("./src") [/TOOL] // → ["agent", "api", "io", "config.js", "index.js"] // 读取关键文件 [TOOL] read("./src/agent/Agent.js") [/TOOL] // → 返回文件内容 ``` ### 代码执行 ```javascript // Python 脚本执行 [TOOL] runPython(` import json data = {"fibonacci": [0, 1, 1, 2, 3, 5, 8]} print(json.dumps(data)) `) [/TOOL] // → {"fibonacci": [0, 1, 1, 2, 3, 5, 8]} // JavaScript 沙箱执行 [TOOL] runJavaScript(` const arr = [1, 2, 3, 4, 5]; const sum = arr.reduce((a, b) => a + b, 0); console.log(sum); `) [/TOOL] // → 15 ``` ### Git 版本控制 ```javascript // 查看仓库状态 [TOOL] gitStatus() [/TOOL] // → { files: ["src/index.js", "README.md"], branch: "main" } // 提交更改 [TOOL] gitCommit("feat: 添加新工具") [/TOOL] // → committed (a1b2c3d) // 推送远程 [TOOL] gitPush("origin", "main") [/TOOL] // → done ``` ### 数据库操作 ```javascript // 执行 SQL [TOOL] executeSQL("SELECT * FROM tasks WHERE status = 'pending'") [/TOOL] // → [{ id: "1", title: "任务A", status: "pending" }] // 插入数据 [TOOL] insert("tasks", { title: "新任务", priority: "high" }) [/TOOL] // → { id: "2", title: "新任务", priority: "high" } ``` ### 联网搜索 ```javascript // 搜索信息 [TOOL] search("Node.js 20 new features") [/TOOL] // → [{ title: "...", url: "...", snippet: "..." }] // 获取页面内容 [TOOL] fetchPage("https://nodejs.org/") [/TOOL] // → { title: "Node.js", content: "..." } ``` ### 图像文字识别(OCR) ```javascript // 识别单张图片中的文字 [TOOL] ocr("screenshots/invoice.png") [/TOOL] // → 返回图片中的文本内容 // 批量识别多张图片 [TOOL] ocrBatch("page1.jpg, page2.jpg, page3.jpg") [/TOOL] // → 依次返回每张图片的识别结果 // 配合文件操作工具使用 [TOOL] ls("./photos") [/TOOL] // → ["meeting_notes.jpg", "whiteboard.png"] [TOOL] ocr("./photos/whiteboard.png") [/TOOL] // → 识别白板照片中的文字内容 ``` ### Office 文档生成 ```javascript // 创建 PPT 演示文稿 [TOOL] createPpt({ outputPath: "data/presentation.pptx", title: "项目汇报", slides: [ { title: "封面", content: "2024年度项目总结" }, { title: "核心成果", bullets: ["完成目标1", "完成目标2", "超额完成目标3"] }, { title: "数据展示", image: "data/chart.png" } ] }) [/TOOL] // → { success: true, path: "data/presentation.pptx", slideCount: 3 } // 创建 Word 文档 [TOOL] createWord({ outputPath: "data/report.docx", title: "分析报告", paragraphs: [ { type: "heading", text: "一、概述", level: 1 }, { type: "text", text: "本报告对...进行了深入分析。" }, { type: "heading", text: "二、数据统计", level: 2 }, { type: "table", rows: [["项目", "数值"], ["A", "100"], ["B", "200"]] } ] }) [/TOOL] // → { success: true, path: "data/report.docx", paragraphCount: 4 } // 创建 Excel 表格 [TOOL] createExcel({ outputPath: "data/data.xlsx", sheets: [ { name: "销售", data: [["产品", "销量"], ["A", 100], ["B", 200]] }, { name: "库存", data: [["产品", "库存"], ["A", 50], ["B", 30]] } ] }) [/TOOL] // → { success: true, path: "data/data.xlsx", sheetCount: 2 } // 读取 Excel 文件 [TOOL] readExcel("data/data.xlsx") [/TOOL] // → { "销售": [["产品","销量"],...], "库存": [["产品","库存"],...] } ``` --- ## 架构设计 ### 核心组件 | 组件 | 职责 | 说明 | |------|------|------| | **Agent.js** | 思考循环 | 每3秒自动触发一次思考 | | **state.js** | 状态机 | THINKING / AWAITING_INPUT / AWAITING_CONFIRMATION | | **registry.js** | 工具注册表 | 19 个工具模块集中管理 | | **session.js** | 会话管理 | 多会话切换、上下文压缩 | | **commands.js** | 命令处理 | /help、/status 等特殊命令 | | **sandbox.js** | 代码沙箱 | isolated-vm 进程级隔离 | | **ws-server.js** | WebSocket | 桌面模式通信 | ### 模块关系 ```mermaid flowchart TB subgraph Agent["Agent 子进程"] A[Agent.js] --> S[session.js] A --> R[registry.js] A --> W[ws-server.js] A --> API[api/client.js] end subgraph Desktop["Electron"] M[main.js] --> P[preload.cjs] P --> BR[agent-bridge.js] BR <--> W end ``` --- ## 核心原理 ### 思考循环 (Think Cycle) Agent 的核心是一个持续运行的思考循环,每隔固定间隔自动触发一轮思考,直到用户打断。 ```mermaid flowchart TD START([启动]) --> INIT[初始化会话
加载 persona + 工具注册表] INIT --> LOOP{思考循环} LOOP -->|定时触发| BUILD[构建消息上下文] BUILD --> CALL[调用 AI API
流式返回] CALL --> PARSE{解析输出} PARSE -->|普通文本| APPEND[追加到回复] PARSE -->|工具调用| EXEC[执行工具] PARSE -->|WAIT 标记| WAIT[等待用户输入] APPEND --> LOOP EXEC --> RESULT[获取工具结果] RESULT -->|成功| APPEND_RESULT[结果追加到上下文] APPEND_RESULT --> LOOP WAIT -->|用户输入| HANDLE[处理用户消息] HANDLE -->|普通消息| BUILD HANDLE -->|命令 /xxx| CMD[执行命令] CMD --> LOOP ``` ### 工具调用流程 ```mermaid sequenceDiagram participant AI as AI 模型 participant Parser as 解析器 participant Registry as 工具注册表 participant Tool as 工具函数 participant Sandbox as 沙箱 AI->>Parser: 输出 "[TOOL] ls("C:/") [/TOOL]" Parser->>Registry: 查找 "ls" Registry-->>Parser: { fn, argCount, category } alt 危险操作 Parser->>Parser: 请求用户确认 end Parser->>Tool: 调用 fn(args) alt 代码执行工具 Tool->>Sandbox: isolated-vm 隔离执行 end Parser->>AI: 结果追加到上下文 ``` ### 桌面模式消息流 ```mermaid sequenceDiagram participant User as 用户 participant UI as 桌面 UI participant Bridge as agent-bridge.js participant WS as ws-server.js participant Agent as Agent.js User->>UI: 输入消息 UI->>Bridge: IPC Bridge->>WS: JSON WS->>Agent: handleUserInput() Agent->>AI: 流式 API 调用 loop 流式输出 AI-->>Agent: chunk Agent->>WS: broadcast WS->>Bridge: 转发 Bridge->>UI: 渲染 end ``` ### 状态机 ```mermaid stateDiagram-v2 [*] --> THINKING: 启动 THINKING --> AWAITING_INPUT: 用户打断 / 命令 AWAITING_INPUT --> THINKING: 发送消息 THINKING --> AWAITING_CONFIRMATION: 危险操作 AWAITING_CONFIRMATION --> THINKING: 用户确认/拒绝 ``` --- ## 插件系统 CogitoAgent 支持动态加载自定义工具插件,扩展 Agent 能力。 ### 插件目录结构 ``` plugins/ └── my-plugin/ ├── index.js # 插件入口(必需) ├── package.json # 插件配置(可选) └── utils.js # 辅助模块(可选) ``` ### 插件开发 #### 插件入口文件 ```javascript // plugins/my-plugin/index.js /** * 插件必须导出工具数组 */ export default [ { name: 'myCustomTool', description: '我的自定义工具', category: 'custom', fn: async (arg1, arg2) => { try { // 工具逻辑 const result = await someOperation(arg1, arg2); return { success: true, data: result }; } catch (error) { return { success: false, error: error.message }; } } }, { name: 'anotherTool', description: '另一个工具', category: 'custom', fn: async (input) => { // 工具实现 return { success: true, data: `处理: ${input}` }; } } ]; /** * 插件元数据(可选) */ export const metadata = { name: 'my-plugin', version: '1.0.0', author: 'Your Name', description: '自定义插件描述' }; ``` #### 插件配置文件 ```json // plugins/my-plugin/package.json { "name": "cogito-plugin-my-plugin", "version": "1.0.0", "description": "A CogitoAgent plugin", "main": "index.js", "type": "module" } ``` ### 插件加载 #### 自动加载 启动时自动加载 `plugins/` 目录下的所有插件: ```javascript // Agent 启动时会自动调用 const { loaded, errors } = await loadPlugins(); console.log(`已加载 ${loaded} 个插件`); if (errors.length > 0) { console.error('插件加载错误:', errors); } ``` #### 手动加载 ```javascript import { getPluginManager } from './agent/plugin.js'; const pm = getPluginManager(); // 加载单个插件 await pm.loadPlugin('my-plugin', '/path/to/plugin'); // 列出已加载插件 const plugins = pm.listPlugins(); // 列出所有自定义工具 const tools = pm.listCustomTools(); ``` ### 插件管理 | 操作 | 方法 | 说明 | |------|------|------| | 加载所有插件 | `loadPlugins()` | 自动加载 plugins 目录 | | 加载单个插件 | `pm.loadPlugin(name, path)` | 手动加载指定插件 | | 卸载插件 | `unloadPlugin(name)` | 移除插件及其工具 | | 列出插件 | `listPlugins()` | 获取已加载插件列表 | | 列出工具 | `listCustomTools()` | 获取所有自定义工具 | ### 工具注册 插件工具会自动注册到全局工具注册表: ```javascript // 注册后可直接调用 [TOOL] myCustomTool("参数1", "参数2") [/TOOL] ``` ### 插件最佳实践 1. **模块化设计** - 每个工具专注于单一功能 2. **错误处理** - 所有工具必须返回 `{ success, data/error }` 格式 3. **文档完善** - 提供清晰的工具描述和参数说明 4. **版本管理** - 使用 package.json 管理版本信息 5. **测试覆盖** - 为插件编写测试用例 --- ## MCP 协议兼容 CogitoAgent 支持 MCP (Model Context Protocol) 协议,可将工具暴露为 MCP Server,供其他 AI 客户端调用。 ### MCP 协议概述 MCP 是一个标准化的协议,用于 AI 模型与外部工具之间的通信: - 基于 JSON-RPC 2.0 - 支持工具调用、资源访问、提示词管理 - 提供统一的工具描述格式 ### 启动 MCP 服务器 #### 默认启动 ```javascript import { startMCPServer } from './agent/mcp.js'; // 默认端口 3001 const port = await startMCPServer(); console.log(`MCP 服务器已启动: http://localhost:${port}`); ``` #### 自定义端口 ```javascript const port = await startMCPServer(4001); ``` ### MCP 工具列表 MCP 服务器会自动暴露所有已注册的工具: ```javascript // MCP 客户端请求工具列表 { "jsonrpc": "2.0", "id": 1, "method": "tools/list" } // 响应 { "jsonrpc": "2.0", "id": 1, "result": { "tools": [ { "name": "ls", "description": "file: ls", "inputSchema": { "type": "object", "properties": { "args": { "type": "array", "items": { "type": "string" } } }, "required": ["args"] } }, // ... 更多工具 ] } } ``` ### MCP 工具调用 ```javascript // MCP 客户端调用工具 { "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "ls", "arguments": ["./src"] } } // 响应 { "jsonrpc": "2.0", "id": 2, "result": { "content": [ { "type": "text", "text": "[\"agent\", \"api\", \"io\", \"config.js\"]" } ], "isError": false } } ``` ### MCP 资源访问 MCP 服务器提供资源访问接口: | 资源 URI | 说明 | |----------|------| | `file://workspace` | 当前工作区目录 | | `session://current` | 当前会话信息 | ### MCP 提示词 MCP 服务器提供预设提示词: ```javascript // 获取提示词列表 { "jsonrpc": "2.0", "id": 3, "method": "prompts/list" } // 响应 { "jsonrpc": "2.0", "id": 3, "result": { "prompts": [ { "name": "explore", "description": "开始探索工作区", "arguments": [ { "name": "path", "description": "要探索的目录路径", "required": false } ] } ] } } ``` ### MCP 客户端示例 ```javascript // 使用 MCP 客户端连接 const client = new MCPClient('http://localhost:3001'); // 初始化连接 await client.initialize(); // 获取工具列表 const tools = await client.listTools(); // 调用工具 const result = await client.callTool('ls', ['./src']); console.log(result.content[0].text); ``` ### MCP 配置 | 配置项 | 默认值 | 说明 | |--------|--------|------| | 端口 | 3001 | MCP 服务端口 | | 协议版本 | 2.0 | JSON-RPC 版本 | | CORS | 启用 | 允许跨域访问 | --- ## 追踪模块 CogitoAgent 内置轻量级追踪系统,记录工具执行、LLM 调用、状态转换等事件。 ### 追踪功能 | 功能 | 说明 | |------|------| | 事件记录 | 记录关键操作和状态变化 | | 性能监控 | 统计执行时间和频率 | | 错误追踪 | 记录错误信息和上下文 | | 数据持久化 | 保存追踪记录到文件 | ### 追踪事件类型 | 事件 | 说明 | |------|------| | `llm_call` | LLM API 调用 | | `tool_exec` | 工具执行 | | `state_change` | 状态转换 | | `session_start` | 会话开始 | | `session_end` | 会话结束 | | `error` | 错误事件 | ### 启用追踪 追踪默认启用,可通过以下方式控制: ```javascript import { setTracingEnabled } from './agent/tracing.js'; // 启用追踪 setTracingEnabled(true); // 禁用追踪 setTracingEnabled(false); ``` ### 追踪记录 #### LLM 调用追踪 ```javascript traceLLMCall( 'gpt-4o', // 模型名称 1500, // 输入长度 800, // 输出长度 2500, // 执行时间(ms) { total: 2300 } // Token 使用统计 ); ``` #### 工具执行追踪 ```javascript traceToolExec( 'ls', // 工具名称 ['./src'], // 参数 { success: true }, // 结果 150, // 执行时间(ms) true // 是否成功 ); ``` #### 状态转换追踪 ```javascript traceStateChange( 'THINKING', // 原状态 'AWAITING_INPUT', // 新状态 '用户打断' // 原因 ); ``` ### 追踪统计 ```javascript import { getStats } from './agent/tracing.js'; const stats = getStats(); console.log(stats); // { // sessionId: 'sess_abc123', // totalTraces: 150, // events: { // llm_call: 45, // tool_exec: 80, // state_change: 20, // error: 5 // }, // totalToolDuration: 12500, // avgToolDuration: 156, // totalInputTokens: 67500, // totalOutputTokens: 36000 // } ``` ### 追踪日志 追踪记录自动保存到文件: ``` data/logs/ └── trace_sess_abc123_2024-01-15.json ``` **日志内容:** ```json { "sessionId": "sess_abc123", "savedAt": "2024-01-15T10:30:00Z", "stats": { /* 统计信息 */ }, "traces": [ { "id": "trace_x7y8z9", "timestamp": "2024-01-15T10:25:30Z", "event": "tool_exec", "data": { "tool": "ls", "args": ["./src"], "success": true, "resultSize": 150, "duration": 120 } }, // ... 更多追踪记录 ] } ``` ### 追踪最佳实践 1. **定期检查统计** - 监控性能和错误率 2. **分析工具耗时** - 识别性能瓶颈 3. **追踪错误模式** - 发现常见问题 4. **优化高频工具** - 提升整体性能 --- ## 熔断器与重试机制 CogitoAgent 内置熔断器和重试机制,保障网络请求等不稳定操作的可靠性。 ### 熔断器机制 熔断器防止系统在故障时持续请求,保护系统稳定性。 #### 熔断器状态 | 状态 | 说明 | 行为 | |------|------|------| | `closed` | 正常状态 | 允许所有请求 | | `open` | 熔断状态 | 拒绝所有请求 | | `half_open` | 半开状态 | 允许少量请求测试 | #### 状态转换 ``` closed → open: 失败次数达到阈值(默认5次) open → half_open: 超时后(默认60秒) half_open → closed: 测试请求成功 half_open → open: 测试请求失败 ``` #### 熔断器配置 ```javascript import { getCircuitBreaker } from './agent/retry.js'; const breaker = getCircuitBreaker('api-calls', { failureThreshold: 5, // 失败阈值 resetTimeout: 60000, // 重置超时(ms) halfOpenRequests: 1 // 半开状态允许的请求数 }); ``` #### 熔断器使用 ```javascript import { withCircuitBreaker } from './agent/retry.js'; const result = await withCircuitBreaker( async () => { // 执行不稳定操作 return await fetchAPI(); }, 'api-calls', // 熔断器名称 { failureThreshold: 5 } ); if (!result.success) { console.error('熔断器拦截:', result.error); } ``` ### 重试机制 重试机制自动重试失败的网络请求,提高成功率。 #### 重试配置 ```javascript const retryConfig = { maxRetries: 3, // 最大重试次数 initialDelay: 1000, // 初始延迟(ms) maxDelay: 10000, // 最大延迟(ms) backoffMultiplier: 2, // 退避倍数 retryableErrors: [ 'ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND', 'socket hang up' ] }; ``` #### 重试使用 ```javascript import { withRetry } from './agent/retry.js'; const result = await withRetry( async (attempt) => { // 执行可能失败的操作 console.log(`尝试 ${attempt + 1}`); return await fetchData(); }, { maxRetries: 3, initialDelay: 1000, onRetry: (info) => { console.log(`重试 ${info.attempt}/${info.maxRetries}`); } } ); ``` #### 退避策略 重试延迟采用指数退避: ``` 第1次重试: 1000ms + 随机抖动(0-25%) 第2次重试: 2000ms + 随机抖动 第3次重试: 4000ms + 随机抖动 最大延迟: 10000ms ``` ### 组合使用 熔断器和重试可以组合使用: ```javascript import { withCircuitAndRetry } from './agent/retry.js'; const result = await withCircuitAndRetry( async () => await fetchAPI(), { name: 'api-calls', enableBreaker: true, enableRetry: true, breakerConfig: { failureThreshold: 5 }, retryConfig: { maxRetries: 3 } } ); ``` ### 状态监控 ```javascript import { getAllBreakerStatus } from './agent/retry.js'; const status = getAllBreakerStatus(); console.log(status); // { // 'api-calls': { // name: 'api-calls', // state: 'closed', // failureCount: 0, // successCount: 150, // lastFailureTime: null, // timeUntilRetry: 0 // } // } ``` ### 最佳实践 1. **合理设置阈值** - 根据服务稳定性调整 2. **监控熔断状态** - 及时发现问题 3. **避免过度重试** - 设置合理的重试次数 4. **记录失败原因** - 分析根本问题 --- ## 多模型支持 CogitoAgent 支持多个 AI 模型提供商,可灵活切换和配置。 ### 支持的提供商 | 提供商 | Base URL | 支持模型 | |--------|----------|----------| | OpenAI | `https://api.openai.com/v1` | gpt-4, gpt-4-turbo, gpt-3.5-turbo | | Moark | `https://api.moark.com/v1` | DeepSeek-V4-Flash, DeepSeek-V4 | | Anthropic | `https://api.anthropic.com/v1` | claude-3-opus, claude-3-sonnet, claude-3-haiku | | Google | `https://generativelanguage.googleapis.com/v1beta` | gemini-pro, gemini-1.5-pro | ### 配置多模型 #### 环境变量配置 ```bash # OpenAI OPENAI_API_KEY=sk-xxxxx # Moark MOARK_API_KEY=mk-xxxxx # Anthropic ANTHROPIC_API_KEY=ant-xxxxx # Google GOOGLE_API_KEY=goo-xxxxx ``` #### 配置文件配置 ```json { "models": { "openai": { "apiKey": "sk-xxxxx", "baseURL": "https://api.openai.com/v1" }, "moark": { "apiKey": "mk-xxxxx", "baseURL": "https://api.moark.com/v1" }, "anthropic": { "apiKey": "ant-xxxxx", "baseURL": "https://api.anthropic.com/v1" }, "google": { "apiKey": "goo-xxxxx", "baseURL": "https://generativelanguage.googleapis.com/v1beta" } } } ``` ### 切换模型 #### 使用命令切换 ```javascript import { switchProvider } from './api/models.js'; const result = switchProvider('anthropic', 'claude-3-opus'); if (result.success) { console.log('已切换到:', result.data.model); } ``` #### 使用环境变量切换 ```bash COGITO_API_PROVIDER=anthropic COGITO_MODEL=claude-3-opus ``` ### 模型参数配置 不同模型可配置不同的参数: ```json { "chat": { "maxTokens": 384000, "temperature": 0.7, "topP": 0.7, "topK": 50, "frequencyPenalty": 1 } } ``` ### 获取模型信息 ```javascript import { getCurrentModel, listProviders, getModels } from './api/models.js'; // 当前模型 const current = getCurrentModel(); console.log(current); // { provider: 'openai', model: 'gpt-4o', baseURL: '...' } // 所有提供商 const providers = listProviders(); // 指定提供商的模型列表 const models = getModels('openai'); ``` ### 模型选择建议 | 场景 | 推荐模型 | 说明 | |------|----------|------| | 代码生成 | gpt-4o, DeepSeek-V4 | 强大的代码理解能力 | | 文本创作 | claude-3-opus | 优秀的创意写作 | | 快速响应 | gpt-3.5-turbo, DeepSeek-V4-Flash | 低延迟,低成本 | | 长文本处理 | gemini-1.5-pro | 支持超长上下文 | | 日常对话 | claude-3-sonnet | 平衡性能和成本 | --- ## 联网搜索配置 CogitoAgent 内置联网搜索功能,可获取实时信息。 ### 搜索配置 #### 基本配置 ```json { "search": { "enabled": true, "baseURL": "", // 搜索 API URL(空则使用默认) "recencyFilter": "", // 时间过滤器 "siteFilter": "" // 站点过滤器 } } ``` #### 搜索 URL 配置 搜索 URL 的构建规则: 1. 优先使用 `search.baseURL` 2. 否则使用 `api.baseURL` + `/web-search-v2` 3. 默认使用 Moark 搜索 API ```bash # 自定义搜索 URL COGITO_SEARCH_BASE_URL=https://custom-search-api.com/v1 ``` ### 搜索参数 #### 时间过滤器 限制搜索结果的时间范围: ```json { "search": { "recencyFilter": "day" // 最近一天 } } ``` | 值 | 说明 | |---|------| | `day` | 最近一天 | | `week` | 最近一周 | | `month` | 最近一个月 | | `year` | 最近一年 | #### 站点过滤器 限制搜索结果的站点: ```json { "search": { "siteFilter": "github.com" // 只搜索 GitHub } } ``` ### 搜索使用 ```javascript import { search } from './api/webSearch.js'; const result = await search('Node.js 20 new features'); if (result.success) { console.log('搜索结果:', result.data); } ``` ### 搜索结果格式 ```javascript { success: true, data: [ { title: "Node.js 20 Released", url: "https://nodejs.org/blog", snippet: "Node.js 20 brings new features...", publishedDate: "2024-01-15" }, // ... 更多结果 ] } ``` ### 搜索最佳实践 1. **使用时间过滤器** - 获取最新信息 2. **使用站点过滤器** - 提高搜索精度 3. **优化关键词** - 使用具体、明确的搜索词 4. **结合工具使用** - 搜索后用 `fetchPage` 获取详细内容 --- ## 测试 ### 运行测试 ```bash npm test # 运行所有测试 npm test -- --verbose # 详细输出 npm test -- --coverage # 覆盖率报告 # E2E 测试 npm run test:e2e # 运行 E2E 测试 npm run test:e2e -- --watch # 监听模式 ``` ### 测试覆盖 | 模块 | 用例数 | 覆盖内容 | |------|:------:|---------| | Agent | 27 | 参数解析、工具调用、状态管理 | | 配置管理 | 12 | 环境变量解析、配置合并 | | Git 操作 | 20 | 仓库操作、安全参数传递 | | 代码执行 | 8 | 沙箱安全、危险代码拒绝 | | 数据库 | 10 | SQL 执行、CRUD、事务 | | Web 模块 | 3 | browse、fetchPage | | Browser | 2 | Playwright 生命周期 | | E2E WebSocket | 6 | 连接、心跳、消息收发、并发 | | E2E Agent 流程 | 15 | 初始化、思考循环、工具执行、状态机、会话管理 | ### E2E 测试说明 E2E 测试位于 `tests/e2e/` 目录: | 测试文件 | 说明 | |----------|------| | `websocket.test.js` | WebSocket 通信测试 | | `agent-flow.test.js` | Agent 完整流程测试 | E2E 测试覆盖: - WebSocket 连接建立、消息发送接收、心跳机制 - Agent 初始化、思考循环、工具调用 - 状态机转换、会话管理、记忆系统 - 任务管理、API 集成、命令处理 --- ## 贡献指南 欢迎贡献代码: 1. Fork 项目 2. 创建分支:`git checkout -b feature/your-feature` 3. 编写代码并测试 4. 确保 `npm test` 通过 5. 提交 Pull Request ### 代码规范 - 使用 ES6+ 语法 - 使用 `async/await` 处理异步操作 - 工具函数返回格式:`{ success: boolean, data?: any, error?: string }` --- ## 更新日志 ### v2.3.0 - 多会话管理(创建、切换、删除、重命名) - 工具分类按需加载 - 上下文自动压缩(150轮 / 100K token) - 沙箱升级 - 深度冻结内置对象 - 新增 tracing.js - 追踪模块 - 新增 retry.js - 熔断器与重试机制 - MCP 协议兼容 - 插件系统 (Plugin SDK) - 新增 OCR 图像文字识别工具 ### v2.2.0 - Agent.js 拆分为独立模块 - logger.js 支持 DEBUG/INFO/WARN/ERROR 分级 - 测试用例增至 103+ ### v2.1.0 - 移除 vm2 依赖(安全漏洞) - 改用 Node.js 原生 vm 模块 - 跨平台支持改进 ### v2.0.0 - 代码执行引擎(JS/Python) - Git 版本控制集成 - 任务管理系统 - 记忆系统 - 数据处理工具 - SQLite 数据库 - 邮件功能 - 系统监控 - 定时任务调度 - 多模型支持 --- ## 许可证 Apache 2.0 --- Built with CogitoAgent Team