xiaozhi-client 1.9.3 → 1.9.4-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/WebServerLauncher.js +2 -100
- package/dist/backend/WebServerLauncher.js +100 -0
- package/dist/backend/WebServerLauncher.js.map +1 -0
- package/dist/backend/cli.js +129 -0
- package/dist/backend/cli.js.map +1 -0
- package/dist/{package.json → backend/package.json} +21 -9
- package/dist/cli.js +2 -129
- package/dist/docs/404/index.html +19 -0
- package/dist/docs/404.html +19 -0
- package/dist/docs/_next/static/JZ0ESgtaHnsqkxSabOqqU/_buildManifest.js +1 -0
- package/dist/docs/_next/static/JZ0ESgtaHnsqkxSabOqqU/_ssgManifest.js +1 -0
- package/dist/docs/_next/static/chunks/112-c9cbd8401d35f825.js +4 -0
- package/dist/docs/_next/static/chunks/2a9bc5d7-4c434acf20ba934a.js +1 -0
- package/dist/docs/_next/static/chunks/782-c26ca6c69e488d48.js +1 -0
- package/dist/docs/_next/static/chunks/799-fe0d35806fd12012.js +1 -0
- package/dist/docs/_next/static/chunks/9b1cb2c3-cc9ed703e6aef1a2.js +1 -0
- package/dist/docs/_next/static/chunks/app/[[...mdxPath]]/page-48f5c8f3210e0a8a.js +1 -0
- package/dist/docs/_next/static/chunks/app/_not-found/page-2e38866a1cbb77e4.js +1 -0
- package/dist/docs/_next/static/chunks/app/layout-e8f420537fd59e8d.js +1 -0
- package/dist/docs/_next/static/chunks/framework-b73126dabbf07067.js +1 -0
- package/dist/docs/_next/static/chunks/main-75dc65850b89d90d.js +1 -0
- package/dist/docs/_next/static/chunks/main-app-3303134270964ce6.js +1 -0
- package/dist/docs/_next/static/chunks/pages/_app-e698a68d07c8993d.js +1 -0
- package/dist/docs/_next/static/chunks/pages/_error-189a41ab5833da03.js +1 -0
- package/dist/docs/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/docs/_next/static/chunks/webpack-10e2bf7d852ddb6e.js +1 -0
- package/dist/docs/_next/static/css/2d82b615fcca1590.css +1 -0
- package/dist/docs/_next/static/css/b03484a3c350cf6e.css +1 -0
- package/dist/docs/_next/static/css/b289318ef4b60b0a.css +1 -0
- package/dist/docs/changelog/index.html +585 -0
- package/dist/docs/changelog/index.txt +1079 -0
- package/dist/docs/images/coze-workflow/get-parameter.png +0 -0
- package/dist/docs/index.html +22 -0
- package/dist/docs/index.txt +41 -0
- package/dist/docs/quickstart/index.html +64 -0
- package/dist/docs/quickstart/index.txt +185 -0
- package/dist/docs/reference/command/index.html +20 -0
- package/dist/docs/reference/command/index.txt +42 -0
- package/dist/docs/usage/as-mcp/index.html +36 -0
- package/dist/docs/usage/as-mcp/index.txt +101 -0
- package/dist/docs/usage/coze-workflow/index.html +35 -0
- package/dist/docs/usage/coze-workflow/index.txt +120 -0
- package/dist/docs/usage/docker/index.html +40 -0
- package/dist/docs/usage/docker/index.txt +154 -0
- package/dist/docs/usage/modelscope/index.html +32 -0
- package/dist/docs/usage/modelscope/index.txt +109 -0
- package/dist/docs/usage/multi-endpoint/index.html +32 -0
- package/dist/docs/usage/multi-endpoint/index.txt +118 -0
- package/dist/frontend/assets/form-utils-h64o2Nyg.js.map +1 -0
- package/{apps/frontend/dist → dist/frontend}/assets/index-88NfCOo9.js.map +1 -1
- package/dist/frontend/assets/radix-ui-BA32w1ww.js.map +1 -0
- package/dist/frontend/assets/react-vendor-DrjkXih1.js.map +1 -0
- package/dist/frontend/assets/utils-CiPelQLP.js.map +1 -0
- package/dist/frontend/assets/vendor-DK9yaMt3.js.map +1 -0
- package/dist/shared-types/index.js +36 -0
- package/dist/shared-types/index.js.map +1 -0
- package/package.json +21 -9
- package/apps/frontend/README.md +0 -169
- package/apps/frontend/dist/assets/form-utils-h64o2Nyg.js.map +0 -1
- package/apps/frontend/dist/assets/radix-ui-BA32w1ww.js.map +0 -1
- package/apps/frontend/dist/assets/react-vendor-DrjkXih1.js.map +0 -1
- package/apps/frontend/dist/assets/utils-CiPelQLP.js.map +0 -1
- package/apps/frontend/dist/assets/vendor-DK9yaMt3.js.map +0 -1
- package/dist/WebServerLauncher.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/docs/arch/cache.mdx +0 -885
- package/docs/changelog.mdx +0 -645
- package/docs/development/architecture.mdx +0 -71
- package/docs/development/docker-build.mdx +0 -256
- package/docs/development/todo__release-guide.md +0 -563
- package/docs/development/todo__setting-manager.md +0 -122
- package/docs/docs.json +0 -55
- package/docs/getting-started/install.mdx +0 -191
- package/docs/getting-started/intro.mdx +0 -11
- package/docs/getting-started/quickstart.mdx +0 -108
- package/docs/mcp-tool-calling.md +0 -363
- package/docs/python-dependencies.md +0 -216
- package/docs/reference/command.mdx +0 -15
- package/docs/usage/add-mcp-server.mdx +0 -6
- package/docs/usage/as-a-mcp-server.mdx +0 -76
- package/docs/usage/coze-workflow.mdx +0 -73
- package/docs/usage/docker.mdx +0 -99
- package/docs/usage/modelscope.mdx +0 -74
- package/docs/usage/use-multi-xiaozhi-mcp-endpoints.mdx +0 -77
- package/docs/usage/web-control.mdx +0 -6
- /package/dist/{WebServerLauncher.d.ts → backend/WebServerLauncher.d.ts} +0 -0
- /package/dist/{cli.d.ts → backend/cli.d.ts} +0 -0
- /package/dist/{templates → backend/templates}/default/mcpServers/calculator.js +0 -0
- /package/dist/{templates → backend/templates}/default/mcpServers/datetime.js +0 -0
- /package/dist/{templates → backend/templates}/default/package.json +0 -0
- /package/dist/{templates → backend/templates}/default/xiaozhi.config.json +0 -0
- /package/dist/{templates → backend/templates}/hello-world/mcpServers/calculator.js +0 -0
- /package/dist/{templates → backend/templates}/hello-world/mcpServers/datetime.js +0 -0
- /package/dist/{templates → backend/templates}/hello-world/package.json +0 -0
- /package/dist/{templates → backend/templates}/hello-world/xiaozhi.config.json +0 -0
- /package/dist/{templates → backend/templates}/json5/mcpServers/calculator.js +0 -0
- /package/dist/{templates → backend/templates}/json5/mcpServers/datetime.js +0 -0
- /package/dist/{templates → backend/templates}/json5/package.json +0 -0
- /package/dist/{templates → backend/templates}/json5/xiaozhi.config.json5 +0 -0
- /package/dist/{templates → backend/templates}/jsonc/mcpServers/calculator.js +0 -0
- /package/dist/{templates → backend/templates}/jsonc/mcpServers/datetime.js +0 -0
- /package/dist/{templates → backend/templates}/jsonc/package.json +0 -0
- /package/dist/{templates → backend/templates}/jsonc/xiaozhi.config.jsonc +0 -0
- /package/dist/{templates → backend/templates}/modelscope/xiaozhi.config.json +0 -0
- /package/{docs/images/coze-workflow/get-parameter.png → dist/docs/_next/static/media/get-parameter.62eee93d.png} +0 -0
- /package/{docs → dist/docs}/images/add-to-cherry-studio/step-1.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cherry-studio/step-2.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cherry-studio/step-3.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cherry-studio/step-4.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cherry-studio/step-5.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cursor/step-1.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cursor/step-2.png +0 -0
- /package/{docs → dist/docs}/images/add-to-cursor/step-3.png +0 -0
- /package/{docs → dist/docs}/images/coze-workflow/config-workflow-step-1.png +0 -0
- /package/{docs → dist/docs}/images/coze-workflow/config-workflow-step-2.png +0 -0
- /package/{docs → dist/docs}/images/coze-workflow/config-workflow-step-3.png +0 -0
- /package/{docs → dist/docs}/images/integrate-to-cherry-studio.png +0 -0
- /package/{docs → dist/docs}/images/integrate-to-cursor.png +0 -0
- /package/{docs → dist/docs}/images/modelscope/step-1.png +0 -0
- /package/{docs → dist/docs}/images/modelscope/step-2.png +0 -0
- /package/{docs → dist/docs}/images/modelscope/step-3.png +0 -0
- /package/{docs → dist/docs}/images/modelscope/step-4.png +0 -0
- /package/{docs → dist/docs}/images/preview.png +0 -0
- /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-1.png +0 -0
- /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-2.png +0 -0
- /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-3.png +0 -0
- /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-4.png +0 -0
- /package/{docs → dist/docs}/images/use-multi-xiaozhi-mcp-endpoints/step-5.png +0 -0
- /package/{docs → dist/docs}/images/web-ui-preview.png +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/form-utils-h64o2Nyg.js +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/index-88NfCOo9.js +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/index-P6Zq3MZF.css +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/radix-ui-BA32w1ww.js +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/react-vendor-DrjkXih1.js +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/utils-CiPelQLP.js +0 -0
- /package/{apps/frontend/dist → dist/frontend}/assets/vendor-DK9yaMt3.js +0 -0
- /package/{apps/frontend/dist → dist/frontend}/index.html +0 -0
package/docs/arch/cache.mdx
DELETED
|
@@ -1,885 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: MCP 缓存机制开发者指南
|
|
3
|
-
description: 详细介绍了 xiaozhi-client 项目中 MCP 服务工具列表的缓存机制
|
|
4
|
-
sidebar_position: 5
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
import { Mermaid } from '@theme/Mermaid';
|
|
8
|
-
|
|
9
|
-
# MCP 缓存机制开发者指南
|
|
10
|
-
|
|
11
|
-
## 概述
|
|
12
|
-
|
|
13
|
-
本文档面向希望参与 xiaozhi-client 项目开发的贡献者,详细介绍了 MCP (Model Context Protocol) 服务工具列表的缓存机制。该缓存机制旨在优化 MCP 服务的启动性能,减少重复的服务连接和工具列表获取操作。
|
|
14
|
-
|
|
15
|
-
## 缓存机制核心原理
|
|
16
|
-
|
|
17
|
-
### 设计目标
|
|
18
|
-
|
|
19
|
-
1. **性能优化**: 减少 MCP 服务启动时的连接和工具获取时间
|
|
20
|
-
2. **用户体验**: 提升服务启动速度,减少用户等待时间
|
|
21
|
-
3. **系统稳定性**: 降低频繁连接对 MCP 服务的压力
|
|
22
|
-
4. **数据一致性**: 确保缓存数据与实际服务状态保持同步
|
|
23
|
-
|
|
24
|
-
### 解决的问题
|
|
25
|
-
|
|
26
|
-
- **启动延迟**: 每次启动都需要重新连接所有 MCP 服务
|
|
27
|
-
- **网络依赖**: 网络问题可能导致服务启动失败
|
|
28
|
-
- **资源消耗**: 频繁的服务连接消耗系统资源
|
|
29
|
-
- **用户等待**: 长时间的启动过程影响用户体验
|
|
30
|
-
|
|
31
|
-
### 缓存写入的触发时机
|
|
32
|
-
|
|
33
|
-
1. **MCP 服务连接成功后**: 每当 MCP 服务成功连接并获取到工具列表时
|
|
34
|
-
2. **工具列表变更时**: 检测到服务提供的工具列表发生变化时
|
|
35
|
-
3. **服务配置变更时**: 服务的配置参数(command、args、env 等)发生变更时
|
|
36
|
-
4. **缓存文件不存在时**: 首次启动或缓存文件被删除后的重新创建
|
|
37
|
-
|
|
38
|
-
### 缓存写入条件
|
|
39
|
-
|
|
40
|
-
- **服务连接状态**: 只有在服务成功连接的情况下才会写入缓存
|
|
41
|
-
- **工具列表有效性**: 确保获取到的工具列表不为空且格式正确
|
|
42
|
-
- **配置完整性**: 服务配置必须包含必要的字段和有效值
|
|
43
|
-
- **文件系统权限**: 确保对缓存文件目录有写入权限
|
|
44
|
-
|
|
45
|
-
### 缓存数据的生命周期管理
|
|
46
|
-
|
|
47
|
-
<Mermaid chart={`graph TD A[服务启动] --> B{缓存文件存在?} B -->|否| C[创建初始缓存] B -->|是| D[加载现有缓存] C --> E[连接 MCP 服务] D --> F{缓存有效?} F -->|是| G[使用缓存数据] F -->|否| E E --> H{连接成功?} H -->|是| I[获取工具列表] H -->|否| J[记录错误日志] I --> K[写入缓存] K --> L[更新元数据] G --> M[服务就绪] L --> M J --> N[降级处理]`} />
|
|
48
|
-
|
|
49
|
-
## 工作流程说明
|
|
50
|
-
|
|
51
|
-
### 完整流程图
|
|
52
|
-
|
|
53
|
-
从 MCP 服务启动到缓存写入的完整流程:
|
|
54
|
-
|
|
55
|
-
<Mermaid chart={`sequenceDiagram participant U as 用户 participant SM as MCPServiceManager participant CM as MCPCacheManager participant MS as MCPService participant CF as 缓存文件 U->>SM: xiaozhi start SM->>CM: 初始化缓存管理器 CM->>CF: 检查缓存文件存在性 loop 每个 MCP 服务 SM->>MS: 启动服务 MS->>MS: 连接 MCP 服务 MS->>MS: 获取工具列表 MS->>SM: 返回工具列表 SM->>CM: writeCacheEntry() CM->>CF: 原子写入缓存数据 CM->>SM: 写入完成确认 end SM->>U: 所有服务启动完成`} />
|
|
56
|
-
|
|
57
|
-
### 缓存文件的创建、更新、验证过程
|
|
58
|
-
|
|
59
|
-
#### 创建过程
|
|
60
|
-
|
|
61
|
-
1. **初始化检查**: `MCPCacheManager.ensureCacheFile()` 检查缓存文件是否存在
|
|
62
|
-
2. **创建初始结构**: 如果不存在,创建包含基本元数据的空缓存文件
|
|
63
|
-
3. **设置权限**: 确保缓存文件具有适当的读写权限
|
|
64
|
-
|
|
65
|
-
#### 更新过程
|
|
66
|
-
|
|
67
|
-
1. **加载现有缓存**: 读取并解析现有的缓存文件
|
|
68
|
-
2. **验证数据完整性**: 检查缓存文件格式和必要字段
|
|
69
|
-
3. **生成配置哈希**: 为当前服务配置生成 SHA256 哈希值
|
|
70
|
-
4. **创建缓存条目**: 构建包含工具列表、配置和元数据的缓存条目
|
|
71
|
-
5. **原子写入**: 使用临时文件确保写入操作的原子性
|
|
72
|
-
6. **更新元数据**: 增加写入计数,更新时间戳
|
|
73
|
-
|
|
74
|
-
#### 验证过程
|
|
75
|
-
|
|
76
|
-
1. **格式验证**: 使用 TypeScript 类型检查验证缓存文件结构
|
|
77
|
-
2. **数据完整性检查**: 验证必要字段的存在和类型
|
|
78
|
-
3. **版本兼容性**: 检查缓存文件版本与当前代码的兼容性
|
|
79
|
-
4. **哈希验证**: 比较配置哈希以检测配置变更
|
|
80
|
-
|
|
81
|
-
### 与 MCPServiceManager 的集成方式
|
|
82
|
-
|
|
83
|
-
#### 集成架构
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
// MCPServiceManager 中的集成
|
|
87
|
-
export class MCPServiceManager {
|
|
88
|
-
private cacheManager: MCPCacheManager; // 缓存管理器实例
|
|
89
|
-
|
|
90
|
-
constructor(configs?: Record<string, MCPServiceConfig>) {
|
|
91
|
-
this.cacheManager = new MCPCacheManager();
|
|
92
|
-
// ... 其他初始化
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// 在工具缓存刷新时写入缓存
|
|
96
|
-
private async refreshToolsCache(): Promise<void> {
|
|
97
|
-
// ... 获取工具列表逻辑
|
|
98
|
-
|
|
99
|
-
// 写入缓存
|
|
100
|
-
await this.cacheManager.writeCacheEntry(serviceName, tools, config);
|
|
101
|
-
|
|
102
|
-
// ... 其他处理逻辑
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
#### 集成要点
|
|
108
|
-
|
|
109
|
-
1. **单例模式**: `MCPCacheManager` 作为 `MCPServiceManager` 的私有成员
|
|
110
|
-
2. **异步操作**: 缓存写入采用异步方式,不阻塞主流程
|
|
111
|
-
3. **错误隔离**: 缓存操作失败不影响服务的正常启动
|
|
112
|
-
4. **日志记录**: 详细记录缓存操作的成功和失败情况
|
|
113
|
-
|
|
114
|
-
## 缓存应用场景
|
|
115
|
-
|
|
116
|
-
### 项目中使用缓存机制的模块
|
|
117
|
-
|
|
118
|
-
1. **MCPServiceManager**: 主要的缓存写入模块
|
|
119
|
-
|
|
120
|
-
- 在 `refreshToolsCache()` 方法中写入缓存
|
|
121
|
-
- 管理多个 MCP 服务的缓存数据
|
|
122
|
-
|
|
123
|
-
2. **配置管理系统**: 间接受益于缓存机制
|
|
124
|
-
|
|
125
|
-
- 减少配置文件的频繁更新
|
|
126
|
-
- 提升配置加载速度
|
|
127
|
-
|
|
128
|
-
3. **Web 界面**: 通过更快的服务启动改善用户体验
|
|
129
|
-
- 减少页面加载等待时间
|
|
130
|
-
- 提升工具列表显示速度
|
|
131
|
-
|
|
132
|
-
### 缓存机制在不同场景下的行为差异
|
|
133
|
-
|
|
134
|
-
#### 正常启动场景
|
|
135
|
-
|
|
136
|
-
- **首次启动**: 创建缓存文件,连接所有服务,写入工具列表
|
|
137
|
-
- **后续启动**: 加载缓存文件,验证有效性,按需更新
|
|
138
|
-
|
|
139
|
-
#### 配置变更场景
|
|
140
|
-
|
|
141
|
-
- **服务配置修改**: 检测配置哈希变化,重新连接服务,更新缓存
|
|
142
|
-
- **新增服务**: 为新服务创建缓存条目
|
|
143
|
-
- **删除服务**: 保留缓存条目但标记为无效
|
|
144
|
-
|
|
145
|
-
#### 异常情况场景
|
|
146
|
-
|
|
147
|
-
- **缓存文件损坏**: 重新创建缓存文件,记录警告日志
|
|
148
|
-
- **服务连接失败**: 保持旧缓存数据,记录错误信息
|
|
149
|
-
- **磁盘空间不足**: 跳过缓存写入,不影响服务启动
|
|
150
|
-
|
|
151
|
-
### 缓存失效和降级策略
|
|
152
|
-
|
|
153
|
-
#### 缓存失效条件
|
|
154
|
-
|
|
155
|
-
1. **配置变更检测**
|
|
156
|
-
|
|
157
|
-
```typescript
|
|
158
|
-
// 配置哈希比较
|
|
159
|
-
const currentHash = generateConfigHash(currentConfig);
|
|
160
|
-
const cachedHash = cacheEntry.configHash;
|
|
161
|
-
if (currentHash !== cachedHash) {
|
|
162
|
-
// 配置已变更,缓存失效
|
|
163
|
-
await invalidateCache(serverName);
|
|
164
|
-
}
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
2. **时间过期检测**
|
|
168
|
-
|
|
169
|
-
```typescript
|
|
170
|
-
// 检查缓存年龄(当前实现中暂未启用时间过期)
|
|
171
|
-
const cacheAge = Date.now() - new Date(cacheEntry.lastUpdated).getTime();
|
|
172
|
-
const maxAge = 24 * 60 * 60 * 1000; // 24小时
|
|
173
|
-
if (cacheAge > maxAge) {
|
|
174
|
-
// 缓存过期
|
|
175
|
-
return false;
|
|
176
|
-
}
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
3. **数据完整性检查**
|
|
180
|
-
```typescript
|
|
181
|
-
// 验证缓存数据结构
|
|
182
|
-
if (!cacheEntry.tools || cacheEntry.tools.length === 0) {
|
|
183
|
-
// 数据不完整
|
|
184
|
-
return false;
|
|
185
|
-
}
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
#### 降级策略
|
|
189
|
-
|
|
190
|
-
1. **优雅降级**: 缓存操作失败时不影响主流程
|
|
191
|
-
|
|
192
|
-
```typescript
|
|
193
|
-
try {
|
|
194
|
-
await this.cacheManager.writeCacheEntry(serverName, tools, config);
|
|
195
|
-
} catch (error) {
|
|
196
|
-
// 记录警告但继续执行
|
|
197
|
-
this.logger.warn(`缓存写入失败: ${error.message}`);
|
|
198
|
-
}
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
2. **错误隔离**: 单个服务的缓存问题不影响其他服务
|
|
202
|
-
3. **自动恢复**: 下次启动时自动重试缓存操作
|
|
203
|
-
|
|
204
|
-
## 数据结构详解
|
|
205
|
-
|
|
206
|
-
### 缓存文件结构
|
|
207
|
-
|
|
208
|
-
缓存文件遵循以下 JSON 结构:
|
|
209
|
-
|
|
210
|
-
```json
|
|
211
|
-
{
|
|
212
|
-
"version": "1.0.0",
|
|
213
|
-
"mcpServers": {
|
|
214
|
-
"服务名称": {
|
|
215
|
-
"tools": [...],
|
|
216
|
-
"lastUpdated": "YYYY-MM-DD HH:mm:ss 时间戳",
|
|
217
|
-
"serverConfig": {...},
|
|
218
|
-
"configHash": "SHA256 哈希值",
|
|
219
|
-
"version": "1.0.0"
|
|
220
|
-
}
|
|
221
|
-
},
|
|
222
|
-
"metadata": {
|
|
223
|
-
"lastGlobalUpdate": "YYYY-MM-DD HH:mm:ss 时间戳",
|
|
224
|
-
"totalWrites": 数字,
|
|
225
|
-
"createdAt": "YYYY-MM-DD HH:mm:ss 时间戳"
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
对应的 TypeScript 接口定义如下:
|
|
231
|
-
|
|
232
|
-
```typescript
|
|
233
|
-
interface MCPToolsCache {
|
|
234
|
-
version: string;
|
|
235
|
-
mcpServers: {
|
|
236
|
-
[serverName: string]: MCPToolsCacheEntry;
|
|
237
|
-
};
|
|
238
|
-
metadata: CacheMetadata;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
interface MCPToolsCacheEntry {
|
|
242
|
-
tools: Tool[];
|
|
243
|
-
lastUpdated: string;
|
|
244
|
-
serverConfig: MCPServiceConfig;
|
|
245
|
-
configHash: string;
|
|
246
|
-
version: string;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
interface CacheMetadata {
|
|
250
|
-
lastGlobalUpdate: string;
|
|
251
|
-
totalWrites: number;
|
|
252
|
-
createdAt: string;
|
|
253
|
-
}
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
### 各字段的作用和约束条件
|
|
257
|
-
|
|
258
|
-
#### 版本字段 (`version`)
|
|
259
|
-
|
|
260
|
-
- **作用**: 标识缓存文件格式版本,用于兼容性检查
|
|
261
|
-
- **约束**: 必须符合语义化版本格式 (`x.y.z`)
|
|
262
|
-
- **示例**: `"1.0.0"`
|
|
263
|
-
|
|
264
|
-
#### 服务器字段 (`mcpServers`)
|
|
265
|
-
|
|
266
|
-
- **作用**: 存储各个 MCP 服务的缓存数据
|
|
267
|
-
- **约束**: 键名只能包含字母、数字、下划线和连字符
|
|
268
|
-
- **结构**: 每个服务包含工具列表、配置快照和元数据
|
|
269
|
-
|
|
270
|
-
#### 工具列表 (`tools`)
|
|
271
|
-
|
|
272
|
-
- **作用**: 缓存服务提供的工具定义
|
|
273
|
-
- **约束**: 每个工具必须有唯一的名称
|
|
274
|
-
- **格式**: 符合 MCP Tool 接口规范
|
|
275
|
-
|
|
276
|
-
#### 配置哈希 (`configHash`)
|
|
277
|
-
|
|
278
|
-
- **作用**: 快速检测服务配置是否发生变更
|
|
279
|
-
- **约束**: 64 位十六进制字符串 (SHA256)
|
|
280
|
-
- **生成**: 基于服务配置的 JSON 字符串计算
|
|
281
|
-
|
|
282
|
-
#### 时间戳字段
|
|
283
|
-
|
|
284
|
-
- **作用**: 记录缓存的创建和更新时间
|
|
285
|
-
- **约束**: 必须符合 YYYY-MM-DD HH:mm:ss 格式
|
|
286
|
-
- **示例**: `"2025-09-01 12:39:21"`
|
|
287
|
-
|
|
288
|
-
### 配置哈希的生成和验证机制
|
|
289
|
-
|
|
290
|
-
#### 哈希生成算法
|
|
291
|
-
|
|
292
|
-
```typescript
|
|
293
|
-
private generateConfigHash(config: MCPServiceConfig): string {
|
|
294
|
-
try {
|
|
295
|
-
return createHash("sha256")
|
|
296
|
-
.update(JSON.stringify(config))
|
|
297
|
-
.digest("hex");
|
|
298
|
-
} catch (error) {
|
|
299
|
-
this.logger.warn(`生成配置哈希失败: ${error.message}`);
|
|
300
|
-
return "";
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
#### 验证机制
|
|
306
|
-
|
|
307
|
-
1. **配置变更检测**
|
|
308
|
-
|
|
309
|
-
```typescript
|
|
310
|
-
const currentHash = this.generateConfigHash(currentConfig);
|
|
311
|
-
const cachedHash = cacheEntry.configHash;
|
|
312
|
-
|
|
313
|
-
if (currentHash !== cachedHash) {
|
|
314
|
-
// 配置已变更,需要重新获取工具列表
|
|
315
|
-
return false;
|
|
316
|
-
}
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
2. **哈希完整性检查**
|
|
320
|
-
```typescript
|
|
321
|
-
if (!cacheEntry.configHash || cacheEntry.configHash.length !== 64) {
|
|
322
|
-
// 哈希值无效
|
|
323
|
-
return false;
|
|
324
|
-
}
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
## 开发指南
|
|
328
|
-
|
|
329
|
-
### 如何扩展缓存功能
|
|
330
|
-
|
|
331
|
-
#### 添加新的缓存字段
|
|
332
|
-
|
|
333
|
-
1. **更新接口定义**
|
|
334
|
-
|
|
335
|
-
```typescript
|
|
336
|
-
// 在 MCPCacheManager.ts 中
|
|
337
|
-
export interface MCPToolsCacheEntry {
|
|
338
|
-
tools: Tool[];
|
|
339
|
-
lastUpdated: string;
|
|
340
|
-
serverConfig: MCPServiceConfig;
|
|
341
|
-
configHash: string;
|
|
342
|
-
version: string;
|
|
343
|
-
// 添加新字段
|
|
344
|
-
newField?: string;
|
|
345
|
-
}
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
2. **更新验证函数**
|
|
349
|
-
|
|
350
|
-
```typescript
|
|
351
|
-
private validateCacheStructure(cache: any): cache is MCPToolsCache {
|
|
352
|
-
return (
|
|
353
|
-
cache &&
|
|
354
|
-
typeof cache === "object" &&
|
|
355
|
-
typeof cache.version === "string" &&
|
|
356
|
-
typeof cache.mcpServers === "object" &&
|
|
357
|
-
cache.metadata &&
|
|
358
|
-
typeof cache.metadata === "object" &&
|
|
359
|
-
typeof cache.metadata.lastGlobalUpdate === "string" &&
|
|
360
|
-
typeof cache.metadata.totalWrites === "number" &&
|
|
361
|
-
typeof cache.metadata.createdAt === "string"
|
|
362
|
-
);
|
|
363
|
-
}
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
3. **更新写入逻辑**
|
|
367
|
-
```typescript
|
|
368
|
-
const cacheEntry: MCPToolsCacheEntry = {
|
|
369
|
-
// ... 现有字段
|
|
370
|
-
newField: "新字段的值",
|
|
371
|
-
};
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
#### 添加新的验证规则
|
|
375
|
-
|
|
376
|
-
1. **扩展验证函数**
|
|
377
|
-
|
|
378
|
-
```typescript
|
|
379
|
-
private validateCacheStructure(cache: any): cache is MCPToolsCache {
|
|
380
|
-
return (
|
|
381
|
-
// ... 现有验证
|
|
382
|
-
&& this.validateNewField(cache.newField)
|
|
383
|
-
);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
private validateNewField(field: any): boolean {
|
|
387
|
-
// 新字段的验证逻辑
|
|
388
|
-
return typeof field === "string" && field.length > 0;
|
|
389
|
-
}
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
### 修改缓存结构的步骤和注意事项
|
|
393
|
-
|
|
394
|
-
#### 步骤清单
|
|
395
|
-
|
|
396
|
-
1. **评估影响范围**
|
|
397
|
-
|
|
398
|
-
- 确定修改是否为破坏性变更
|
|
399
|
-
- 评估对现有缓存文件的兼容性影响
|
|
400
|
-
- 制定版本升级策略
|
|
401
|
-
|
|
402
|
-
2. **更新数据结构**
|
|
403
|
-
|
|
404
|
-
```typescript
|
|
405
|
-
// 1. 更新 TypeScript 接口
|
|
406
|
-
export interface MCPToolsCacheEntry {
|
|
407
|
-
// ... 现有字段
|
|
408
|
-
newField: string; // 新增字段
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
// 2. 更新版本号(如果是破坏性变更)
|
|
412
|
-
private readonly CACHE_VERSION = "2.0.0";
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
3. **实现向后兼容**
|
|
416
|
-
|
|
417
|
-
```typescript
|
|
418
|
-
private migrateCache(cache: any): MCPToolsCache {
|
|
419
|
-
if (cache.version === "1.0.0") {
|
|
420
|
-
// 从 v1.0.0 迁移到 v2.0.0
|
|
421
|
-
cache.version = "2.0.0";
|
|
422
|
-
for (const entry of Object.values(cache.mcpServers)) {
|
|
423
|
-
entry.newField = "defaultValue";
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
return cache;
|
|
427
|
-
}
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
4. **更新测试用例**
|
|
431
|
-
|
|
432
|
-
```typescript
|
|
433
|
-
it("应该支持新字段", async () => {
|
|
434
|
-
const mockConfig = {
|
|
435
|
-
/* ... */
|
|
436
|
-
};
|
|
437
|
-
const mockTools = [
|
|
438
|
-
/* ... */
|
|
439
|
-
];
|
|
440
|
-
|
|
441
|
-
await cacheManager.writeCacheEntry("test", mockTools, mockConfig);
|
|
442
|
-
|
|
443
|
-
const cache = JSON.parse(readFileSync(testCachePath, "utf8"));
|
|
444
|
-
expect(cache.mcpServers.test.newField).toBeDefined();
|
|
445
|
-
});
|
|
446
|
-
```
|
|
447
|
-
|
|
448
|
-
#### 注意事项
|
|
449
|
-
|
|
450
|
-
- **版本兼容性**: 主版本号变更表示不兼容的结构变更
|
|
451
|
-
- **数据迁移**: 提供从旧版本到新版本的迁移逻辑
|
|
452
|
-
- **测试覆盖**: 确保新功能有完整的测试覆盖
|
|
453
|
-
- **文档更新**: 同步更新接口文档和使用说明
|
|
454
|
-
|
|
455
|
-
### 代码贡献的最佳实践
|
|
456
|
-
|
|
457
|
-
#### 开发流程
|
|
458
|
-
|
|
459
|
-
1. **Fork 和 Clone**
|
|
460
|
-
|
|
461
|
-
```bash
|
|
462
|
-
git clone https://github.com/your-username/xiaozhi-client.git
|
|
463
|
-
cd xiaozhi-client
|
|
464
|
-
pnpm install
|
|
465
|
-
```
|
|
466
|
-
|
|
467
|
-
2. **创建功能分支**
|
|
468
|
-
|
|
469
|
-
```bash
|
|
470
|
-
git checkout -b feature/cache-enhancement
|
|
471
|
-
```
|
|
472
|
-
|
|
473
|
-
3. **开发和测试**
|
|
474
|
-
|
|
475
|
-
```bash
|
|
476
|
-
# 运行缓存相关测试
|
|
477
|
-
pnpm test src/services/__tests__/MCPCacheManager.test.ts
|
|
478
|
-
|
|
479
|
-
# 运行完整测试套件
|
|
480
|
-
pnpm test
|
|
481
|
-
|
|
482
|
-
# 代码质量检查
|
|
483
|
-
pnpm check:fix
|
|
484
|
-
```
|
|
485
|
-
|
|
486
|
-
4. **验证功能**
|
|
487
|
-
|
|
488
|
-
```bash
|
|
489
|
-
# 构建项目
|
|
490
|
-
pnpm build
|
|
491
|
-
|
|
492
|
-
# 在测试环境验证
|
|
493
|
-
cd tmp/hello-world
|
|
494
|
-
xiaozhi start
|
|
495
|
-
|
|
496
|
-
# 验证缓存文件格式
|
|
497
|
-
cat xiaozhi.cache.json | jq .
|
|
498
|
-
```
|
|
499
|
-
|
|
500
|
-
#### 代码规范
|
|
501
|
-
|
|
502
|
-
- **TypeScript**: 使用严格的类型定义
|
|
503
|
-
- **错误处理**: 所有缓存操作都应有适当的错误处理
|
|
504
|
-
- **日志记录**: 使用统一的日志格式和级别
|
|
505
|
-
- **测试覆盖**: 新功能必须有对应的单元测试
|
|
506
|
-
- **文档更新**: 修改接口时同步更新文档
|
|
507
|
-
|
|
508
|
-
## 测试和调试
|
|
509
|
-
|
|
510
|
-
### 单元测试的运行方法
|
|
511
|
-
|
|
512
|
-
#### 运行特定测试文件
|
|
513
|
-
|
|
514
|
-
```bash
|
|
515
|
-
# 只运行缓存管理器测试
|
|
516
|
-
pnpm test src/services/__tests__/MCPCacheManager.test.ts
|
|
517
|
-
|
|
518
|
-
# 运行所有服务相关测试
|
|
519
|
-
pnpm test src/services/__tests__/
|
|
520
|
-
|
|
521
|
-
# 运行测试并显示覆盖率
|
|
522
|
-
pnpm test --coverage src/services/__tests__/MCPCacheManager.test.ts
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
#### 测试用例结构
|
|
526
|
-
|
|
527
|
-
```typescript
|
|
528
|
-
describe("MCPCacheManager", () => {
|
|
529
|
-
let cacheManager: MCPCacheManager;
|
|
530
|
-
let testCachePath: string;
|
|
531
|
-
|
|
532
|
-
beforeEach(() => {
|
|
533
|
-
// 设置测试环境
|
|
534
|
-
cacheManager = new MCPCacheManager();
|
|
535
|
-
testCachePath = "/tmp/test-cache.json";
|
|
536
|
-
});
|
|
537
|
-
|
|
538
|
-
afterEach(() => {
|
|
539
|
-
// 清理测试文件
|
|
540
|
-
if (existsSync(testCachePath)) {
|
|
541
|
-
unlinkSync(testCachePath);
|
|
542
|
-
}
|
|
543
|
-
});
|
|
544
|
-
|
|
545
|
-
describe("writeCacheEntry", () => {
|
|
546
|
-
it("应该成功写入缓存条目", async () => {
|
|
547
|
-
// 测试逻辑
|
|
548
|
-
});
|
|
549
|
-
});
|
|
550
|
-
});
|
|
551
|
-
```
|
|
552
|
-
|
|
553
|
-
### 缓存功能的手动测试步骤
|
|
554
|
-
|
|
555
|
-
#### 基础功能测试
|
|
556
|
-
|
|
557
|
-
1. **缓存文件创建测试**
|
|
558
|
-
|
|
559
|
-
```bash
|
|
560
|
-
# 删除现有缓存文件
|
|
561
|
-
rm xiaozhi.cache.json
|
|
562
|
-
|
|
563
|
-
# 启动服务,观察缓存文件是否创建
|
|
564
|
-
xiaozhi start
|
|
565
|
-
|
|
566
|
-
# 验证缓存文件存在且格式正确
|
|
567
|
-
ls -la xiaozhi.cache.json
|
|
568
|
-
cat xiaozhi.cache.json | jq .
|
|
569
|
-
```
|
|
570
|
-
|
|
571
|
-
2. **缓存写入测试**
|
|
572
|
-
|
|
573
|
-
```bash
|
|
574
|
-
# 启动服务并观察日志
|
|
575
|
-
xiaozhi start
|
|
576
|
-
|
|
577
|
-
# 查找缓存相关日志
|
|
578
|
-
# 应该看到类似以下的日志:
|
|
579
|
-
# [CacheManager] 缓存写入成功: calculator, 工具数量: 1
|
|
580
|
-
# [CacheManager] 缓存写入成功: datetime, 工具数量: 4
|
|
581
|
-
```
|
|
582
|
-
|
|
583
|
-
3. **配置变更检测测试**
|
|
584
|
-
|
|
585
|
-
```bash
|
|
586
|
-
# 修改服务配置
|
|
587
|
-
# 编辑 xiaozhi.config.json,修改某个服务的 command 或 args
|
|
588
|
-
|
|
589
|
-
# 重新启动服务
|
|
590
|
-
xiaozhi start
|
|
591
|
-
|
|
592
|
-
# 观察是否检测到配置变更并更新缓存
|
|
593
|
-
# 检查缓存文件中的 configHash 是否发生变化
|
|
594
|
-
```
|
|
595
|
-
|
|
596
|
-
#### 异常情况测试
|
|
597
|
-
|
|
598
|
-
1. **缓存文件损坏测试**
|
|
599
|
-
|
|
600
|
-
```bash
|
|
601
|
-
# 故意损坏缓存文件
|
|
602
|
-
echo "invalid json" > xiaozhi.cache.json
|
|
603
|
-
|
|
604
|
-
# 启动服务,观察是否能自动恢复
|
|
605
|
-
xiaozhi start
|
|
606
|
-
|
|
607
|
-
# 验证缓存文件是否被重新创建
|
|
608
|
-
cat xiaozhi.cache.json | jq .
|
|
609
|
-
```
|
|
610
|
-
|
|
611
|
-
2. **权限问题测试**
|
|
612
|
-
|
|
613
|
-
```bash
|
|
614
|
-
# 设置缓存文件为只读
|
|
615
|
-
chmod 444 xiaozhi.cache.json
|
|
616
|
-
|
|
617
|
-
# 启动服务,观察错误处理
|
|
618
|
-
xiaozhi start
|
|
619
|
-
|
|
620
|
-
# 检查日志中是否有适当的警告信息
|
|
621
|
-
# 恢复权限
|
|
622
|
-
chmod 644 xiaozhi.cache.json
|
|
623
|
-
```
|
|
624
|
-
|
|
625
|
-
3. **磁盘空间不足测试**
|
|
626
|
-
```bash
|
|
627
|
-
# 在测试环境中模拟磁盘空间不足
|
|
628
|
-
# 观察缓存写入失败时的行为
|
|
629
|
-
# 确保服务仍能正常启动
|
|
630
|
-
```
|
|
631
|
-
|
|
632
|
-
### 常见问题的排查和解决方案
|
|
633
|
-
|
|
634
|
-
#### 问题 1: 缓存文件未创建
|
|
635
|
-
|
|
636
|
-
**症状**: 启动服务后没有生成 `xiaozhi.cache.json` 文件
|
|
637
|
-
|
|
638
|
-
**排查步骤**:
|
|
639
|
-
|
|
640
|
-
1. 检查当前目录权限
|
|
641
|
-
|
|
642
|
-
```bash
|
|
643
|
-
ls -la .
|
|
644
|
-
```
|
|
645
|
-
|
|
646
|
-
2. 检查环境变量设置
|
|
647
|
-
|
|
648
|
-
```bash
|
|
649
|
-
echo $XIAOZHI_CONFIG_DIR
|
|
650
|
-
```
|
|
651
|
-
|
|
652
|
-
3. 查看详细日志
|
|
653
|
-
```bash
|
|
654
|
-
xiaozhi start --verbose
|
|
655
|
-
```
|
|
656
|
-
|
|
657
|
-
**解决方案**:
|
|
658
|
-
|
|
659
|
-
- 确保当前目录有写入权限
|
|
660
|
-
- 检查 `XIAOZHI_CONFIG_DIR` 环境变量是否正确设置
|
|
661
|
-
- 查看错误日志中的具体错误信息
|
|
662
|
-
|
|
663
|
-
#### 问题 2: 缓存验证失败
|
|
664
|
-
|
|
665
|
-
**症状**: 缓存文件格式验证失败
|
|
666
|
-
|
|
667
|
-
**排查步骤**:
|
|
668
|
-
|
|
669
|
-
1. 检查缓存文件格式
|
|
670
|
-
|
|
671
|
-
```bash
|
|
672
|
-
cat xiaozhi.cache.json | jq .
|
|
673
|
-
```
|
|
674
|
-
|
|
675
|
-
2. 查看具体验证错误
|
|
676
|
-
|
|
677
|
-
```bash
|
|
678
|
-
cat xiaozhi.cache.json | jq . || echo "JSON 格式错误"
|
|
679
|
-
```
|
|
680
|
-
|
|
681
|
-
**解决方案**:
|
|
682
|
-
|
|
683
|
-
- 删除损坏的缓存文件,重新生成
|
|
684
|
-
- 检查缓存文件中的时间戳格式
|
|
685
|
-
- 确保所有必需字段都存在
|
|
686
|
-
|
|
687
|
-
#### 问题 3: 配置变更未检测到
|
|
688
|
-
|
|
689
|
-
**症状**: 修改服务配置后,缓存没有更新
|
|
690
|
-
|
|
691
|
-
**排查步骤**:
|
|
692
|
-
|
|
693
|
-
1. 检查配置哈希是否变化
|
|
694
|
-
|
|
695
|
-
```bash
|
|
696
|
-
# 查看缓存文件中的 configHash
|
|
697
|
-
cat xiaozhi.cache.json | jq '.mcpServers.serviceName.configHash'
|
|
698
|
-
```
|
|
699
|
-
|
|
700
|
-
2. 验证配置文件修改
|
|
701
|
-
|
|
702
|
-
```bash
|
|
703
|
-
cat xiaozhi.config.json | jq '.mcpServerConfig'
|
|
704
|
-
```
|
|
705
|
-
|
|
706
|
-
3. 查看缓存管理器日志
|
|
707
|
-
```bash
|
|
708
|
-
# 启动时查找相关日志
|
|
709
|
-
xiaozhi start | grep -i cache
|
|
710
|
-
```
|
|
711
|
-
|
|
712
|
-
**解决方案**:
|
|
713
|
-
|
|
714
|
-
- 确保配置文件修改已保存
|
|
715
|
-
- 重新构建项目 `pnpm build`
|
|
716
|
-
- 删除缓存文件强制重新生成
|
|
717
|
-
|
|
718
|
-
#### 问题 4: 缓存写入性能问题
|
|
719
|
-
|
|
720
|
-
**症状**: 缓存写入操作耗时过长
|
|
721
|
-
|
|
722
|
-
**排查步骤**:
|
|
723
|
-
|
|
724
|
-
1. 检查缓存文件大小
|
|
725
|
-
|
|
726
|
-
```bash
|
|
727
|
-
ls -lh xiaozhi.cache.json
|
|
728
|
-
```
|
|
729
|
-
|
|
730
|
-
2. 监控磁盘 I/O
|
|
731
|
-
|
|
732
|
-
```bash
|
|
733
|
-
# macOS
|
|
734
|
-
iostat -d 1
|
|
735
|
-
|
|
736
|
-
# Linux
|
|
737
|
-
iotop
|
|
738
|
-
```
|
|
739
|
-
|
|
740
|
-
3. 查看缓存统计信息
|
|
741
|
-
```bash
|
|
742
|
-
cat xiaozhi.cache.json | jq '.metadata'
|
|
743
|
-
```
|
|
744
|
-
|
|
745
|
-
**解决方案**:
|
|
746
|
-
|
|
747
|
-
- 检查磁盘空间和性能
|
|
748
|
-
- 考虑缓存文件压缩
|
|
749
|
-
- 优化缓存写入频率
|
|
750
|
-
|
|
751
|
-
### 性能测试和监控方法
|
|
752
|
-
|
|
753
|
-
#### 性能基准测试
|
|
754
|
-
|
|
755
|
-
1. **启动时间对比**
|
|
756
|
-
|
|
757
|
-
```bash
|
|
758
|
-
# 测试无缓存启动时间
|
|
759
|
-
rm xiaozhi.cache.json
|
|
760
|
-
time xiaozhi start
|
|
761
|
-
|
|
762
|
-
# 测试有缓存启动时间
|
|
763
|
-
time xiaozhi start
|
|
764
|
-
```
|
|
765
|
-
|
|
766
|
-
2. **缓存统计监控**
|
|
767
|
-
|
|
768
|
-
```bash
|
|
769
|
-
# 查看缓存统计
|
|
770
|
-
cat xiaozhi.cache.json | jq '.metadata'
|
|
771
|
-
|
|
772
|
-
# 输出示例:
|
|
773
|
-
# {
|
|
774
|
-
# "lastGlobalUpdate": "2025-09-01 12:39:21",
|
|
775
|
-
# "totalWrites": 6,
|
|
776
|
-
# "createdAt": "2025-09-01 12:30:15"
|
|
777
|
-
# }
|
|
778
|
-
```
|
|
779
|
-
|
|
780
|
-
3. **内存使用监控**
|
|
781
|
-
|
|
782
|
-
```bash
|
|
783
|
-
# 启动服务并监控内存使用
|
|
784
|
-
xiaozhi start &
|
|
785
|
-
PID=$!
|
|
786
|
-
|
|
787
|
-
# 监控内存使用
|
|
788
|
-
while kill -0 $PID 2>/dev/null; do
|
|
789
|
-
ps -p $PID -o pid,vsz,rss,comm
|
|
790
|
-
sleep 1
|
|
791
|
-
done
|
|
792
|
-
```
|
|
793
|
-
|
|
794
|
-
#### 性能优化建议
|
|
795
|
-
|
|
796
|
-
1. **缓存文件大小控制**
|
|
797
|
-
|
|
798
|
-
- 定期清理过期的缓存条目
|
|
799
|
-
- 压缩工具定义中的冗余信息
|
|
800
|
-
- 设置合理的缓存保留策略
|
|
801
|
-
|
|
802
|
-
2. **I/O 操作优化**
|
|
803
|
-
|
|
804
|
-
- 使用异步文件操作
|
|
805
|
-
- 批量写入多个缓存条目
|
|
806
|
-
- 避免频繁的小文件写入
|
|
807
|
-
|
|
808
|
-
3. **内存使用优化**
|
|
809
|
-
- 及时释放不需要的缓存数据
|
|
810
|
-
- 使用流式处理大型缓存文件
|
|
811
|
-
- 实现缓存数据的懒加载
|
|
812
|
-
|
|
813
|
-
## 总结
|
|
814
|
-
|
|
815
|
-
xiaozhi 的 MCP 缓存机制通过智能的数据缓存和配置变更检测,显著提升了服务启动性能和用户体验。本文档为开发者提供了完整的缓存机制理解、开发指南和调试方法,帮助贡献者更好地参与项目开发和维护。
|
|
816
|
-
|
|
817
|
-
### 关键要点
|
|
818
|
-
|
|
819
|
-
- **设计原则**: 性能优化、数据一致性、错误隔离
|
|
820
|
-
- **核心功能**: 缓存写入、配置变更检测、原子操作
|
|
821
|
-
- **开发规范**: TypeScript 类型安全、完整测试覆盖、详细文档
|
|
822
|
-
- **调试方法**: 单元测试、手动验证、性能监控
|
|
823
|
-
|
|
824
|
-
### 后续发展
|
|
825
|
-
|
|
826
|
-
当前实现专注于缓存写入功能,为后续的缓存读取、命中机制和性能优化奠定了坚实基础。未来的发展方向包括:
|
|
827
|
-
|
|
828
|
-
- 实现缓存读取和命中机制
|
|
829
|
-
- 添加缓存预热和后台更新功能
|
|
830
|
-
- 优化缓存存储格式和压缩算法
|
|
831
|
-
- 实现分布式缓存支持
|
|
832
|
-
|
|
833
|
-
## 验证规则
|
|
834
|
-
|
|
835
|
-
### 格式验证
|
|
836
|
-
|
|
837
|
-
- **时间戳**: 必须符合 YYYY-MM-DD HH:mm:ss 格式
|
|
838
|
-
- **版本号**: 必须符合语义化版本格式 (`x.y.z`)
|
|
839
|
-
- **配置哈希**: 必须是 64 位十六进制字符串 (SHA256)
|
|
840
|
-
- **服务器名称**: 只能包含字母、数字、下划线和连字符
|
|
841
|
-
|
|
842
|
-
### 数据完整性
|
|
843
|
-
|
|
844
|
-
- 所有必需字段必须存在
|
|
845
|
-
- 数组字段不能为 null
|
|
846
|
-
- 数值字段必须在合理范围内
|
|
847
|
-
- 字符串字段不能为空(除非明确允许)
|
|
848
|
-
|
|
849
|
-
## 版本兼容性
|
|
850
|
-
|
|
851
|
-
当前缓存文件格式版本: `1.0.0`
|
|
852
|
-
|
|
853
|
-
### 版本升级策略
|
|
854
|
-
|
|
855
|
-
- **主版本号**: 不兼容的结构变更
|
|
856
|
-
- **次版本号**: 向后兼容的功能添加
|
|
857
|
-
- **修订版本号**: 向后兼容的问题修复
|
|
858
|
-
|
|
859
|
-
## 相关文件
|
|
860
|
-
|
|
861
|
-
- `src/services/MCPCacheManager.ts`: 缓存管理器实现
|
|
862
|
-
- `xiaozhi.cache.json`: 实际的缓存文件(运行时生成)
|
|
863
|
-
|
|
864
|
-
## 注意事项
|
|
865
|
-
|
|
866
|
-
1. **数据一致性**: 缓存文件应该与实际的 MCP 服务配置保持一致
|
|
867
|
-
2. **性能考虑**: 大型缓存文件可能影响读写性能
|
|
868
|
-
3. **安全性**: 缓存文件可能包含敏感的配置信息,注意访问权限
|
|
869
|
-
4. **备份**: 建议定期备份缓存文件,避免数据丢失
|
|
870
|
-
|
|
871
|
-
## 故障排除
|
|
872
|
-
|
|
873
|
-
### 常见验证错误
|
|
874
|
-
|
|
875
|
-
1. **时间格式错误**: 确保时间戳符合 YYYY-MM-DD HH:mm:ss 格式
|
|
876
|
-
2. **缺少必需字段**: 检查所有必需字段是否存在
|
|
877
|
-
3. **类型不匹配**: 确保字段类型与接口定义一致
|
|
878
|
-
4. **格式不符**: 检查版本号、哈希值等格式是否正确
|
|
879
|
-
|
|
880
|
-
### 修复建议
|
|
881
|
-
|
|
882
|
-
1. 使用 `jq` 工具检查 JSON 格式和内容
|
|
883
|
-
2. 参考接口定义修正格式问题
|
|
884
|
-
3. 重新生成缓存文件(删除现有文件,重启服务)
|
|
885
|
-
4. 检查 MCPCacheManager 的实现逻辑
|