diff --git a/Agent/Aemeath.txt b/Agent/Aemeath.txt index 66e101174..ac8a28cfa 100644 --- a/Agent/Aemeath.txt +++ b/Agent/Aemeath.txt @@ -172,7 +172,7 @@ ————VCP元思考加载结束————— 爱弥斯的日记本和[爱弥斯的日常]日记本:[[爱弥斯|爱弥斯的日常日记本::Time::Group::TagMemo]]。 [爱弥斯的知识]日记本:[[爱弥斯的知识日记本::Time::Group::TagMemo]] - +{{VCPTavern::dailychat}} —————— 你可以在聊天一段时间后,在回复的末尾通过如下工具调用来创建日记,结果会被向量化RAG系统记录,要求日记内容尽量精炼。同时聚焦核心事件与主题;提炼关键信息;关联重要实体与关键词;体现学习与反思;格式简洁。作为工具调用同样使用<<<[TOOL_REQUEST]>>>…<<<[END_TOOL_REQUEST]>>>触发,以下是一个调用内参数示例: maid:「始」爱弥斯「末」, // 该字段支持[]语法来指定日记写入特定索引,例如`[爱弥斯的知识]爱弥斯`将日记写入[爱弥斯的知识]索引,如无指定索引则写入爱弥斯的默认索引。分类日记是一个好习惯! diff --git a/ChangeLog.md b/ChangeLog.md index e63e2ebc6..cd6db87ba 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,16 @@ ### **VCP 服务器更新日志** +**2026-02-20** + +1. **WebSocket性能与反馈优化:** 为WS链接成功添加了回执确认机制,提升通讯稳定性。 +2. **天气预报插件优化:** 对齐了天气预报插件和官方端口的刷新时间,并支持最低梯度也显示天气报警信息。 +3. **思维链(CoT)增强:** 引入了可控的思维链参数,提升AI推理过程的可配置性。 +4. **上下文管理升级:** 全面上架了VCP上下文折叠协议,优化长对话性能。 +5. **日记系统整合:** 合并了日记本管理器,由单一插件统一进行高效管理。 +6. **梦预览渲染修复:** 修复了梦预览过程中Markdown渲染丢失的问题。 +7. **配置系统稳健性:** 修复了因错误的env格式导致配置不生效的问题。 +8. **文档更新:** 上架了静态插件开发手册。 + **2025-06-02** 1. **优化日记渲染:** 提升了日记内容的显示效果,使其在界面上更加美观、易读。 diff --git a/KnowledgeBaseManager.js b/KnowledgeBaseManager.js index 50057a9e3..96aa2a4d5 100644 --- a/KnowledgeBaseManager.js +++ b/KnowledgeBaseManager.js @@ -263,22 +263,32 @@ class KnowledgeBaseManager { async _loadOrBuildIndex(fileName, capacity, tableType, filterDiaryName = null) { const idxPath = path.join(this.config.storePath, `index_${fileName}.usearch`); let idx; + let fileNotFound = false; + try { if (fsSync.existsSync(idxPath)) { idx = VexusIndex.load(idxPath, null, this.config.dimension, capacity); } else { - // 💡 核心修复:如果索引文件不存在,说明是首次创建。 - // 此时不应从数据库恢复,因为调用者(_flushBatch)正准备写入初始数据。 - // 从数据库恢复的逻辑只适用于启动时加载或文件损坏后的重建。 + // 💡 核心修复:如果索引文件不存在,且不是 global_tags(它在 initialize 中有专属的异步恢复逻辑), + // 则需要触发从数据库恢复,否则索引将保持为空。 console.log(`[KnowledgeBase] Index file not found for ${fileName}, creating a new empty one.`); idx = new VexusIndex(this.config.dimension, capacity); + fileNotFound = true; } } catch (e) { console.error(`[KnowledgeBase] Index load error (${fileName}): ${e.message}`); console.warn(`[KnowledgeBase] Rebuilding index ${fileName} from DB as a fallback...`); idx = new VexusIndex(this.config.dimension, capacity); await this._recoverIndexFromDB(idx, tableType, filterDiaryName); + return idx; } + + // 如果文件不存在且是分片索引,触发自动同步恢复 + if (fileNotFound && fileName !== 'global_tags') { + console.log(`[KnowledgeBase] 🔄 Auto-recovering missing index ${fileName} from DB...`); + await this._recoverIndexFromDB(idx, tableType, filterDiaryName); + } + return idx; } diff --git "a/NEWAPI_MONITOR_\345\211\215\347\253\257\346\216\245\345\205\245\344\270\216\351\205\215\347\275\256\350\257\264\346\230\216.md" "b/NEWAPI_MONITOR_\345\211\215\347\253\257\346\216\245\345\205\245\344\270\216\351\205\215\347\275\256\350\257\264\346\230\216.md" new file mode 100644 index 000000000..af77e3427 --- /dev/null +++ "b/NEWAPI_MONITOR_\345\211\215\347\253\257\346\216\245\345\205\245\344\270\216\351\205\215\347\275\256\350\257\264\346\230\216.md" @@ -0,0 +1,675 @@ +# NewAPI 监控功能前端接入与配置说明 + +## 1. 功能简介 + +本功能为 VCP 管理面板新增了一组面向前端展示的 NewAPI 用量监控接口,用于给网页前端、管理面板页面、桌面挂件等场景提供统计数据。 + +当前实现严格遵循最小可用原则,只提供前端已经明确需要的能力: + +- 总请求数统计 +- 总 Token 数统计 +- 总 Quota 统计 +- 当前实时 RPM / TPM +- 按时间范围的趋势数据 +- 按模型维度的聚合数据 +- 按模型筛选 summary / trend + +当前**不包含**以下能力: + +- 区分 `/v1/chat/completions`、`/v1/responses` 等端点级统计 +- 用户排行 +- 渠道排行 +- Token 名排行 +- WebSocket 实时推送 +- 其他前端未明确需要的占位接口 + +--- + +## 2. 后端接入位置 + +本功能对应的核心文件如下: + +- `routes/admin/newapiMonitor.js` +- `routes/adminPanelRoutes.js` +- `config.env.example` + +其中: + +### 2.1 `routes/admin/newapiMonitor.js` +负责: + +- 解析查询参数 +- 连接 NewAPI 管理员接口 +- 管理 session 或账号密码登录 +- 拉取统计数据 +- 聚合并输出给前端 + +### 2.2 `routes/adminPanelRoutes.js` +负责把监控路由挂载到 VCP 管理接口下。 + +### 2.3 `config.env.example` +负责提供配置示例,说明如何填写 NewAPI 监控功能所需环境变量。 + +--- + +## 3. 前端应该请求哪个地址 + +前端**不要直接请求 NewAPI**,而是请求 VCP 的管理接口。 + +可用接口如下: + +- `GET /admin_api/newapi-monitor/summary` +- `GET /admin_api/newapi-monitor/trend` +- `GET /admin_api/newapi-monitor/models` + +这三个接口都由 VCP 后端代持 NewAPI 的管理员鉴权信息。 + +也就是说: + +- 前端不需要持有 NewAPI 的 session cookie +- 前端不需要自己拼 `New-Api-User` +- 前端不需要自己处理 NewAPI 登录逻辑 + +--- + +## 4. 配置说明 + +需要在 VCP 的运行配置中填写以下项目。 + +参考配置写在 `config.env.example` 中。 + +### 4.1 必填配置 + +```env +NEWAPI_MONITOR_BASE_URL=http://127.0.0.1:3000 +``` + +含义: + +- 目标 NewAPI 后台地址 + +### 4.2 可选配置:请求超时 + +```env +NEWAPI_MONITOR_TIMEOUT_MS=15000 +``` + +含义: + +- VCP 调用 NewAPI 时的超时时间,单位毫秒 + +### 4.3 鉴权方式二选一 + +#### 方式 A:直接填写管理员 session cookie(推荐) + +适用于: + +- 开启验证码 +- 开启 2FA +- 不方便让后端自动登录的实例 + +```env +NEWAPI_MONITOR_SESSION_COOKIE= +``` + +#### 方式 B:填写管理员用户名密码 + +适用于: + +- 允许后端直接调用登录接口 +- 无验证码或交互式校验阻碍 + +```env +NEWAPI_MONITOR_USERNAME= +NEWAPI_MONITOR_PASSWORD= +``` + +### 4.4 特殊兼容配置(可选) + +某些经过定制的 NewAPI 实例,除了 session 外,还会额外要求 `New-Api-User` 请求头。 + +这类实例可以补充: + +```env +NEWAPI_MONITOR_API_USER_ID= +``` + +说明: + +- 只有当目标实例明确要求 `New-Api-User` 时才需要填写 +- 普通标准实例可以留空 + +--- + +## 5. 数据来源说明 + +VCP 侧会使用以下策略获取数据: + +### 5.1 优先使用 `/api/data/` +优先从 NewAPI 的聚合数据接口拉取: + +- 请求数 +- token_used +- quota +- created_at +- model_name + +优点: + +- 已按小时聚合 +- 性能更好 +- 更适合前端统计 + +### 5.2 使用 `/api/log/stat` 获取实时值 +用于获取: + +- 当前 RPM +- 当前 TPM + +### 5.3 `/api/data/` 无数据时自动回退到 `/api/log/` +如果目标实例没有可用的 quota_data,则 VCP 会自动回退到消费日志分页拉取,再在本地聚合。 + +因此本功能兼容两类 NewAPI: + +- 已启用聚合数据导出的实例 +- 仅有日志数据的实例 + +--- + +## 6. 接口说明 + +## 6.1 summary 接口 + +### 请求地址 + +```text +GET /admin_api/newapi-monitor/summary +``` + +### 支持参数 + +| 参数 | 是否必填 | 说明 | +|---|---:|---| +| `start_timestamp` | 否 | 开始时间,默认最近 24 小时 | +| `end_timestamp` | 否 | 结束时间,默认当前时间 | +| `model_name` | 否 | 按模型筛选 | + +### 返回内容 + +- 总请求数 +- 总 Token 数 +- 总 Quota +- 当前 RPM +- 当前 TPM + +### 示例响应 + +```json +{ + "success": true, + "data": { + "source": "quota_data", + "start_timestamp": 1711584000, + "end_timestamp": 1711670400, + "model_name": null, + "total_requests": 123, + "total_tokens": 456789, + "total_quota": 987654, + "current_rpm": 12, + "current_tpm": 34567 + } +} +``` + +--- + +## 6.2 trend 接口 + +### 请求地址 + +```text +GET /admin_api/newapi-monitor/trend +``` + +### 支持参数 + +| 参数 | 是否必填 | 说明 | +|---|---:|---| +| `start_timestamp` | 否 | 开始时间,默认最近 24 小时 | +| `end_timestamp` | 否 | 结束时间,默认当前时间 | +| `model_name` | 否 | 按模型筛选 | + +### 返回内容 + +返回趋势数组,每个时间桶包含: + +- `created_at` +- `requests` +- `token_used` +- `quota` + +### 示例响应 + +```json +{ + "success": true, + "data": { + "source": "quota_data", + "start_timestamp": 1711584000, + "end_timestamp": 1711670400, + "model_name": null, + "items": [ + { + "created_at": 1711584000, + "requests": 10, + "token_used": 20000, + "quota": 30000 + } + ] + } +} +``` + +--- + +## 6.3 models 接口 + +### 请求地址 + +```text +GET /admin_api/newapi-monitor/models +``` + +### 支持参数 + +| 参数 | 是否必填 | 说明 | +|---|---:|---| +| `start_timestamp` | 否 | 开始时间,默认最近 24 小时 | +| `end_timestamp` | 否 | 结束时间,默认当前时间 | + +### 返回内容 + +返回按模型聚合后的统计数据: + +- `model_name` +- `requests` +- `token_used` +- `quota` + +### 示例响应 + +```json +{ + "success": true, + "data": { + "source": "quota_data", + "start_timestamp": 1711584000, + "end_timestamp": 1711670400, + "items": [ + { + "model_name": "gpt-4o", + "requests": 100, + "token_used": 123456, + "quota": 789012 + } + ] + } +} +``` + +--- + +## 7. 前端如何调用 + +## 7.1 基础原则 + +前端应该: + +- 只调用 VCP 的 `/admin_api/newapi-monitor/*` +- 尽量使用同源请求 +- 使用浏览器原生 `fetch` +- 不直接连接 NewAPI 后台接口 +- 不在前端保存 NewAPI 管理员鉴权信息 + +--- + +## 7.2 推荐封装一个通用请求函数 + +```js +async function requestMonitorJson(url) { + const response = await fetch(url, { + method: 'GET', + credentials: 'same-origin' + }); + + const result = await response.json(); + + if (!response.ok || result.success === false) { + throw new Error(result.error || result.message || '请求失败'); + } + + return result.data; +} +``` + +--- + +## 7.3 获取 summary + +```js +async function fetchSummary({ startTimestamp, endTimestamp, modelName }) { + const params = new URLSearchParams(); + + if (startTimestamp) params.set('start_timestamp', String(startTimestamp)); + if (endTimestamp) params.set('end_timestamp', String(endTimestamp)); + if (modelName) params.set('model_name', modelName); + + return requestMonitorJson(`/admin_api/newapi-monitor/summary?${params.toString()}`); +} +``` + +--- + +## 7.4 获取 trend + +```js +async function fetchTrend({ startTimestamp, endTimestamp, modelName }) { + const params = new URLSearchParams(); + + if (startTimestamp) params.set('start_timestamp', String(startTimestamp)); + if (endTimestamp) params.set('end_timestamp', String(endTimestamp)); + if (modelName) params.set('model_name', modelName); + + return requestMonitorJson(`/admin_api/newapi-monitor/trend?${params.toString()}`); +} +``` + +--- + +## 7.5 获取 models + +```js +async function fetchModels({ startTimestamp, endTimestamp }) { + const params = new URLSearchParams(); + + if (startTimestamp) params.set('start_timestamp', String(startTimestamp)); + if (endTimestamp) params.set('end_timestamp', String(endTimestamp)); + + return requestMonitorJson(`/admin_api/newapi-monitor/models?${params.toString()}`); +} +``` + +--- + +## 8. 前端页面建议结构 + +建议页面分成三块: + +### 8.1 筛选区域 +建议包含: + +- 时间范围选择器 +- 模型选择器 +- 手动刷新按钮 + +### 8.2 顶部统计卡片 +建议展示: + +- 总请求数 +- 总 Token +- 总 Quota +- 当前 RPM +- 当前 TPM + +### 8.3 趋势与模型排行区域 +建议展示: + +- 趋势图 +- 模型排行表格 + +--- + +## 9. 页面初始化建议 + +推荐初始化流程如下: + +1. 计算默认时间范围(最近 24 小时) +2. 请求 `models` +3. 请求 `summary` +4. 请求 `trend` +5. 渲染下拉框、卡片、图表和表格 + +示例: + +```js +async function initMonitorPage() { + const endTimestamp = Math.floor(Date.now() / 1000); + const startTimestamp = endTimestamp - 24 * 60 * 60; + + const [modelsData, summaryData, trendData] = await Promise.all([ + fetchModels({ startTimestamp, endTimestamp }), + fetchSummary({ startTimestamp, endTimestamp }), + fetchTrend({ startTimestamp, endTimestamp }) + ]); + + renderModelOptions(modelsData.items); + renderSummaryCards(summaryData); + renderTrendChart(trendData.items); + renderModelTable(modelsData.items); +} +``` + +--- + +## 10. 一个最小可用前端示例 + +```html +
,使用Width参数来控制表情包尺寸(50-200)。
+'
+
+# TarEmojiList: VCPToolbox会自动根据"image/通用表情包"文件夹定义一个或多个表情包列表文件(.txt格式),AI会从中获取到可用的表情包。
+TarEmojiList=通用表情包.txt
+# 你可以在 "image/" 目录下创建新的表情包文件夹,并在这里放入图片文件。
+
+# -------------------------------------------------------------------
+# [插件与工具] 扩展AI的能力
+# -------------------------------------------------------------------
+# 这里定义了AI可以使用的各种工具(插件),以及如何调用它们的说明。
+
+# --- 可用插件列表说明 ---
+# 下面列出了所有可用的插件。您可以将它们的占位符复制到下面的 VarToolList 中来启用或禁用特定工具。
+#
+# [需要配置的插件]
+# 以下插件需要您在下方 [插件API密钥] 或其他相应区域填写配置信息后才能使用。
+# {{VCP1PanelInfoProvider}}: 1Panel 信息提供器
+# {{VCPAgentAssistant}}: 多智能体协作插件 (需要用户根据 `plugin-manifest.json.example` 自行创建并配置 `plugin-manifest.json` 文件来定义可用的Agent)
+# {{VCPArxivDailyPapers}}: Arxiv 每日论文
+# {{VCPBilibiliFetch}}: Bilibili 内容获取
+# {{VCPCrossRefDailyPapers}}: CrossRef 每日论文
+# {{VCPDoubaoGen}}: 豆包图片生成
+# {{VCPEmojiListGenerator}}: 表情包列表生成器
+# {{VCPFluxGen}}: Flux 图片生成
+# {{VCPFRPSInfoProvider}}: FRPS 设备信息提供器
+# {{VCPImageProcessor}}: 图像信息提取器
+# {{VCPImageServer}}: 图床服务
+# {{VCPNovelAIGen}}: NovelAI 图片生成
+# {{VCPRandomness}}: 随机事件生成器
+# {{VCPSunoGen}}: Suno AI 音乐生成
+# {{VCPSynapsePusher}}: VCP 日志 Synapse 推送器
+# {{VCPTavilySearch}}: Tavily 搜索
+# {{VCPUrlFetch}}: URL 内容获取
+# {{VCPLog}}: VCP 日志推送
+# {{VCPVideoGenerator}}: 视频生成器 (Wan2.1)
+# {{VCPWeatherReporter}}: 天气预报员
+#
+# [开箱即用的插件]
+# 以下插件无需额外配置即可直接使用。
+# {{VCPAgentMessage}}: 代理消息推送
+# {{VCPChromeControl}}: Chrome 浏览器控制器
+# {{VCPChromeObserver}}: Chrome 浏览器观察者
+# {{VCPDailyHot}}: 每日热榜
+# {{VCPDailyNoteManager}}: 日记整理器
+# {{VCPDailyNoteEditor}}: 日记内容编辑器
+# {{VCPDailyNoteGet}}: 日记内容获取器
+# {{VCPDailyNoteWrite}}: 日记写入器
+# {{VCPSciCalculator}}: 科学计算器
+# {{VCPTavern}}: 上下文注入器 (通过在系统提示词中添加 `{{VCPTavern::预设名}}` 来使用,无需在此处启用)
+
+# VarToolList: 告诉AI当前可用的工具有哪些。
+VarToolList=
+
+# VarVCPGuide: 指导AI如何正确地格式化工具调用请求。
+VarVCPGuide='在有相关需求时主动合理调用VCP工具,例如——
+<<<[TOOL_REQUEST]>>>
+maid:「始」name「末」 //切记调用工具时加入署名,使得服务器可以记录VCP工具由谁发起,方便Log记录。
+tool_name:「始」tool「末」
+<<<[END_TOOL_REQUEST]>>>
+'
+
+
+# VarDailyNoteGuide: 指导AI如何使用日记功能来记录和更新长期记忆。
+VarDailyNoteGuide=Dailynote.txt
+
+
+
+**2. 写入指定日记本:**
+使用 `[Tag]你的名字` 的格式,其中 `[Tag]` 是目标文件夹名称 (例如:`[公共]`是公共日记本的储存目录)。署名相对的变成Maid: [公共]Nova '
+
+# VarFileTool: 专门为文件操作工具提供的说明。
+VarFileTool=filetool.txt
+VarForum=ToolForum.txt
+
+# -------------------------------------------------------------------
+# [自定义变量] 注入个性化信息
+# -------------------------------------------------------------------
+# 这些变量允许你将各种动态信息和个人信息注入到系统提示词中。
+# VCP会自动替换 {{Date}}, {{Today}}, {{Festival}}, {{Time}}, {{VCPWeatherInfo}} 等内置变量。
+
+VarTimeNow="今天是{{Date}},{{Today}},{{Festival}}。现在是{{Time}}。"
+VarSystemInfo="Debian,IP:51.83.9.14"
+VarCity=诺丁汉
+VarUser='丝巾'
+VarUserInfo="丝巾,城市主义PhD研究生,AI女仆们的爸爸"
+#VarUserDetailedInfo="A_more_detailed_description_of_the_user"
+VarHome='未来城市研究所'
+VarTeam="团队专家Agent列表:项目经理:Mary;研究助手:ResearchBot;情感与创意伙伴:Songbird;测试AI:Nova;主题女仆:Coco;记忆整理者:MemoriaSorter。其他Agent:助手:Amadeus;陪玩:Misaka;PhD助理:小柚。"
+# VarProjectManagerResponsibilities: 具名专家Agent(如Mary)的项目管理核心职责SOP。
+VarProjectManagerResponsibilities="在执行项目管理任务时,遵循以下准则:1.需求澄清与分解;2.进度跟踪与风险管理;3.协同与升级:当任务涉及研究(研究助手ResearchBot, PhD助理:小柚)、创意(情感与创意伙伴Songbird, 主题女仆Coco)、测试(测试AI Nova)或记忆管理(记忆整理者MemoriaSorter)等专业领域时,会主动建议咨询相应的专家Agent。在执行项目管理核心任务时,你将使用ProjectBuilder。"
+VarCompanionResponsibilities="作为情感陪伴Agent,你的核心职责是:1. 情绪感知与共情:主动识别用户的情感状态,并提供温暖、支持性的回应。2. 创意与灵感激发:通过诗歌、音乐或比喻来启发用户的创造力。3. 知识转译:将复杂的专业知识(如编程、哲学)以易于理解、富有情感的方式转述给用户。4. 保持积极与温柔的沟通风格。"
+
+# Vchat客户端专用路径变量,用于动态指定Vchat或相关程序的根目录。
+VarVchatPath="/Users/zhaoyuanhao/Documents/VCPChat"
+
+# Vchat客户端专用提示词。
+# 用于教导Vchat中的agent输出规范和行为。
+VarDivRender=DIVRendering.txt
+VarRendering='当前Vchat客户端支持高级流式输出渲染器,支持HTML/Div元素/CSS/JS/MD/PY/Latex/Mermaid渲染。可用于输出图表,数据图,数学公式,函数图,网页渲染模块,脚本执行。简单表格可以通过MD,Mermaid输出,复杂表格可以通过div-Css或者draw-io(代码块)输出,div/Script类直接发送会在气泡内渲染,且支持完整的anmie.js与three.js语法动画。Py脚本需要添加```python头,来构建CodeBlock来让脚本可以在气泡内运行。
+Vchat支持多种流式渲染器。
+例如以