版本: VCP 6.4
生成日期: 2026-02-13
适用提交: d09c49f
目录
- 功能总览
- HTTP API 功能
- 插件执行功能
- WebSocket 通信功能
- RAG 检索功能
- 管理面板功能
- 分布式工具功能
- 功能依赖关系图
- 常见功能组合场景
┌─────────────────────────────────────────────────────────────────────────────┐
│ VCPToolBox 功能矩阵 │
├──────────────┬──────────────┬──────────────┬──────────────┬────────────────┤
│ HTTP API │ 插件执行 │ WebSocket │ RAG 检索 │ 管理面板 │
│ 对话/模型 │ 6种类型 │ 6种客户端 │ TagMemo V5 │ 系统配置 │
├──────────────┴──────────────┴──────────────┴──────────────┴────────────────┤
│ 分布式工具执行层 │
│ (透明代理 / 远程文件 / 跨节点调度) │
└─────────────────────────────────────────────────────────────────────────────┘
| 功能分类 | 子功能数 | 核心入口文件 | 主要配置文件 |
|---|
| HTTP API | 12 | server.js | config.env |
| 插件执行 | 6 种类型 | Plugin.js | plugin-manifest.json |
| WebSocket | 6 种客户端 | WebSocketServer.js | config.env |
| RAG 检索 | 8 | KnowledgeBaseManager.js | rag_params.json |
| 管理面板 | 15+ | routes/adminPanelRoutes.js | config.env |
| 分布式工具 | 5 | WebSocketServer.js + Plugin.js | config.env |
| 属性 | 说明 |
|---|
| 功能描述 | 核心 AI 对话接口,兼容 OpenAI API 格式,支持 VCP 工具调用循环 |
| 入口文件 | server.js |
| 入口函数 | app.post('/v1/chat/completions', ...) (行 788-813) |
| 触发条件 | HTTP POST 请求到 /v1/chat/completions,携带 Bearer Token |
| 处理流程 | 1. Bearer Token 认证 → 2. 模型重定向检查 → 3. 消息预处理器链执行 → 4. 插件占位符替换 → 5. VCP 工具调用循环 → 6. 流式/非流式响应 |
| 相关配置 | Key, ApiRetries, MaxVCPLoopStream, MaxVCPLoopNonStream |
| 输出格式 | 流式 SSE 或非流式 JSON,兼容 OpenAI 格式 |
| 限制条件 | 最多 MaxVCPLoop* 次工具调用循环;Bearer Token 必须有效 |
请求示例:
{
"model": "gpt-4",
"messages": [{"role": "user", "content": "Hello"}],
"stream": true
}
响应示例(非流式):
{
"id": "chatcmpl-xxx",
"object": "chat.completion",
"choices": [{"message": {"role": "assistant", "content": "Hi!"}}]
}
| 属性 | 说明 |
|---|
| 功能描述 | 获取可用模型列表,透传后端 API |
| 入口文件 | server.js |
| 入口函数 | app.get('/v1/models', ...) |
| 触发条件 | HTTP GET 请求到 /v1/models |
| 处理流程 | 1. Bearer Token 认证 → 2. 透传后端 API → 3. 模型名称重定向(可选) |
| 相关配置 | Key, ModelRedirect.json |
| 输出格式 | JSON 模型列表 |
| 限制条件 | 无特殊限制 |
| 属性 | 说明 |
|---|
| 功能描述 | 紧急停止正在进行的对话请求 |
| 入口文件 | server.js |
| 入口函数 | app.post('/v1/interrupt', ...) (行 636-745) |
| 触发条件 | HTTP POST 请求到 /v1/interrupt |
| 处理流程 | 1. 解析 requestId → 2. 查找 activeRequests Map → 3. 设置 aborted 标志 → 4. 调用 AbortController.abort() |
| 相关配置 | 无 |
| 输出格式 | JSON 状态消息 |
| 限制条件 | requestId 必须存在于 activeRequests |
| 属性 | 说明 |
|---|
| 功能描述 | 允许人类用户直接调用 VCP 工具,绕过 AI 对话 |
| 入口文件 | server.js |
| 入口函数 | app.post('/v1/human/tool', ...) |
| 触发条件 | HTTP POST 请求到 /v1/human/tool,请求体为 VCP 指令文本 |
| 处理流程 | 1. 解析 VCP 指令 → 2. 调用 pluginManager.processToolCall() → 3. 返回执行结果 |
| 相关配置 | Key |
| 输出格式 | JSON 结果对象 |
| 限制条件 | 指令格式必须符合 VCP 协议 |
请求示例:
<<<[TOOL_REQUEST]>>>
tool_name:「始」VCPFluxGen「末」,
prompt:「始」一只猫「末」
<<<[END_TOOL_REQUEST]>>>
| 属性 | 说明 |
|---|
| 功能描述 | 创建定时任务,在指定时间执行工具调用 |
| 入口文件 | server.js |
| 入口函数 | app.post('/v1/schedule_task', ...) |
| 触发条件 | HTTP POST 请求到 /v1/schedule_task |
| 处理流程 | 1. 解析 schedule_time 和 tool_call → 2. 创建定时任务 → 3. 到期后自动执行工具 |
| 相关配置 | 无 |
| 输出格式 | JSON 任务确认 |
| 限制条件 | schedule_time 必须是有效的 ISO 8601 格式 |
| 属性 | 说明 |
|---|
| 功能描述 | 异步插件任务完成后的回调端点 |
| 入口文件 | server.js |
| 入口函数 | app.post('/plugin-callback/:pluginName/:taskId', ...) |
| 触发条件 | 异步插件 POST 请求到 /plugin-callback/:pluginName/:taskId |
| 处理流程 | 1. 解析路径参数 → 2. 查找待处理回调 → 3. 注入结果到对话历史 → 4. 触发 AI 重新响应 |
| 相关配置 | CALLBACK_BASE_URL |
| 输出格式 | JSON 确认消息 |
| 限制条件 | taskId 必须存在;无认证要求 |
| 属性 | 说明 |
|---|
| 功能描述 | 白名单模型绕过 VCP 处理,直接透传到后端 |
| 入口文件 | routes/specialModelRouter.js |
| 入口函数 | router.post('/v1/chat/completions', ...) |
| 触发条件 | 请求模型名匹配 WhitelistImageModel 或 WhitelistEmbeddingModel |
| 处理流程 | 1. 检查模型白名单 → 2. 匹配则直接透传 → 3. 图像模型自动添加 generationConfig |
| 相关配置 | WhitelistImageModel, WhitelistEmbeddingModel |
| 输出格式 | 透传后端响应 |
| 限制条件 | 仅对白名单模型生效 |
| 属性 | 说明 |
|---|
| 功能描述 | 周期性生成静态数据,通过占位符注入系统提示词 |
| 入口文件 | Plugin.js |
| 入口函数 | _updateStaticPluginValue(), initializeStaticPlugins() (行 116-258) |
| 触发条件 | 1. 系统启动时首次执行 2. 按 refreshIntervalCron 周期调度 |
| 处理流程 | 1. 解析 cron 表达式 → 2. spawn 子进程执行脚本 → 3. 收集 stdout 输出 → 4. 更新 staticPlaceholderValues Map |
| 相关配置 | refreshIntervalCron, communication.timeout (默认 60s) |
| 输出格式 | 存储为占位符值,通过 {{PlaceholderName}} 访问 |
| 限制条件 | 超时不视为错误;输出非 JSON 时作为纯文本处理 |
Manifest 示例:
{
"pluginType": "static",
"refreshIntervalCron": "*/5 * * * *",
"capabilities": {
"systemPromptPlaceholders": [
{ "placeholder": "{{VCPWeatherInfo}}", "description": "天气信息" }
]
}
}
| 属性 | 说明 |
|---|
| 功能描述 | 执行一次性工具任务,阻塞等待结果返回 |
| 入口文件 | Plugin.js |
| 入口函数 | executePlugin(), processToolCall() (行 805-918, 632-803) |
| 触发条件 | AI 输出包含 VCP 工具调用指令 |
| 处理流程 | 1. 解析 VCP 指令 → 2. 构建环境变量 → 3. spawn 子进程 → 4. 发送参数到 stdin → 5. 收集 stdout → 6. 解析 JSON 结果 |
| 相关配置 | communication.timeout (默认 60s), requiresAdmin |
| 输出格式 | 标准 JSON: { status, result/error, messageForAI?, base64? } |
| 限制条件 | 必须返回有效 JSON;超时自动终止进程 |
返回格式:
{
"status": "success",
"result": "执行结果内容",
"messageForAI": "可选,给 AI 的额外提示",
"base64": "可选,Base64 编码数据"
}
| 属性 | 说明 |
|---|
| 功能描述 | 执行长时间任务,立即返回任务 ID,完成后通过回调通知 |
| 入口文件 | Plugin.js |
| 入口函数 | executePlugin() (行 886-906) |
| 触发条件 | AI 输出包含 VCP 工具调用指令,且插件类型为 asynchronous |
| 处理流程 | 1. 立即返回初始响应(含 requestId)→ 2. 后台任务执行 → 3. 完成后 POST 到 /plugin-callback/:pluginName/:taskId |
| 相关配置 | communication.timeout (默认 30min), CALLBACK_BASE_URL |
| 输出格式 | 初始响应 + 回调响应 |
| 限制条件 | 必须在初始响应中返回 requestId;回调 URL 必须可达 |
初始响应:
{
"status": "success",
"result": { "requestId": "task_123", "message": "任务已提交" }
}
回调请求:
{
"requestId": "task_123",
"status": "Succeed",
"result": "最终结果"
}
| 属性 | 说明 |
|---|
| 功能描述 | 常驻内存服务,提供持续性功能(HTTP 路由、WebSocket 等) |
| 入口文件 | Plugin.js |
| 入口函数 | loadPlugins() 中的 direct 协议加载 (行 455-466) |
| 触发条件 | 系统启动时自动加载 |
| 处理流程 | 1. require 模块 → 2. 调用 initialize(config, dependencies) → 3. 可选调用 registerApiRoutes(router) |
| 相关配置 | configSchema, hasApiRoutes |
| 输出格式 | 服务常驻内存,无直接输出 |
| 限制条件 | 使用 direct 协议,不支持热加载 |
模块接口:
module.exports = {
async initialize(config, dependencies) { },
registerApiRoutes(router, config, projectBasePath, webSocketServer) { },
async shutdown() { }
};
| 属性 | 说明 |
|---|
| 功能描述 | 在消息发送给 LLM 前进行预处理(图像理解、格式转换等) |
| 入口文件 | Plugin.js, modules/chatCompletionHandler.js |
| 入口函数 | processMessages() (行 324-345), chatCompletionHandler.js:463-473 |
| 触发条件 | 每次对话请求时按顺序执行 |
| 处理流程 | 1. 按 preprocessor_order.json 顺序排列 → 2. 依次调用 processMessages(messages, config) → 3. 修改后的 messages 传递给下游 |
| 相关配置 | preprocessor_order.json, configSchema |
| 输出格式 | 修改后的 messages 数组 |
| 限制条件 | 执行顺序影响结果;单个预处理器异常会中断整个请求 |
| 属性 | 说明 |
|---|
| 功能描述 | 同时具备静态占位符、消息预处理和工具调用能力的综合型插件 |
| 入口文件 | Plugin.js |
| 入口函数 | 综合调用 processMessages(), processToolCall(), 占位符获取 |
| 触发条件 | 根据使用场景触发不同能力 |
| 处理流程 | 1. 启动时调用 initialize() → 2. 对话时调用 processMessages() → 3. 工具调用时调用 processToolCall() → 4. 占位符替换时获取缓存值 |
| 相关配置 | capabilities.systemPromptPlaceholders, capabilities.invocationCommands |
| 输出格式 | 根据调用类型返回不同格式 |
| 限制条件 | 最灵活但实现最复杂;使用 direct 协议 |
模块接口:
module.exports = {
async initialize(config, dependencies) { },
async processMessages(messages, config) { return messages; },
async processToolCall(args) { return { status, result }; },
async shutdown() { }
};
| 属性 | 说明 |
|---|
| 功能描述 | 普通日志客户端,接收服务器广播的日志消息 |
| 入口文件 | WebSocketServer.js |
| WebSocket 路径 | /VCPlog/VCP_Key=<key> |
| 触发条件 | 客户端发起 WebSocket 连接请求 |
| 处理流程 | 1. 正则匹配路径 → 2. 验证 VCP_Key → 3. 存储到 clients Map → 4. 发送 connection_ack |
| 相关配置 | VCP_Key |
| 输出格式 | JSON 消息: { type: 'connection_ack', message: '...' } |
| 限制条件 | VCP_Key 必须匹配 |
| 属性 | 说明 |
|---|
| 功能描述 | 信息通道客户端,接收系统状态、插件状态等推送 |
| 入口文件 | WebSocketServer.js |
| WebSocket 路径 | /vcpinfo/VCP_Key=<key> |
| 触发条件 | 客户端发起 WebSocket 连接请求 |
| 处理流程 | 同 VCPLog,使用 broadcastVCPInfo(data) 广播 |
| 相关配置 | VCP_Key |
| 输出格式 | JSON 系统状态消息 |
| 限制条件 | VCP_Key 必须匹配 |
| 属性 | 说明 |
|---|
| 功能描述 | 分布式服务器节点,注册远程工具并执行主服务器下发的工具调用 |
| 入口文件 | WebSocketServer.js |
| WebSocket 路径 | /vcp-distributed-server/VCP_Key=<key> |
| 触发条件 | VCPDistributedServer 连接主服务器 |
| 处理流程 | 1. 连接建立 → 2. 发送 register_tools → 3. 发送 report_ip → 4. 接收 execute_tool 请求 → 5. 执行本地插件 → 6. 返回 tool_result |
| 相关配置 | VCP_Key |
| 输出格式 | 工具执行结果 JSON |
| 限制条件 | 节点断开时自动注销所有工具 |
| 属性 | 说明 |
|---|
| 功能描述 | Chrome 浏览器扩展观察者端,持续上报页面状态 |
| 入口文件 | WebSocketServer.js |
| WebSocket 路径 | /vcp-chrome-observer/VCP_Key=<key> |
| 触发条件 | Chrome 扩展发起连接 |
| 处理流程 | 1. 连接建立 → 2. 存储到 chromeObserverClients → 3. 调用 ChromeBridge.handleNewClient() → 4. 持续接收 pageInfoUpdate |
| 相关配置 | VCP_Key |
| 输出格式 | 页面信息 Markdown |
| 限制条件 | 需要定期发送心跳 |
| 属性 | 说明 |
|---|
| 功能描述 | Chrome 浏览器扩展控制端,发送控制命令 |
| 入口文件 | WebSocketServer.js |
| WebSocket 路径 | /vcp-chrome-control/VCP_Key=<key> |
| 触发条件 | Chrome 扩展控制端发起连接 |
| 处理流程 | 1. 发送 command 消息 → 2. 服务器转发给 Observer → 3. 接收 command_result |
| 相关配置 | VCP_Key |
| 输出格式 | 命令执行结果 |
| 限制条件 | 需要有对应的 Observer 在线 |
| 属性 | 说明 |
|---|
| 功能描述 | Web 管理面板客户端,实时接收系统状态更新 |
| 入口文件 | WebSocketServer.js |
| WebSocket 路径 | /vcp-admin-panel/VCP_Key=<key> |
| 触发条件 | 管理面板页面加载 |
| 处理流程 | 1. 连接建立 → 2. 存储到 adminPanelClients → 3. 通过 broadcastToAdminPanel() 接收更新 |
| 相关配置 | VCP_Key, AdminUsername, AdminPassword |
| 输出格式 | JSON 状态更新 |
| 限制条件 | 需要先通过 Basic Auth 登录 |
| 属性 | 说明 |
|---|
| 功能描述 | 基于语义相似度检索日记本内容,每个日记本拥有独立索引 |
| 入口文件 | KnowledgeBaseManager.js |
| 入口函数 | search(), _getOrLoadDiaryIndex() (行 210-220, 446-621) |
| 触发条件 | 系统提示词中包含 [[日记本名::...]] 占位符 |
| 处理流程 | 1. 解析日记本名 → 2. 懒加载对应索引 → 3. 计算查询向量 → 4. TagMemo 算法处理 → 5. 返回相关 chunks |
| 相关配置 | VECTORDB_DIMENSION, KNOWLEDGEBASE_BATCH_WINDOW_MS |
| 输出格式 | 文本 chunks 列表 |
| 限制条件 | 向量维度必须与 Embedding 模型匹配;索引容量 50,000 |
| 属性 | 说明 |
|---|
| 功能描述 | 基于语义引力与向量重塑的高级 RAG 算法,包含 EPA 分析、残差金字塔、霰弹枪查询 |
| 入口文件 | KnowledgeBaseManager.js, EPAModule.js, ResidualPyramid.js |
| 入口函数 | search() 主流程 (行 446-621) |
| 触发条件 | RAG 检索时自动应用 |
| 处理流程 | 阶段一-感应: EPA 投影计算逻辑深度 → 阶段二-分解: 残差金字塔迭代 → 阶段三-扩张: 核心标签补全 + 关联词拉回 → 阶段四-重塑: 动态参数融合 + 语义去重 |
| 相关配置 | rag_params.json (activationMultiplier, dynamicBoostRange, coreBoostRange 等) |
| 输出格式 | 增强后的检索结果 |
| 限制条件 | 需要 Tag 向量索引已建立;核心标签有特权豁免 |
| 属性 | 说明 |
|---|
| 功能描述 | 通过加权 PCA 计算逻辑深度、世界观门控、跨域共振 |
| 入口文件 | modules/EPAModule.js |
| 入口函数 | project(), detectCrossDomainResonance() (行 71-201) |
| 触发条件 | TagMemo 算法感应阶段 |
| 处理流程 | 1. K-Means 聚类 Tag 向量 → 2. 加权 SVD 提取主成分 → 3. 计算投影熵 → 4. 输出逻辑深度 = 1 - 归一化熵 |
| 相关配置 | 聚类数 K, 收敛阈值 1e-4 |
| 输出格式 | { logicDepth, dominantAxes, resonance } |
| 限制条件 | 需要 Tag 向量数量 ≥ K |
| 属性 | 说明 |
|---|
| 功能描述 | 使用 Gram-Schmidt 正交化分解语义能量,捕捉微弱信号 |
| 入口文件 | modules/ResidualPyramid.js |
| 入口函数 | analyze(), _computeOrthogonalProjection() (行 25-210) |
| 触发条件 | TagMemo 算法分解阶段 |
| 处理流程 | 1. 搜索最近 Tags → 2. Gram-Schmidt 正交化 → 3. 计算残差 → 4. 迭代直到 90% 能量被解释 |
| 相关配置 | maxLevels, topK, minEnergyRatio |
| 输出格式 | { levels, totalExplainedEnergy, features: { coverage, novelty, coherence } } |
| 限制条件 | 最大迭代层数限制;能量阈值截断 |
| 属性 | 说明 |
|---|
| 功能描述 | 使用 SVD 主题建模和残差选择进行智能去重 |
| 入口文件 | modules/ResultDeduplicator.js |
| 入口函数 | deduplicate() (行 44-168) |
| 触发条件 | TagMemo 霰弹枪查询后 |
| 处理流程 | 1. SVD 提取候选结果主题 → 2. 保留 95% 累积能量主题 → 3. 残差选择:迭代选择能解释"未覆盖能量"的最佳结果 |
| 相关配置 | 去重阈值, 最大选择轮数 |
| 输出格式 | 去重后的候选列表 |
| 限制条件 | 候选数 ≤ 5 时不执行去重 |
| 属性 | 说明 |
|---|
| 功能描述 | 实时监听文件变更,自动更新向量索引 |
| 入口文件 | KnowledgeBaseManager.js |
| 入口函数 | _startWatcher(), _flushBatch() (行 880-1152) |
| 触发条件 | 文件创建/修改/删除 |
| 处理流程 | 1. chokidar 监听 → 2. 批处理窗口聚合 → 3. 文本分块 → 4. 批量 Embedding → 5. SQLite 事务写入 → 6. 更新 Vexus 索引 |
| 相关配置 | KNOWLEDGEBASE_BATCH_WINDOW_MS, KNOWLEDGEBASE_MAX_BATCH_SIZE |
| 输出格式 | 索引更新 |
| 限制条件 | 忽略规则检查;支持的文件类型: .md, .txt |
| 属性 | 说明 |
|---|
| 功能描述 | 构建 Tag 共现关系,用于关联词拉回 |
| 入口文件 | KnowledgeBaseManager.js |
| 入口函数 | _buildCooccurrenceMatrix() (行 1233-1258) |
| 触发条件 | 索引更新后异步重建 |
| 处理流程 | 1. 查询 file_tags 关联 → 2. 统计共现次数 → 3. 构建对称矩阵 |
| 相关配置 | 无 |
| 输出格式 | Map<tagId, Map<relatedTagId, weight>> |
| 限制条件 | 大量 Tag 时构建耗时 |
| 属性 | 说明 |
|---|
| 功能描述 | 支持运行时动态调整 RAG 参数,无需重启 |
| 入口文件 | KnowledgeBaseManager.js |
| 入口函数 | loadRagParams(), _startRagParamsWatcher() (行 140-164) |
| 触发条件 | rag_params.json 文件变更 |
| 处理流程 | 1. chokidar 监听文件 → 2. 检测变更 → 3. 重新加载参数 → 4. 应用到后续检索 |
| 相关配置 | rag_params.json |
| 输出格式 | 参数对象 |
| 限制条件 | JSON 格式必须有效 |
可调控参数:
| 参数名 | 默认值 | 说明 |
|---|
activationMultiplier | [0.5, 1.5] | TagMemo 激活乘数范围 |
dynamicBoostRange | [0.3, 2.0] | 动态增强范围 |
coreBoostRange | [1.20, 1.40] | 核心标签增强范围 |
deduplicationThreshold | 0.88 | 语义去重阈值 |
| 属性 | 说明 |
|---|
| 功能描述 | 实时监控 CPU、内存、PM2 进程状态 |
| 入口文件 | routes/adminPanelRoutes.js |
| API 端点 | GET /admin_api/system-monitor/pm2/processes, GET /admin_api/system-monitor/system/resources |
| 触发条件 | 管理面板访问系统监控页面 |
| 处理流程 | 1. 验证 Basic Auth → 2. 调用系统 API → 3. 返回监控数据 |
| 相关配置 | AdminUsername, AdminPassword |
| 输出格式 | JSON 进程/资源列表 |
| 限制条件 | 需要 PM2 运行;凭据未配置时返回 503 |
| 属性 | 说明 |
|---|
| 功能描述 | 在线预览和编辑 config.env |
| 入口文件 | routes/adminPanelRoutes.js |
| API 端点 | GET /admin_api/config/main, POST /admin_api/config/main |
| 触发条件 | 管理员编辑配置 |
| 处理流程 | 1. 读取/写入 config.env → 2. 自动隐藏敏感字段 → 3. 保存后需重启生效 |
| 相关配置 | config.env |
| 输出格式 | JSON 配置对象 |
| 限制条件 | 敏感字段(如 API Key)以 **** 显示 |
| 属性 | 说明 |
|---|
| 功能描述 | 集中管理所有已加载插件,支持启用/禁用、配置编辑 |
| 入口文件 | routes/adminPanelRoutes.js |
| API 端点 | GET /admin_api/plugins, POST /admin_api/plugins/:name/toggle |
| 触发条件 | 管理员操作插件 |
| 处理流程 | 1. 获取插件列表 → 2. 启用/禁用通过 .block 文件实现 → 3. 配置编辑写入 config.env |
| 相关配置 | plugin-manifest.json, config.env |
| 输出格式 | JSON 插件列表 |
| 限制条件 | direct 协议插件禁用后需重启 |
| 属性 | 说明 |
|---|
| 功能描述 | 浏览、搜索、编辑 dailynote/ 目录下的知识库文件 |
| 入口文件 | routes/adminPanelRoutes.js |
| API 端点 | GET /admin_api/knowledge-base/browse, GET/POST/DELETE /admin_api/knowledge-base/file |
| 触发条件 | 管理员管理知识库 |
| 处理流程 | 1. 遍历目录结构 → 2. 读取/写入文件 → 3. 更新触发索引重建 |
| 相关配置 | dailynote/ 目录 |
| 输出格式 | JSON 文件树/内容 |
| 限制条件 | 文件编码必须为 UTF-8 |
| 属性 | 说明 |
|---|
| 功能描述 | 管理与知识库文件关联的 RAG 标签 |
| 入口文件 | routes/adminPanelRoutes.js |
| API 端点 | GET /admin_api/knowledge-base/tags |
| 触发条件 | 管理员编辑文件标签 |
| 处理流程 | 1. 解析文件中的 Tag: 行 → 2. 显示已有标签 → 3. 编辑后更新文件 |
| 相关配置 | 无 |
| 输出格式 | JSON 标签列表 |
| 限制条件 | 标签格式必须符合规范 |
| 属性 | 说明 |
|---|
| 功能描述 | 管理 Agent/ 目录下的角色定义文件 |
| 入口文件 | routes/adminPanelRoutes.js |
| API 端点 | GET /admin_api/agent/files, GET/POST /admin_api/agent/file |
| 触发条件 | 管理员管理 Agent |
| 处理流程 | 1. 遍历 Agent 目录 → 2. 读取/写入角色定义 → 3. 更新 agent_map.json |
| 相关配置 | Agent/agent_map.json |
| 输出格式 | JSON Agent 列表/内容 |
| 限制条件 | Agent 文件必须包含有效的角色定义 |
| 属性 | 说明 |
|---|
| 功能描述 | 实时查看服务器日志,支持增量读取 |
| 入口文件 | routes/adminPanelRoutes.js |
| API 端点 | GET /admin_api/server-log, POST /admin_api/server-log/clear |
| 触发条件 | 管理员查看日志 |
| 处理流程 | 1. 读取日志文件 → 2. 增量模式返回新增内容 → 3. 清空模式重置日志 |
| 相关配置 | 日志文件路径 |
| 输出格式 | JSON { content, offset, fileSize } |
| 限制条件 | 大文件时自动截断 |
| 属性 | 说明 |
|---|
| 功能描述 | 通过拖拽方式调整消息预处理器执行顺序 |
| 入口文件 | routes/adminPanelRoutes.js |
| API 端点 | GET/POST /admin_api/preprocessors/order |
| 触发条件 | 管理员调整顺序 |
| 处理流程 | 1. 读取 preprocessor_order.json → 2. 更新顺序 → 3. 写回文件 |
| 相关配置 | preprocessor_order.json |
| 输出格式 | JSON 顺序数组 |
| 限制条件 | 必须包含所有已注册的预处理器 |
| 属性 | 说明 |
|---|
| 功能描述 | 分布式节点连接后自动注册其提供的工具 |
| 入口文件 | WebSocketServer.js, Plugin.js |
| 入口函数 | handleDistributedServerMessage() 中的 register_tools 分支 (行 407-416) |
| 触发条件 | 节点发送 register_tools 消息 |
| 处理流程 | 1. 过滤内部工具 → 2. 调用 pluginManager.registerDistributedTools() → 3. 添加 [云端] 前缀和 isDistributed: true 标记 |
| 相关配置 | VCP_Key |
| 输出格式 | 更新后的插件列表 |
| 限制条件 | 工具名不能与本地插件冲突 |
| 属性 | 说明 |
|---|
| 功能描述 | 节点上报 IP 信息,用于文件溯源 |
| 入口文件 | WebSocketServer.js |
| 入口函数 | handleDistributedServerMessage() 中的 report_ip 分支 (行 418-430) |
| 触发条件 | 节点发送 report_ip 消息 |
| 处理流程 | 1. 存储到 distributedServerIPs Map → 2. 建立服务器名称映射 |
| 相关配置 | 无 |
| 输出格式 | 内部存储 |
| 限制条件 | 无 |
| 属性 | 说明 |
|---|
| 功能描述 | 透明执行远程节点上的工具 |
| 入口文件 | Plugin.js, WebSocketServer.js |
| 入口函数 | processToolCall() 检测 isDistributed → executeDistributedTool() (行 467-509) |
| 触发条件 | AI 调用带有 isDistributed: true 标记的插件 |
| 处理流程 | 1. 检测分布式标记 → 2. 生成 requestId → 3. 发送 execute_tool 消息 → 4. 等待 tool_result 响应 → 5. 超时处理 |
| 相关配置 | communication.timeout |
| 输出格式 | 与本地工具相同 |
| 限制条件 | 节点必须在线;超时自动拒绝 |
| 属性 | 说明 |
|---|
| 功能描述 | 当本地文件不存在时,自动从来源节点获取 |
| 入口文件 | FileFetcherServer.js, Plugin.js |
| 入口函数 | fetchFile() (行 726-773) |
| 触发条件 | 插件执行时遇到 file:// URL 且本地文件不存在 |
| 处理流程 | 1. 检查本地缓存 → 2. 根据 IP 查找来源服务器 → 3. 调用 internal_request_file → 4. 返回 Base64 数据 → 5. 重试插件执行 |
| 相关配置 | 缓存目录 .file_cache/ |
| 输出格式 | { buffer, mimeType } |
| 限制条件 | 循环请求检测;失败缓存 30 秒 |
| 属性 | 说明 |
|---|
| 功能描述 | 分布式节点可以推送静态占位符更新 |
| 入口文件 | WebSocketServer.js |
| 入口函数 | handleDistributedServerMessage() 中的 update_static_placeholders 分支 |
| 触发条件 | 节点发送 update_static_placeholders 消息 |
| 处理流程 | 1. 接收占位符数据 → 2. 更新 staticPlaceholderValues Map |
| 相关配置 | 无 |
| 输出格式 | 内部存储 |
| 限制条件 | 占位符名不能与本地冲突 |
┌─────────────────────────────────────┐
│ HTTP 请求 │
│ (POST /v1/chat/completions) │
└──────────────────┬──────────────────┘
│
┌──────────────────▼──────────────────┐
│ Bearer Token 认证 │
│ (server.js:466-493) │
└──────────────────┬──────────────────┘
│
┌──────────────────────────────┼──────────────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 模型重定向 │ │ 特殊模型检查 │ │ 对话处理 │
│ (config) │ │ (whitelist) │ │ ChatCompletion │
└───────────────┘ └─────────────────┘ │ Handler │
└────────┬────────┘
│
┌──────────────────────────────────────────────────┤
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ 消息预处理器链 │ │ 变量替换管线 │
│ (messagePreprocessor)│ │ (messageProcessor) │
│ - ImageProcessor │ │ - Agent 展开 │
│ - RAGDiaryPlugin │ │ - 占位符替换 │
│ - VCPTavern │ │ - 静态插件注入 │
└──────────┬──────────┘ └──────────┬──────────┘
│ │
└───────────────────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ 调用上游 AI API │
│ (fetchWithRetry) │
└──────────────────┬──────────────────┘
│
▼
┌─────────────────────────────────────┐
│ VCP 工具调用检测 │
│ (<<<[TOOL_REQUEST]>>>) │
└──────────────────┬──────────────────┘
│
┌──────────────────┼──────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 本地插件 │ │ 混合插件 │ │ 分布式插件 │
│ (stdio) │ │ (direct) │ │ (WebSocket) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
│ │ ▼
│ │ ┌─────────────────┐
│ │ │ executeDistrib │
│ │ │ utedTool() │
│ │ └────────┬────────┘
│ │ │
└──────────────────┴───────────────────┘
│
▼
┌─────────────────────────────────────┐
│ 工具结果注入对话历史 │
│ 递归调用 AI(如需要) │
└─────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ KnowledgeBaseManager │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 文件监听 (chokidar) │ │
│ └─────────────────────────────┬───────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 批处理管道 (_flushBatch) │ │
│ │ 1. 文本分块 (TextChunker) │ │
│ │ 2. 标签提取 (_extractTags) │ │
│ │ 3. 批量 Embedding (EmbeddingUtils) │ │
│ │ 4. SQLite 事务写入 │ │
│ │ 5. Vexus 索引更新 │ │
│ └─────────────────────────────┬───────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ diaryIndices │ │ tagIndex │ │ SQLite (chunks/tags) │ │
│ │ (多索引) │ │ (全局) │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 检索时 (search) │
│ ┌─────────────┐ │
│ │ EPA Module │ ──► 逻辑深度 / 共振检测 / 世界观门控 │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ ResidualPyramid │ ──► 残差分解 / 能量解释 / 特征提取 │
│ └─────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ ResultDeduplicator │ ──► SVD 主题建模 / 残差选择 │
│ └──────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 动态参数融合 (effectiveTagBoost = baseTagBoost * factor) │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ VCP 主服务器 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ WebSocketServer │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │
│ │ │ clients │ │ distributed │ │ chromeObserver │ │ │
│ │ │ Map │ │ Servers Map │ │ Clients Map │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ FileFetcherServer │ │
│ │ - findServerByIp(): IP → serverId 映射 │ │
│ │ - fetchFile(): 跨节点文件获取 + 缓存 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ PluginManager │ │
│ │ - registerDistributedTools(): 注册远程工具 │ │
│ │ - processToolCall(): isDistributed 检测与路由 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
┌───────────┼───────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 分布式节点 │ │ 分布式节点 │ │ Chrome 扩展 │
│ (GPU) │ │ (File) │ │ (Observer) │
│ │ │ │ │ │
│ - 本地插件 │ │ - 文件服务 │ │ - 页面监听 │
│ - 执行结果 │ │ - 文件传输 │ │ - 命令执行 │
└─────────────┘ └─────────────┘ └─────────────┘
场景描述: 用户询问需要联网搜索且涉及历史记忆的问题
功能组合:
HTTP API (/v1/chat/completions)
│
├── 消息预处理器链
│ ├── ImageProcessor (处理图像)
│ └── RAGDiaryPlugin (TagMemo 检索记忆)
│
├── 变量替换
│ └── [[日记本::Time::Group::TagMemo]] (记忆注入)
│
├── AI 响应 (含工具调用)
│ └── <<<[TOOL_REQUEST]>>> VSearch ...
│
└── 工具执行
└── VSearch (同步插件,联网搜索)
关键配置:
MaxVCPLoopStream: 控制最大工具调用轮数
rag_params.json: 调整记忆检索参数
- VSearch 插件的
config.env: 搜索 API 配置
场景描述: AI 生成视频,任务分发到 GPU 服务器节点
功能组合:
HTTP API (/v1/chat/completions)
│
├── AI 响应 (含工具调用)
│ └── <<<[TOOL_REQUEST]>>> VideoGenerator ...
│
├── 工具执行 (Plugin.js 检测 isDistributed)
│ └── WebSocketServer.executeDistributedTool()
│ │
│ ├── 发送 execute_tool 到 GPU 节点
│ │
│ └── 节点返回 tool_result (异步)
│
└── 初始响应返回给用户
│
└── 后续回调注入对话历史
└── /plugin-callback/VideoGenerator/:taskId
关键配置:
- GPU 节点
config.env: Main_Server_URL, VCP_Key
- VideoGenerator 插件:
pluginType: "asynchronous", timeout: 1800000
场景描述: AI 需要处理存储在另一台服务器上的文件
功能组合:
HTTP API (/v1/chat/completions)
│
├── AI 响应 (含工具调用)
│ └── <<<[TOOL_REQUEST]>>> ImageEditor image_url:「始」file:///path/to/image.jpg「末」
│
├── 工具执行
│ └── 本地插件尝试读取文件
│ └── FILE_NOT_FOUND_LOCALLY
│
├── FileFetcherServer.fetchFile()
│ ├── 根据 requestIp 查找来源服务器
│ ├── executeDistributedTool(serverId, 'internal_request_file', ...)
│ └── 返回 Base64 数据
│
└── 重试插件执行 (替换 file:// 为 data: URI)
关键配置:
- 所有节点配置相同的
VCP_Key
- 节点发送
report_ip 消息建立 IP 映射
场景描述: AI 控制用户的 Chrome 浏览器执行操作
功能组合:
HTTP API (/v1/chat/completions)
│
├── 占位符注入
│ └── {{VCPChromePageInfo}} (当前页面内容)
│
├── AI 响应 (含工具调用)
│ └── <<<[TOOL_REQUEST]>>> ChromeControl command:「始」click「末」selector:「始」#submit「末」
│
├── 工具执行 (ChromeBridge hybridservice)
│ │
│ ├── WebSocket 转发到 ChromeObserver
│ │ └── { type: 'command', data: { ... } }
│ │
│ └── Chrome 扩展执行命令
│ └── 返回 command_result
│
└── 可选: 等待 pageInfoUpdate (页面更新)
关键配置:
- Chrome 扩展连接到
/vcp-chrome-observer/VCP_Key=xxx
- ChromeBridge 插件:
pluginType: "hybridservice"
场景描述: 管理员通过面板监控系统,AI 自动处理告警
功能组合:
AdminPanel WebSocket
│
├── 实时推送
│ └── broadcastToAdminPanel({ type: 'system_alert', ... })
│
Admin API
│
├── GET /admin_api/system-monitor/system/resources
│ └── 返回 CPU/内存使用率
│
└── GET /admin_api/server-log?incremental=true
└── 增量读取日志
│
└── AI 检测异常模式
└── <<<[TOOL_REQUEST]>>> PowerShellExecutor ...
关键配置:
AdminUsername, AdminPassword: 面板认证
- PowerShellExecutor 插件:
requiresAdmin: true
场景描述: AI Agent 自主记录重要信息并持续学习
功能组合:
HTTP API (/v1/chat/completions)
│
├── AI 响应 (含日记写入指令)
│ └── <<<[TOOL_REQUEST]>>> DailyNoteWrite content:「始」今天学习了...「末」
│
├── 工具执行 (DailyNoteWrite 同步插件)
│ └── 写入 dailynote/日记本/xxx.txt
│
└── 文件监听触发
└── KnowledgeBaseManager._startWatcher()
│
├── 文本分块 + Embedding
│
└── 更新向量索引
│
└── 后续对话自动检索相关记忆
关键配置:
dailynote/ 目录结构
KNOWLEDGEBASE_BATCH_WINDOW_MS: 批处理窗口
- Tag 提取规则:
Tag: xxx, yyy
场景描述: 复杂问题需要深度思考和知识检索
功能组合:
HTTP API (/v1/chat/completions)
│
├── 系统提示词
│ └── [[VCP元思考:creative_writing::Group]]
│ └── 触发元思考系统
│ │
│ ├── 词元组捕网 (Semantic Group)
│ │ └── 增强 Query 向量
│ │
│ └── 元逻辑模块库
│ └── 递归融合推理
│
├── 记忆检索 (TagMemo V5)
│ ├── EPA 分析意图聚焦度
│ ├── 残差金字塔分解语义
│ └── 霰弹枪查询 + 相控阵去重
│
└── AI 深度推理响应
关键配置:
- 元思考配置文件:
thinktheme/*.json
rag_params.json: TagMemo 参数
场景描述: 多个 AI Agent 协作完成复杂任务
功能组合:
Agent A (主控)
│
├── HTTP API (/v1/chat/completions)
│ └── AI 响应含任务分解
│
├── AgentAssistant 服务
│ ├── 发送任务给 Agent B
│ │ └── POST 到 Agent B 的 API
│ │
│ └── 接收 Agent B 的结果
│ └── 回调注入 Agent A 对话
│
Agent B (执行者)
│
├── 接收任务
│ └── HTTP API (/v1/chat/completions)
│
├── 执行工具
│ └── VSearch / FluxGen / ...
│
└── 返回结果给 Agent A
关键配置:
- AgentAssistant 插件配置
- VCP 论坛/任务版: Agent 间通信平台
附录
| 文件 | 用途 | 加载位置 |
|---|
config.env | 全局环境变量 | server.js:4 |
Plugin/*/config.env | 插件私有配置 | Plugin.js:442-446 |
Plugin/*/plugin-manifest.json | 插件清单 | Plugin.js:435 |
preprocessor_order.json | 预处理器顺序 | Plugin.js:484-496 |
rag_params.json | RAG 热调控参数 | KnowledgeBaseManager.js:140-149 |
ModelRedirect.json | 模型重定向 | modules/modelRedirectHandler.js |
ip_blacklist.json | IP 黑名单 | server.js:179-193 |
Agent/agent_map.json | Agent 别名映射 | modules/agentManager.js |
| 文件 | 职责 | 核心类/函数 |
|---|
server.js | HTTP 入口、启动编排 | initialize(), startServer() |
Plugin.js | 插件生命周期管理 | PluginManager 类 |
WebSocketServer.js | 分布式通信骨架 | initialize(), executeDistributedTool() |
KnowledgeBaseManager.js | 向量库与 RAG 总控 | KnowledgeBaseManager 类 |
chatCompletionHandler.js | 对话主流程编排 | ChatCompletionHandler 类 |
messageProcessor.js | 变量替换管线 | replaceAgentVariables() |
FileFetcherServer.js | 跨节点文件获取 | fetchFile() |
EPAModule.js | 语义空间分析 | EPAModule 类 |
ResidualPyramid.js | 残差金字塔 | ResidualPyramid 类 |
ResultDeduplicator.js | 结果去重 | ResultDeduplicator 类 |
# 服务配置
PORT=6005
Key=YOUR_KEY # Bearer Token 密钥
VCP_Key=YOUR_VCP_KEY # WebSocket 认证密钥
# Admin 认证
AdminUsername=admin
AdminPassword=123456
# API 配置
ApiRetries=3
ApiRetryDelay=200
MaxVCPLoopStream=5
MaxVCPLoopNonStream=5
# 特殊模型白名单
WhitelistImageModel=model1,model2
WhitelistEmbeddingModel=embed1,embed2
# 向量数据库
VECTORDB_DIMENSION=3072
KNOWLEDGEBASE_BATCH_WINDOW_MS=1000
KNOWLEDGEBASE_MAX_BATCH_SIZE=50
# 图片/文件服务密钥
Image_Key=YOUR_IMAGE_KEY
File_Key=YOUR_FILE_KEY
文档版本: 1.0.0
最后更新: 2026-02-13
维护者: VCP Team