xiaozhi-client 1.9.2 → 1.9.3-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 +4 -4
- package/apps/frontend/dist/assets/form-utils-h64o2Nyg.js +2 -0
- package/apps/frontend/dist/assets/form-utils-h64o2Nyg.js.map +1 -0
- package/apps/frontend/dist/assets/index-88NfCOo9.js +50 -0
- package/apps/frontend/dist/assets/index-88NfCOo9.js.map +1 -0
- package/apps/frontend/dist/assets/index-P6Zq3MZF.css +1 -0
- package/apps/frontend/dist/assets/radix-ui-BA32w1ww.js.map +1 -1
- package/apps/frontend/dist/assets/react-vendor-DrjkXih1.js +319 -0
- package/apps/frontend/dist/assets/react-vendor-DrjkXih1.js.map +1 -0
- package/apps/frontend/dist/assets/utils-CiPelQLP.js +2 -0
- package/apps/frontend/dist/assets/utils-CiPelQLP.js.map +1 -0
- package/apps/frontend/dist/assets/{vendor-DvFnRBMT.js → vendor-DK9yaMt3.js} +2 -2
- package/apps/frontend/dist/assets/vendor-DK9yaMt3.js.map +1 -0
- package/apps/frontend/dist/index.html +6 -6
- package/dist/WebServerStandalone.js +16 -21
- package/dist/WebServerStandalone.js.map +1 -1
- package/dist/cli.js +17 -25
- package/dist/cli.js.map +1 -1
- package/dist/mcpServerProxy.d.ts +1 -1
- package/dist/mcpServerProxy.js +13 -13
- package/dist/mcpServerProxy.js.map +1 -1
- package/dist/package.json +25 -18
- package/docs/arch/{cache.md → cache.mdx} +62 -95
- package/docs/changelog.mdx +617 -0
- package/docs/development/docker-build.mdx +256 -0
- package/docs/development/todo__release-guide.md +5 -5
- package/docs/docs.json +6 -1
- package/docs/python-dependencies.md +2 -2
- package/docs/usage/docker.mdx +4 -4
- package/package.json +25 -18
- package/apps/frontend/dist/assets/form-utils-wyhL6gg0.js +0 -24
- package/apps/frontend/dist/assets/form-utils-wyhL6gg0.js.map +0 -1
- package/apps/frontend/dist/assets/index-COfJftUA.css +0 -1
- package/apps/frontend/dist/assets/index-ukaaLbQN.js +0 -50
- package/apps/frontend/dist/assets/index-ukaaLbQN.js.map +0 -1
- package/apps/frontend/dist/assets/react-vendor-B6Uf_8Kw.js +0 -319
- package/apps/frontend/dist/assets/react-vendor-B6Uf_8Kw.js.map +0 -1
- package/apps/frontend/dist/assets/utils-D0kRQKVW.js +0 -2
- package/apps/frontend/dist/assets/utils-D0kRQKVW.js.map +0 -1
- package/apps/frontend/dist/assets/vendor-DvFnRBMT.js.map +0 -1
- package/dist/templates/docker/mcpServers/calculator.js +0 -106
- package/dist/templates/docker/mcpServers/datetime.js +0 -390
- package/dist/templates/docker/package.json +0 -13
- package/dist/templates/docker/requirements.txt +0 -16
- package/dist/templates/docker/xiaozhi.config.json +0 -21
- package/templates/docker/mcpServers/calculator.js +0 -106
- package/templates/docker/mcpServers/datetime.js +0 -390
- package/templates/docker/package.json +0 -13
- package/templates/docker/requirements.txt +0 -16
- package/templates/docker/xiaozhi.config.json +0 -21
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xiaozhi-client",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.3-beta.1",
|
|
4
4
|
"description": "小智 AI 客户端 命令行工具",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -33,25 +33,28 @@
|
|
|
33
33
|
"xiaozhi-client": "dist/cli.js"
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
|
-
"build": "pnpm run build:web && cross-env NODE_ENV=production tsup",
|
|
36
|
+
"build": "pnpm run build:packages && pnpm run build:web && cross-env NODE_ENV=production tsup --config config/tsup.config.ts",
|
|
37
|
+
"build:packages": "pnpm --filter './packages/*' run build",
|
|
37
38
|
"build:web": "cd apps/frontend && pnpm install && pnpm run build",
|
|
38
|
-
"dev": "cross-env NODE_ENV=development tsup --watch",
|
|
39
|
-
"test": "vitest run",
|
|
40
|
-
"test:silent": "vitest run --silent=true",
|
|
41
|
-
"test:watch": "vitest",
|
|
42
|
-
"test:coverage": "vitest run --coverage",
|
|
43
|
-
"test:ui": "vitest --ui",
|
|
44
|
-
"format": "biome format --write .",
|
|
45
|
-
"lint": "biome lint --write .",
|
|
46
|
-
"type:check": "tsc --project tsconfig.typecheck.json",
|
|
47
|
-
"check": "biome check .",
|
|
48
|
-
"check:fix": "biome check --write --unsafe .",
|
|
39
|
+
"dev": "pnpm run build:packages && cross-env NODE_ENV=development tsup --config config/tsup.config.ts --watch",
|
|
40
|
+
"test": "vitest run --config config/vitest.config.ts",
|
|
41
|
+
"test:silent": "vitest run --silent=true --config config/vitest.config.ts",
|
|
42
|
+
"test:watch": "vitest --config config/vitest.config.ts",
|
|
43
|
+
"test:coverage": "vitest run --coverage --config config/vitest.config.ts",
|
|
44
|
+
"test:ui": "vitest --ui --config config/vitest.config.ts",
|
|
45
|
+
"format": "biome format --write --config-path=config/biome.json .",
|
|
46
|
+
"lint": "biome lint --write --config-path=config/biome.json .",
|
|
47
|
+
"type:check": "tsc --project config/tsconfig.typecheck.json",
|
|
48
|
+
"check": "biome check --config-path=config/biome.json .",
|
|
49
|
+
"check:fix": "biome check --write --unsafe --config-path=config/biome.json .",
|
|
49
50
|
"check:all": "pnpm check && pnpm type:check && pnpm spell:check && pnpm duplicate:check",
|
|
50
|
-
"spell:check": "cspell
|
|
51
|
-
"duplicate:check": "jscpd
|
|
52
|
-
"docker:update-version": "node scripts/update-
|
|
51
|
+
"spell:check": "cspell --config config/cspell.json .",
|
|
52
|
+
"duplicate:check": "jscpd apps/backend/",
|
|
53
|
+
"docker:update-version": "node docker/scripts/update-version.js",
|
|
53
54
|
"example": "node --loader ts-node/esm",
|
|
54
|
-
"docs:dev": "cd docs && mintlify dev"
|
|
55
|
+
"docs:dev": "cd docs && mintlify dev",
|
|
56
|
+
"release": "npx release-it --config config/release-it.json",
|
|
57
|
+
"release:dry": "npx release-it --config config/release-it.json --dry-run"
|
|
55
58
|
},
|
|
56
59
|
"dependencies": {
|
|
57
60
|
"@hono/node-server": "^1.17.1",
|
|
@@ -116,7 +119,11 @@
|
|
|
116
119
|
"axios": ">=1.12.0",
|
|
117
120
|
"@conventional-changelog/git-client": ">=2.0.0",
|
|
118
121
|
"vite@>=7.1.0 <=7.1.10": ">=7.1.11",
|
|
119
|
-
"hono@>=1.1.0 <4.10.3": ">=4.10.3"
|
|
122
|
+
"hono@>=1.1.0 <4.10.3": ">=4.10.3",
|
|
123
|
+
"js-yaml@<4.1.1": ">=4.1.1",
|
|
124
|
+
"esbuild@<=0.24.2": ">=0.25.0",
|
|
125
|
+
"glob@>=10.2.0 <10.5.0": ">=10.5.0",
|
|
126
|
+
"glob@>=11.0.0 <11.1.0": ">=11.1.0"
|
|
120
127
|
}
|
|
121
128
|
},
|
|
122
129
|
"packageManager": "pnpm@10.13.1"
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: MCP 缓存机制开发者指南
|
|
3
|
+
description: 详细介绍了 xiaozhi-client 项目中 MCP 服务工具列表的缓存机制
|
|
4
|
+
sidebar_position: 5
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
import { Mermaid } from '@theme/Mermaid';
|
|
8
|
+
|
|
1
9
|
# MCP 缓存机制开发者指南
|
|
2
10
|
|
|
3
11
|
## 概述
|
|
@@ -36,24 +44,7 @@
|
|
|
36
44
|
|
|
37
45
|
### 缓存数据的生命周期管理
|
|
38
46
|
|
|
39
|
-
|
|
40
|
-
graph TD
|
|
41
|
-
A[服务启动] --> B{缓存文件存在?}
|
|
42
|
-
B -->|否| C[创建初始缓存]
|
|
43
|
-
B -->|是| D[加载现有缓存]
|
|
44
|
-
C --> E[连接 MCP 服务]
|
|
45
|
-
D --> F{缓存有效?}
|
|
46
|
-
F -->|是| G[使用缓存数据]
|
|
47
|
-
F -->|否| E
|
|
48
|
-
E --> H{连接成功?}
|
|
49
|
-
H -->|是| I[获取工具列表]
|
|
50
|
-
H -->|否| J[记录错误日志]
|
|
51
|
-
I --> K[写入缓存]
|
|
52
|
-
K --> L[更新元数据]
|
|
53
|
-
G --> M[服务就绪]
|
|
54
|
-
L --> M
|
|
55
|
-
J --> N[降级处理]
|
|
56
|
-
```
|
|
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[降级处理]`} />
|
|
57
48
|
|
|
58
49
|
## 工作流程说明
|
|
59
50
|
|
|
@@ -61,30 +52,7 @@ graph TD
|
|
|
61
52
|
|
|
62
53
|
从 MCP 服务启动到缓存写入的完整流程:
|
|
63
54
|
|
|
64
|
-
|
|
65
|
-
sequenceDiagram
|
|
66
|
-
participant U as 用户
|
|
67
|
-
participant SM as MCPServiceManager
|
|
68
|
-
participant CM as MCPCacheManager
|
|
69
|
-
participant MS as MCPService
|
|
70
|
-
participant CF as 缓存文件
|
|
71
|
-
|
|
72
|
-
U->>SM: xiaozhi start
|
|
73
|
-
SM->>CM: 初始化缓存管理器
|
|
74
|
-
CM->>CF: 检查缓存文件存在性
|
|
75
|
-
|
|
76
|
-
loop 每个 MCP 服务
|
|
77
|
-
SM->>MS: 启动服务
|
|
78
|
-
MS->>MS: 连接 MCP 服务
|
|
79
|
-
MS->>MS: 获取工具列表
|
|
80
|
-
MS->>SM: 返回工具列表
|
|
81
|
-
SM->>CM: writeCacheEntry()
|
|
82
|
-
CM->>CF: 原子写入缓存数据
|
|
83
|
-
CM->>SM: 写入完成确认
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
SM->>U: 所有服务启动完成
|
|
87
|
-
```
|
|
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: 所有服务启动完成`} />
|
|
88
56
|
|
|
89
57
|
### 缓存文件的创建、更新、验证过程
|
|
90
58
|
|
|
@@ -105,7 +73,7 @@ sequenceDiagram
|
|
|
105
73
|
|
|
106
74
|
#### 验证过程
|
|
107
75
|
|
|
108
|
-
1. **格式验证**: 使用
|
|
76
|
+
1. **格式验证**: 使用 TypeScript 类型检查验证缓存文件结构
|
|
109
77
|
2. **数据完整性检查**: 验证必要字段的存在和类型
|
|
110
78
|
3. **版本兼容性**: 检查缓存文件版本与当前代码的兼容性
|
|
111
79
|
4. **哈希验证**: 比较配置哈希以检测配置变更
|
|
@@ -235,9 +203,9 @@ export class MCPServiceManager {
|
|
|
235
203
|
|
|
236
204
|
## 数据结构详解
|
|
237
205
|
|
|
238
|
-
###
|
|
206
|
+
### 缓存文件结构
|
|
239
207
|
|
|
240
|
-
缓存文件遵循以下 JSON
|
|
208
|
+
缓存文件遵循以下 JSON 结构:
|
|
241
209
|
|
|
242
210
|
```json
|
|
243
211
|
{
|
|
@@ -259,6 +227,32 @@ export class MCPServiceManager {
|
|
|
259
227
|
}
|
|
260
228
|
```
|
|
261
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
|
+
|
|
262
256
|
### 各字段的作用和约束条件
|
|
263
257
|
|
|
264
258
|
#### 版本字段 (`version`)
|
|
@@ -351,16 +345,21 @@ private generateConfigHash(config: MCPServiceConfig): string {
|
|
|
351
345
|
}
|
|
352
346
|
```
|
|
353
347
|
|
|
354
|
-
2.
|
|
348
|
+
2. **更新验证函数**
|
|
355
349
|
|
|
356
|
-
```
|
|
357
|
-
{
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
+
);
|
|
364
363
|
}
|
|
365
364
|
```
|
|
366
365
|
|
|
@@ -390,17 +389,6 @@ private generateConfigHash(config: MCPServiceConfig): string {
|
|
|
390
389
|
}
|
|
391
390
|
```
|
|
392
391
|
|
|
393
|
-
2. **更新 Schema 验证规则**
|
|
394
|
-
```json
|
|
395
|
-
{
|
|
396
|
-
"newField": {
|
|
397
|
-
"type": "string",
|
|
398
|
-
"minLength": 1,
|
|
399
|
-
"pattern": "^[a-zA-Z0-9_-]+$"
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
```
|
|
403
|
-
|
|
404
392
|
### 修改缓存结构的步骤和注意事项
|
|
405
393
|
|
|
406
394
|
#### 步骤清单
|
|
@@ -424,22 +412,7 @@ private generateConfigHash(config: MCPServiceConfig): string {
|
|
|
424
412
|
private readonly CACHE_VERSION = "2.0.0";
|
|
425
413
|
```
|
|
426
414
|
|
|
427
|
-
3.
|
|
428
|
-
|
|
429
|
-
```json
|
|
430
|
-
{
|
|
431
|
-
"version": "2.0.0",
|
|
432
|
-
"properties": {
|
|
433
|
-
"newField": {
|
|
434
|
-
"type": "string",
|
|
435
|
-
"description": "新字段描述"
|
|
436
|
-
}
|
|
437
|
-
},
|
|
438
|
-
"required": ["existingFields", "newField"]
|
|
439
|
-
}
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
4. **实现向后兼容**
|
|
415
|
+
3. **实现向后兼容**
|
|
443
416
|
|
|
444
417
|
```typescript
|
|
445
418
|
private migrateCache(cache: any): MCPToolsCache {
|
|
@@ -454,7 +427,7 @@ private generateConfigHash(config: MCPServiceConfig): string {
|
|
|
454
427
|
}
|
|
455
428
|
```
|
|
456
429
|
|
|
457
|
-
|
|
430
|
+
4. **更新测试用例**
|
|
458
431
|
|
|
459
432
|
```typescript
|
|
460
433
|
it("应该支持新字段", async () => {
|
|
@@ -477,7 +450,7 @@ private generateConfigHash(config: MCPServiceConfig): string {
|
|
|
477
450
|
- **版本兼容性**: 主版本号变更表示不兼容的结构变更
|
|
478
451
|
- **数据迁移**: 提供从旧版本到新版本的迁移逻辑
|
|
479
452
|
- **测试覆盖**: 确保新功能有完整的测试覆盖
|
|
480
|
-
- **文档更新**:
|
|
453
|
+
- **文档更新**: 同步更新接口文档和使用说明
|
|
481
454
|
|
|
482
455
|
### 代码贡献的最佳实践
|
|
483
456
|
|
|
@@ -705,16 +678,11 @@ describe("MCPCacheManager", () => {
|
|
|
705
678
|
cat xiaozhi.cache.json | jq . || echo "JSON 格式错误"
|
|
706
679
|
```
|
|
707
680
|
|
|
708
|
-
3. 检查 Schema 文件是否存在
|
|
709
|
-
```bash
|
|
710
|
-
ls -la xiaozhi.cache.schema.json
|
|
711
|
-
```
|
|
712
|
-
|
|
713
681
|
**解决方案**:
|
|
714
682
|
|
|
715
683
|
- 删除损坏的缓存文件,重新生成
|
|
716
|
-
- 更新 Schema 文件到最新版本
|
|
717
684
|
- 检查缓存文件中的时间戳格式
|
|
685
|
+
- 确保所有必需字段都存在
|
|
718
686
|
|
|
719
687
|
#### 问题 3: 配置变更未检测到
|
|
720
688
|
|
|
@@ -880,7 +848,7 @@ xiaozhi 的 MCP 缓存机制通过智能的数据缓存和配置变更检测,
|
|
|
880
848
|
|
|
881
849
|
## 版本兼容性
|
|
882
850
|
|
|
883
|
-
|
|
851
|
+
当前缓存文件格式版本: `1.0.0`
|
|
884
852
|
|
|
885
853
|
### 版本升级策略
|
|
886
854
|
|
|
@@ -890,9 +858,8 @@ xiaozhi 的 MCP 缓存机制通过智能的数据缓存和配置变更检测,
|
|
|
890
858
|
|
|
891
859
|
## 相关文件
|
|
892
860
|
|
|
893
|
-
- `xiaozhi.cache.schema.json`: JSON Schema 定义文件
|
|
894
861
|
- `src/services/MCPCacheManager.ts`: 缓存管理器实现
|
|
895
|
-
- `xiaozhi.cache.json`:
|
|
862
|
+
- `xiaozhi.cache.json`: 实际的缓存文件(运行时生成)
|
|
896
863
|
|
|
897
864
|
## 注意事项
|
|
898
865
|
|
|
@@ -907,12 +874,12 @@ xiaozhi 的 MCP 缓存机制通过智能的数据缓存和配置变更检测,
|
|
|
907
874
|
|
|
908
875
|
1. **时间格式错误**: 确保时间戳符合 YYYY-MM-DD HH:mm:ss 格式
|
|
909
876
|
2. **缺少必需字段**: 检查所有必需字段是否存在
|
|
910
|
-
3. **类型不匹配**:
|
|
877
|
+
3. **类型不匹配**: 确保字段类型与接口定义一致
|
|
911
878
|
4. **格式不符**: 检查版本号、哈希值等格式是否正确
|
|
912
879
|
|
|
913
880
|
### 修复建议
|
|
914
881
|
|
|
915
882
|
1. 使用 `jq` 工具检查 JSON 格式和内容
|
|
916
|
-
2.
|
|
883
|
+
2. 参考接口定义修正格式问题
|
|
917
884
|
3. 重新生成缓存文件(删除现有文件,重启服务)
|
|
918
|
-
4. 检查 MCPCacheManager 的实现逻辑
|
|
885
|
+
4. 检查 MCPCacheManager 的实现逻辑
|