@zooique/memora 0.3.0 → 2.0.0
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 +8 -8
- package/dist/agent/agent.d.ts +69 -92
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +267 -197
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +3 -0
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +14 -4
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +1 -1
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +5 -4
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/guardrail.d.ts +47 -0
- package/dist/agent/guardrail.d.ts.map +1 -0
- package/dist/agent/guardrail.js +51 -0
- package/dist/agent/guardrail.js.map +1 -0
- package/dist/agent/loop.d.ts +79 -18
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +317 -231
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/chatLockManager.d.ts +116 -0
- package/dist/agent/managers/chatLockManager.d.ts.map +1 -0
- package/dist/agent/managers/chatLockManager.js +191 -0
- package/dist/agent/managers/chatLockManager.js.map +1 -0
- package/dist/agent/managers/insightExtractor.d.ts +34 -69
- package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
- package/dist/agent/managers/insightExtractor.js +133 -189
- package/dist/agent/managers/insightExtractor.js.map +1 -1
- package/dist/agent/managers/memoryAdvisor.d.ts +102 -2
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +262 -4
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +85 -0
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.js +215 -0
- package/dist/agent/managers/memoryDecayScheduler.js.map +1 -1
- package/dist/agent/managers/memoryInspector.d.ts +230 -64
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +439 -81
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/relationBuilder.d.ts +131 -0
- package/dist/agent/managers/relationBuilder.d.ts.map +1 -0
- package/dist/agent/managers/relationBuilder.js +192 -0
- package/dist/agent/managers/relationBuilder.js.map +1 -0
- package/dist/agent/managers/sessionArchiver.d.ts +6 -0
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +68 -8
- package/dist/agent/managers/sessionArchiver.js.map +1 -1
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +9 -17
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/textPolishManager.d.ts +62 -0
- package/dist/agent/managers/textPolishManager.d.ts.map +1 -0
- package/dist/agent/managers/textPolishManager.js +99 -0
- package/dist/agent/managers/textPolishManager.js.map +1 -0
- package/dist/agent/personaMatcher.d.ts +29 -0
- package/dist/agent/personaMatcher.d.ts.map +1 -0
- package/dist/agent/personaMatcher.js +60 -0
- package/dist/agent/personaMatcher.js.map +1 -0
- package/dist/agent/toolExecutor.d.ts +2 -2
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +2 -1
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/tracer.d.ts +31 -0
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +31 -0
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +132 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +38 -0
- package/dist/agent/types.js.map +1 -1
- package/dist/config/loader.d.ts +52 -40
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +52 -32
- package/dist/config/loader.js.map +1 -1
- package/dist/eval/evalRunner.d.ts +94 -0
- package/dist/eval/evalRunner.d.ts.map +1 -0
- package/dist/eval/evalRunner.js +141 -0
- package/dist/eval/evalRunner.js.map +1 -0
- package/dist/eval/evalTypes.d.ts +33 -3
- package/dist/eval/evalTypes.d.ts.map +1 -1
- package/dist/eval/evalTypes.js +18 -2
- package/dist/eval/evalTypes.js.map +1 -1
- package/dist/eval/scenarios.d.ts +33 -0
- package/dist/eval/scenarios.d.ts.map +1 -0
- package/dist/eval/scenarios.js +109 -0
- package/dist/eval/scenarios.js.map +1 -0
- package/dist/index.d.ts +51 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -6
- package/dist/index.js.map +1 -1
- package/dist/llm/abortSignal.d.ts +27 -0
- package/dist/llm/abortSignal.d.ts.map +1 -0
- package/dist/llm/abortSignal.js +44 -0
- package/dist/llm/abortSignal.js.map +1 -0
- package/dist/llm/embedding.d.ts +7 -2
- package/dist/llm/embedding.d.ts.map +1 -1
- package/dist/llm/embedding.js +66 -46
- package/dist/llm/embedding.js.map +1 -1
- package/dist/llm/factory.js +1 -1
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +26 -27
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/llm/provider.d.ts +0 -14
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js.map +1 -1
- package/dist/logging/logger.d.ts +1 -0
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +43 -37
- package/dist/logging/logger.js.map +1 -1
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +8 -7
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/lockManager.d.ts +48 -0
- package/dist/memory/lockManager.d.ts.map +1 -0
- package/dist/memory/lockManager.js +159 -0
- package/dist/memory/lockManager.js.map +1 -0
- package/dist/memory/projectManager.d.ts +23 -53
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +46 -227
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +62 -0
- package/dist/memory/projectRegistry.d.ts.map +1 -0
- package/dist/memory/projectRegistry.js +158 -0
- package/dist/memory/projectRegistry.js.map +1 -0
- package/dist/memory/recall.d.ts +3 -3
- package/dist/memory/recall.d.ts.map +1 -1
- package/dist/memory/recall.js +3 -3
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/sourceValidation.d.ts +49 -0
- package/dist/memory/sourceValidation.d.ts.map +1 -0
- package/dist/memory/sourceValidation.js +141 -0
- package/dist/memory/sourceValidation.js.map +1 -0
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +2 -1
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.d.ts +0 -47
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +0 -138
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/vectorStore.d.ts +82 -7
- package/dist/memory/vectorStore.d.ts.map +1 -1
- package/dist/memory/vectorStore.js +12 -8
- package/dist/memory/vectorStore.js.map +1 -1
- package/dist/persona/personaManager.d.ts +30 -4
- package/dist/persona/personaManager.d.ts.map +1 -1
- package/dist/persona/personaManager.js +47 -14
- package/dist/persona/personaManager.js.map +1 -1
- package/dist/security/pathGuard.d.ts.map +1 -1
- package/dist/security/pathGuard.js +3 -1
- package/dist/security/pathGuard.js.map +1 -1
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +2 -1
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/utils/array.d.ts +24 -0
- package/dist/utils/array.d.ts.map +1 -0
- package/dist/utils/array.js +24 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/errors.d.ts +10 -8
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +12 -9
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +7 -0
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/objects.d.ts +17 -0
- package/dist/utils/objects.d.ts.map +1 -0
- package/dist/utils/objects.js +19 -0
- package/dist/utils/objects.js.map +1 -0
- package/dist/utils/segmenter.d.ts +17 -0
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +26 -0
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +22 -1
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +29 -1
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/time.d.ts +18 -3
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/utils/time.js +24 -8
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/toError.d.ts +8 -4
- package/dist/utils/toError.d.ts.map +1 -1
- package/dist/utils/toError.js +25 -5
- package/dist/utils/toError.js.map +1 -1
- package/package.json +11 -1
package/dist/agent/types.js
CHANGED
|
@@ -14,6 +14,44 @@
|
|
|
14
14
|
*
|
|
15
15
|
* error 事件:流式过程中发生错误(如 LLM 超时、连接断开),
|
|
16
16
|
* 替代裸 throw 让宿主能优雅展示错误并清理 UI(避免未处理 rejection 静默卡死)。
|
|
17
|
+
*
|
|
18
|
+
* ─── agent/ 模块依赖图(最后更新:2026-07-16) ─────────────────
|
|
19
|
+
* 如需精确依赖关系,请阅读各文件 import 语句。本图仅展示高层模块关系。
|
|
20
|
+
*
|
|
21
|
+
* agent.ts(门面,Agent 类)
|
|
22
|
+
* ├─ assembler.ts(组件装配,init 阶段)
|
|
23
|
+
* ├─ loop.ts(主循环,chat 阶段)
|
|
24
|
+
* │ ├─ toolExecutor.ts(工具执行)
|
|
25
|
+
* │ ├─ contextManager.ts(上下文窗口管理)
|
|
26
|
+
* │ ├─ messageHistory.ts(历史消息存储)
|
|
27
|
+
* │ ├─ guardrail.ts(护栏规则)
|
|
28
|
+
* │ └─ tracer.ts(可观测性 span)
|
|
29
|
+
* ├─ personaMatcher.ts(LLM 角色匹配,从 persona 迁入)
|
|
30
|
+
* ├─ userFactExtractor.ts(用户事实提取,纯函数)
|
|
31
|
+
* ├─ builtinToolHandlers.ts(内置工具处理器)
|
|
32
|
+
* └─ managers/(12 个专职 Manager)
|
|
33
|
+
* ├─ chatLockManager.ts(并发锁,token 机制)
|
|
34
|
+
* ├─ configManager.ts(配置加载)
|
|
35
|
+
* ├─ contextManager.ts(上下文管理)
|
|
36
|
+
* ├─ insightExtractor.ts(LLM 提炼,prompt 独立函数)
|
|
37
|
+
* ├─ memoryInspector.ts(记忆读写统一入口,ADR-014)
|
|
38
|
+
* ├─ memoryDecayScheduler.ts(记忆衰减调度)
|
|
39
|
+
* ├─ memoryAdvisor.ts(记忆建议)
|
|
40
|
+
* ├─ relationBuilder.ts(记忆关系构建,ADR-014 侧车)
|
|
41
|
+
* ├─ archiveCoordinator.ts(归档协调,emit archiveFailed)
|
|
42
|
+
* ├─ sessionArchiver.ts(会话归档)
|
|
43
|
+
* ├─ sessionManager.ts(会话状态)
|
|
44
|
+
* ├─ textPolishManager.ts(文本润色)
|
|
45
|
+
* ├─ autoConfigRefiner.ts(配置自动优化)
|
|
46
|
+
* └─ workProjection.ts(作品投影)
|
|
47
|
+
*
|
|
48
|
+
* 分层依赖方向(ADR-008):
|
|
49
|
+
* agent/ → memory/ → storage/(不可反向)
|
|
50
|
+
* agent/ → persona/(不可反向,persona 不调 LLM)
|
|
51
|
+
* agent/ → llm/(provider 注入)
|
|
52
|
+
* agent/ → skill/(技能加载)
|
|
53
|
+
* agent/ → config/(配置加载)
|
|
54
|
+
* ──────────────────────────────────────────────────────────
|
|
17
55
|
*/
|
|
18
56
|
export {};
|
|
19
57
|
//# sourceMappingURL=types.js.map
|
package/dist/agent/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG"}
|
package/dist/config/loader.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
declare const ConfigSchema: z.ZodObject<{
|
|
3
|
-
llm: z.ZodObject<{
|
|
3
|
+
llm: z.ZodDefault<z.ZodObject<{
|
|
4
4
|
provider: z.ZodDefault<z.ZodString>;
|
|
5
5
|
model: z.ZodDefault<z.ZodString>;
|
|
6
6
|
baseUrl: z.ZodOptional<z.ZodString>;
|
|
@@ -20,18 +20,22 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
20
20
|
apiKey: z.ZodOptional<z.ZodString>;
|
|
21
21
|
/** 该 Provider 的 temperature,未配置时回退到全局 llm.temperature */
|
|
22
22
|
temperature: z.ZodOptional<z.ZodNumber>;
|
|
23
|
+
/** 该 Provider 的上下文窗口大小(token 数),未配置时回退到 memory.maxContextTokens */
|
|
24
|
+
contextWindow: z.ZodOptional<z.ZodNumber>;
|
|
23
25
|
}, "strip", z.ZodTypeAny, {
|
|
24
26
|
model: string;
|
|
25
27
|
provider: string;
|
|
26
28
|
apiKey?: string | undefined;
|
|
27
29
|
temperature?: number | undefined;
|
|
28
30
|
baseUrl?: string | undefined;
|
|
31
|
+
contextWindow?: number | undefined;
|
|
29
32
|
}, {
|
|
30
33
|
model: string;
|
|
31
34
|
provider: string;
|
|
32
35
|
apiKey?: string | undefined;
|
|
33
36
|
temperature?: number | undefined;
|
|
34
37
|
baseUrl?: string | undefined;
|
|
38
|
+
contextWindow?: number | undefined;
|
|
35
39
|
}>>>;
|
|
36
40
|
/**
|
|
37
41
|
* 当前激活的 Provider 别名
|
|
@@ -70,13 +74,6 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
70
74
|
temperature: number;
|
|
71
75
|
model: string;
|
|
72
76
|
provider: string;
|
|
73
|
-
background?: {
|
|
74
|
-
temperature: number;
|
|
75
|
-
model: string;
|
|
76
|
-
provider: string;
|
|
77
|
-
apiKey?: string | undefined;
|
|
78
|
-
baseUrl?: string | undefined;
|
|
79
|
-
} | undefined;
|
|
80
77
|
apiKey?: string | undefined;
|
|
81
78
|
active?: string | undefined;
|
|
82
79
|
baseUrl?: string | undefined;
|
|
@@ -86,15 +83,16 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
86
83
|
apiKey?: string | undefined;
|
|
87
84
|
temperature?: number | undefined;
|
|
88
85
|
baseUrl?: string | undefined;
|
|
86
|
+
contextWindow?: number | undefined;
|
|
89
87
|
}> | undefined;
|
|
90
|
-
}, {
|
|
91
88
|
background?: {
|
|
89
|
+
temperature: number;
|
|
92
90
|
model: string;
|
|
93
91
|
provider: string;
|
|
94
92
|
apiKey?: string | undefined;
|
|
95
|
-
temperature?: number | undefined;
|
|
96
93
|
baseUrl?: string | undefined;
|
|
97
94
|
} | undefined;
|
|
95
|
+
}, {
|
|
98
96
|
apiKey?: string | undefined;
|
|
99
97
|
temperature?: number | undefined;
|
|
100
98
|
model?: string | undefined;
|
|
@@ -107,19 +105,27 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
107
105
|
apiKey?: string | undefined;
|
|
108
106
|
temperature?: number | undefined;
|
|
109
107
|
baseUrl?: string | undefined;
|
|
108
|
+
contextWindow?: number | undefined;
|
|
110
109
|
}> | undefined;
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
background?: {
|
|
111
|
+
model: string;
|
|
112
|
+
provider: string;
|
|
113
|
+
apiKey?: string | undefined;
|
|
114
|
+
temperature?: number | undefined;
|
|
115
|
+
baseUrl?: string | undefined;
|
|
116
|
+
} | undefined;
|
|
117
|
+
}>>;
|
|
118
|
+
memory: z.ZodDefault<z.ZodObject<{
|
|
113
119
|
dataDir: z.ZodDefault<z.ZodString>;
|
|
114
120
|
maxContextTokens: z.ZodDefault<z.ZodNumber>;
|
|
115
121
|
}, "strip", z.ZodTypeAny, {
|
|
116
|
-
maxContextTokens: number;
|
|
117
122
|
dataDir: string;
|
|
123
|
+
maxContextTokens: number;
|
|
118
124
|
}, {
|
|
119
|
-
maxContextTokens?: number | undefined;
|
|
120
125
|
dataDir?: string | undefined;
|
|
121
|
-
|
|
122
|
-
|
|
126
|
+
maxContextTokens?: number | undefined;
|
|
127
|
+
}>>;
|
|
128
|
+
security: z.ZodDefault<z.ZodObject<{
|
|
123
129
|
permission: z.ZodDefault<z.ZodEnum<["owner", "guest"]>>;
|
|
124
130
|
confirmWrites: z.ZodDefault<z.ZodBoolean>;
|
|
125
131
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -128,7 +134,7 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
128
134
|
}, {
|
|
129
135
|
permission?: "owner" | "guest" | undefined;
|
|
130
136
|
confirmWrites?: boolean | undefined;
|
|
131
|
-
}
|
|
137
|
+
}>>;
|
|
132
138
|
allowedPaths: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
133
139
|
persona: z.ZodOptional<z.ZodString>;
|
|
134
140
|
/**
|
|
@@ -155,13 +161,6 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
155
161
|
temperature: number;
|
|
156
162
|
model: string;
|
|
157
163
|
provider: string;
|
|
158
|
-
background?: {
|
|
159
|
-
temperature: number;
|
|
160
|
-
model: string;
|
|
161
|
-
provider: string;
|
|
162
|
-
apiKey?: string | undefined;
|
|
163
|
-
baseUrl?: string | undefined;
|
|
164
|
-
} | undefined;
|
|
165
164
|
apiKey?: string | undefined;
|
|
166
165
|
active?: string | undefined;
|
|
167
166
|
baseUrl?: string | undefined;
|
|
@@ -171,15 +170,23 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
171
170
|
apiKey?: string | undefined;
|
|
172
171
|
temperature?: number | undefined;
|
|
173
172
|
baseUrl?: string | undefined;
|
|
173
|
+
contextWindow?: number | undefined;
|
|
174
174
|
}> | undefined;
|
|
175
|
+
background?: {
|
|
176
|
+
temperature: number;
|
|
177
|
+
model: string;
|
|
178
|
+
provider: string;
|
|
179
|
+
apiKey?: string | undefined;
|
|
180
|
+
baseUrl?: string | undefined;
|
|
181
|
+
} | undefined;
|
|
175
182
|
};
|
|
176
183
|
security: {
|
|
177
184
|
permission: "owner" | "guest";
|
|
178
185
|
confirmWrites: boolean;
|
|
179
186
|
};
|
|
180
187
|
memory: {
|
|
181
|
-
maxContextTokens: number;
|
|
182
188
|
dataDir: string;
|
|
189
|
+
maxContextTokens: number;
|
|
183
190
|
};
|
|
184
191
|
allowedPaths: string[];
|
|
185
192
|
persona?: string | undefined;
|
|
@@ -189,14 +196,8 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
189
196
|
baseUrl?: string | undefined;
|
|
190
197
|
} | undefined;
|
|
191
198
|
}, {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
model: string;
|
|
195
|
-
provider: string;
|
|
196
|
-
apiKey?: string | undefined;
|
|
197
|
-
temperature?: number | undefined;
|
|
198
|
-
baseUrl?: string | undefined;
|
|
199
|
-
} | undefined;
|
|
199
|
+
persona?: string | undefined;
|
|
200
|
+
llm?: {
|
|
200
201
|
apiKey?: string | undefined;
|
|
201
202
|
temperature?: number | undefined;
|
|
202
203
|
model?: string | undefined;
|
|
@@ -209,17 +210,24 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
209
210
|
apiKey?: string | undefined;
|
|
210
211
|
temperature?: number | undefined;
|
|
211
212
|
baseUrl?: string | undefined;
|
|
213
|
+
contextWindow?: number | undefined;
|
|
212
214
|
}> | undefined;
|
|
213
|
-
|
|
214
|
-
|
|
215
|
+
background?: {
|
|
216
|
+
model: string;
|
|
217
|
+
provider: string;
|
|
218
|
+
apiKey?: string | undefined;
|
|
219
|
+
temperature?: number | undefined;
|
|
220
|
+
baseUrl?: string | undefined;
|
|
221
|
+
} | undefined;
|
|
222
|
+
} | undefined;
|
|
223
|
+
security?: {
|
|
215
224
|
permission?: "owner" | "guest" | undefined;
|
|
216
225
|
confirmWrites?: boolean | undefined;
|
|
217
|
-
};
|
|
218
|
-
memory
|
|
219
|
-
maxContextTokens?: number | undefined;
|
|
226
|
+
} | undefined;
|
|
227
|
+
memory?: {
|
|
220
228
|
dataDir?: string | undefined;
|
|
221
|
-
|
|
222
|
-
|
|
229
|
+
maxContextTokens?: number | undefined;
|
|
230
|
+
} | undefined;
|
|
223
231
|
allowedPaths?: string[] | undefined;
|
|
224
232
|
embedding?: {
|
|
225
233
|
model: string;
|
|
@@ -230,6 +238,10 @@ declare const ConfigSchema: z.ZodObject<{
|
|
|
230
238
|
export type Config = z.infer<typeof ConfigSchema>;
|
|
231
239
|
/**
|
|
232
240
|
* 加载配置
|
|
241
|
+
*
|
|
242
|
+
* 单一真理源:所有默认值由 ConfigSchema 的 .default() 声明,
|
|
243
|
+
* 不再维护独立的 DEFAULT_CONFIG 常量(避免两处真理源打架)。
|
|
244
|
+
*
|
|
233
245
|
* @param configPath 显式指定的配置文件路径
|
|
234
246
|
*/
|
|
235
247
|
export declare function loadConfig(configPath?: string): Promise<Config>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgCxB,QAAA,MAAM,YAAY;;;;;;;QASZ;;;;;;WAMG;;;;;;YA7BP,yDAAyD;;YAEzD,mEAAmE;;;;;;;;;;;;;;;;;QA6B/D;;;;;WAKG;;QAEH;;;;;;WAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4BP;;;;;OAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQH,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BrE"}
|
package/dist/config/loader.js
CHANGED
|
@@ -35,13 +35,20 @@ const ProviderConfigSchema = z.object({
|
|
|
35
35
|
apiKey: z.string().optional(),
|
|
36
36
|
/** 该 Provider 的 temperature,未配置时回退到全局 llm.temperature */
|
|
37
37
|
temperature: z.number().min(0).max(2).optional(),
|
|
38
|
+
/** 该 Provider 的上下文窗口大小(token 数),未配置时回退到 memory.maxContextTokens */
|
|
39
|
+
contextWindow: z.number().optional(),
|
|
38
40
|
});
|
|
39
41
|
// 配置 schema(运行时校验)
|
|
40
42
|
// provider 允许任意字符串:预设(mock/deepseek/doubao/openai)开箱即用,
|
|
41
43
|
// 自定义 provider(如 mimo、自部署模型)只要显式配 baseUrl + model 即可
|
|
42
44
|
// 详见 ADR-003
|
|
45
|
+
//
|
|
46
|
+
// 单一真理源:所有默认值由 .default() 声明,ConfigSchema.parse({}) 即可得到完整默认配置。
|
|
47
|
+
// 嵌套对象(llm/memory/security)必须用 .default({}) 声明整体默认值,
|
|
48
|
+
// 否则 zod 会在对象缺失时报 "Required" 而非使用内部字段的 default。
|
|
43
49
|
const ConfigSchema = z.object({
|
|
44
|
-
llm: z
|
|
50
|
+
llm: z
|
|
51
|
+
.object({
|
|
45
52
|
// 旧格式:单一 provider 扁平字段(向后兼容,providers 未配置时生效)
|
|
46
53
|
provider: z.string().default('mock'),
|
|
47
54
|
model: z.string().default('deepseek-chat'),
|
|
@@ -79,15 +86,20 @@ const ConfigSchema = z.object({
|
|
|
79
86
|
temperature: z.number().min(0).max(2).default(0.5),
|
|
80
87
|
})
|
|
81
88
|
.optional(),
|
|
82
|
-
})
|
|
83
|
-
|
|
89
|
+
})
|
|
90
|
+
.default({}),
|
|
91
|
+
memory: z
|
|
92
|
+
.object({
|
|
84
93
|
dataDir: z.string().default('~/.memora'),
|
|
85
94
|
maxContextTokens: z.number().default(DEFAULT_MAX_CONTEXT_TOKENS),
|
|
86
|
-
})
|
|
87
|
-
|
|
95
|
+
})
|
|
96
|
+
.default({}),
|
|
97
|
+
security: z
|
|
98
|
+
.object({
|
|
88
99
|
permission: z.enum(['owner', 'guest']).default('owner'),
|
|
89
100
|
confirmWrites: z.boolean().default(false),
|
|
90
|
-
})
|
|
101
|
+
})
|
|
102
|
+
.default({}),
|
|
91
103
|
// 允许的路径白名单(绝对路径)
|
|
92
104
|
allowedPaths: z.array(z.string()).default([]),
|
|
93
105
|
// 默认角色名(对应 personas/*.md)
|
|
@@ -106,26 +118,12 @@ const ConfigSchema = z.object({
|
|
|
106
118
|
})
|
|
107
119
|
.optional(),
|
|
108
120
|
});
|
|
109
|
-
const DEFAULT_CONFIG = {
|
|
110
|
-
llm: {
|
|
111
|
-
provider: 'mock',
|
|
112
|
-
model: 'mock-model',
|
|
113
|
-
temperature: 0.7,
|
|
114
|
-
},
|
|
115
|
-
memory: {
|
|
116
|
-
dataDir: '~/.memora',
|
|
117
|
-
maxContextTokens: DEFAULT_MAX_CONTEXT_TOKENS,
|
|
118
|
-
},
|
|
119
|
-
security: {
|
|
120
|
-
permission: 'owner',
|
|
121
|
-
confirmWrites: false,
|
|
122
|
-
},
|
|
123
|
-
allowedPaths: [],
|
|
124
|
-
persona: undefined,
|
|
125
|
-
embedding: undefined,
|
|
126
|
-
};
|
|
127
121
|
/**
|
|
128
122
|
* 加载配置
|
|
123
|
+
*
|
|
124
|
+
* 单一真理源:所有默认值由 ConfigSchema 的 .default() 声明,
|
|
125
|
+
* 不再维护独立的 DEFAULT_CONFIG 常量(避免两处真理源打架)。
|
|
126
|
+
*
|
|
129
127
|
* @param configPath 显式指定的配置文件路径
|
|
130
128
|
*/
|
|
131
129
|
export async function loadConfig(configPath) {
|
|
@@ -150,10 +148,10 @@ export async function loadConfig(configPath) {
|
|
|
150
148
|
return expandEnvVars(mergeWithDefaults(config));
|
|
151
149
|
}
|
|
152
150
|
catch {
|
|
153
|
-
//
|
|
151
|
+
// 用户级不存在,使用 schema 默认值(单一真理源)
|
|
154
152
|
}
|
|
155
|
-
// 4.
|
|
156
|
-
return expandEnvVars(
|
|
153
|
+
// 4. 内置默认:ConfigSchema.parse({}) 让 zod 的 .default() 生效
|
|
154
|
+
return expandEnvVars(ConfigSchema.parse({}));
|
|
157
155
|
}
|
|
158
156
|
/**
|
|
159
157
|
* 读取并解析 JSON 文件
|
|
@@ -164,19 +162,23 @@ async function readJsonFile(path) {
|
|
|
164
162
|
}
|
|
165
163
|
/**
|
|
166
164
|
* 合并用户配置与默认值
|
|
165
|
+
*
|
|
166
|
+
* 直接用 ConfigSchema.parse(userConfig),让 zod 的 .default() 填充缺失字段。
|
|
167
|
+
* 不再 spread DEFAULT_CONFIG,避免覆盖 schema default。
|
|
167
168
|
*/
|
|
168
169
|
function mergeWithDefaults(userConfig) {
|
|
169
|
-
return ConfigSchema.parse(
|
|
170
|
-
...DEFAULT_CONFIG,
|
|
171
|
-
...userConfig,
|
|
172
|
-
});
|
|
170
|
+
return ConfigSchema.parse(userConfig);
|
|
173
171
|
}
|
|
174
172
|
/**
|
|
175
173
|
* 展开 ${ENV_VAR} 占位符
|
|
176
174
|
* 配置文件可写 "apiKey": "${MEMORA_LLM_API_KEY}"
|
|
177
175
|
* 实际读取时展开为环境变量值
|
|
178
176
|
*
|
|
179
|
-
*
|
|
177
|
+
* 展开范围覆盖所有可能包含敏感信息的通道:
|
|
178
|
+
* - llm(前台主通道):apiKey / baseUrl
|
|
179
|
+
* - llm.providers(多 Provider 映射表):每个 Provider 的 apiKey / baseUrl
|
|
180
|
+
* - llm.background(后台通道):apiKey / baseUrl
|
|
181
|
+
* - embedding(向量嵌入通道):apiKey / baseUrl
|
|
180
182
|
*/
|
|
181
183
|
function expandEnvVars(config) {
|
|
182
184
|
const expand = (val) => {
|
|
@@ -192,6 +194,22 @@ function expandEnvVars(config) {
|
|
|
192
194
|
{ ...p, apiKey: expand(p.apiKey), baseUrl: expand(p.baseUrl) },
|
|
193
195
|
]))
|
|
194
196
|
: undefined;
|
|
197
|
+
// 展开 background 后台通道的环境变量(与前台 llm 通道同模式)
|
|
198
|
+
const expandedBackground = config.llm.background
|
|
199
|
+
? {
|
|
200
|
+
...config.llm.background,
|
|
201
|
+
apiKey: expand(config.llm.background.apiKey),
|
|
202
|
+
baseUrl: expand(config.llm.background.baseUrl),
|
|
203
|
+
}
|
|
204
|
+
: undefined;
|
|
205
|
+
// 展开 embedding 向量嵌入通道的环境变量
|
|
206
|
+
const expandedEmbedding = config.embedding
|
|
207
|
+
? {
|
|
208
|
+
...config.embedding,
|
|
209
|
+
apiKey: expand(config.embedding.apiKey),
|
|
210
|
+
baseUrl: expand(config.embedding.baseUrl),
|
|
211
|
+
}
|
|
212
|
+
: undefined;
|
|
195
213
|
return {
|
|
196
214
|
...config,
|
|
197
215
|
llm: {
|
|
@@ -199,7 +217,9 @@ function expandEnvVars(config) {
|
|
|
199
217
|
apiKey: expand(config.llm.apiKey),
|
|
200
218
|
baseUrl: expand(config.llm.baseUrl),
|
|
201
219
|
providers: expandedProviders,
|
|
220
|
+
background: expandedBackground,
|
|
202
221
|
},
|
|
222
|
+
embedding: expandedEmbedding,
|
|
203
223
|
};
|
|
204
224
|
}
|
|
205
225
|
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;GAOG;AACH,MAAM,0BAA0B,GAAG,OAAO,CAAC;AAE3C,4CAA4C;AAC5C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,yDAAyD;IACzD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EvalRunner — Agent 行为评估执行器
|
|
3
|
+
*
|
|
4
|
+
* 职责:通过 createAgent 工厂构造测试条件 → 执行场景 →
|
|
5
|
+
* 收集 AgentChunk → 评估结果 → 汇总报告
|
|
6
|
+
*
|
|
7
|
+
* 设计要点:
|
|
8
|
+
* - 每个场景创建独立 Agent(通过工厂函数),避免状态污染
|
|
9
|
+
* - 场景执行后 close(),避免资源泄漏
|
|
10
|
+
* - 错误隔离:单个场景失败不中断其他场景
|
|
11
|
+
* - 超时保护:scenarioTimeoutMs 防止卡死(Promise.race + AbortController)
|
|
12
|
+
*
|
|
13
|
+
* 内核零依赖约束:仅使用 memora 内部模块,不引入新依赖。
|
|
14
|
+
*/
|
|
15
|
+
import type { Agent } from '../agent/agent.js';
|
|
16
|
+
import type { EvalScenario, EvalResult } from './evalTypes.js';
|
|
17
|
+
/**
|
|
18
|
+
* EvalRunner 构造选项
|
|
19
|
+
*/
|
|
20
|
+
export interface EvalRunnerOptions {
|
|
21
|
+
/**
|
|
22
|
+
* Agent 工厂函数(每个场景创建新 Agent)
|
|
23
|
+
*
|
|
24
|
+
* 工厂函数负责配置 MockProvider、guardrail 规则、预写入记忆等测试条件。
|
|
25
|
+
* EvalRunner 负责调用 init() / chat() / close() 管理 Agent 生命周期。
|
|
26
|
+
*/
|
|
27
|
+
createAgent: () => Agent;
|
|
28
|
+
/**
|
|
29
|
+
* 单个场景超时_ms(默认 10000)
|
|
30
|
+
*
|
|
31
|
+
* 超时后通过 AbortController 中断 agent.chat,
|
|
32
|
+
* 返回 passed=false 的 EvalResult。
|
|
33
|
+
*/
|
|
34
|
+
scenarioTimeoutMs?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 批量执行汇总报告
|
|
38
|
+
*/
|
|
39
|
+
export interface EvalSummary {
|
|
40
|
+
/** 每个场景的评估结果(按执行顺序) */
|
|
41
|
+
results: EvalResult[];
|
|
42
|
+
/** 通过场景数 */
|
|
43
|
+
passed: number;
|
|
44
|
+
/** 失败场景数 */
|
|
45
|
+
failed: number;
|
|
46
|
+
/** 场景总数 */
|
|
47
|
+
total: number;
|
|
48
|
+
/** 执行总耗时_ms */
|
|
49
|
+
durationMs: number;
|
|
50
|
+
/** 失败场景名列表 */
|
|
51
|
+
failedScenarios: string[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Agent 行为评估执行器
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* const runner = new EvalRunner({
|
|
59
|
+
* createAgent: () => new Agent({ projectPath, provider, configDir, dataDir, ... }),
|
|
60
|
+
* scenarioTimeoutMs: 15000,
|
|
61
|
+
* });
|
|
62
|
+
* const summary = await runner.runScenarios(EVAL_SCENARIOS);
|
|
63
|
+
* console.log(`通过 ${summary.passed}/${summary.total},耗时 ${summary.durationMs}ms`);
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare class EvalRunner {
|
|
67
|
+
#private;
|
|
68
|
+
constructor(opts: EvalRunnerOptions);
|
|
69
|
+
/**
|
|
70
|
+
* 执行单个评估场景
|
|
71
|
+
*
|
|
72
|
+
* 流程:创建 Agent → init() → chat(input) → collectAgentChunks → evaluateResult
|
|
73
|
+
*
|
|
74
|
+
* 错误隔离:任何异常(超时、Agent 抛错)都返回 passed=false 的 EvalResult,
|
|
75
|
+
* 不向上抛出,确保 runScenarios 批量执行时单个失败不中断其他场景。
|
|
76
|
+
*
|
|
77
|
+
* Agent 生命周期:每个场景执行后 close(),避免资源泄漏(try/finally 保证)。
|
|
78
|
+
*
|
|
79
|
+
* @param scenario 评估场景定义
|
|
80
|
+
* @returns 评估结果(始终返回,不抛异常)
|
|
81
|
+
*/
|
|
82
|
+
runScenario(scenario: EvalScenario): Promise<EvalResult>;
|
|
83
|
+
/**
|
|
84
|
+
* 批量执行评估场景并汇总报告
|
|
85
|
+
*
|
|
86
|
+
* 顺序执行(非并行),每个场景创建独立 Agent,避免状态污染。
|
|
87
|
+
* 错误隔离:单个场景失败不中断其他场景(由 runScenario 保证)。
|
|
88
|
+
*
|
|
89
|
+
* @param scenarios 场景列表
|
|
90
|
+
* @returns 汇总报告
|
|
91
|
+
*/
|
|
92
|
+
runScenarios(scenarios: readonly EvalScenario[]): Promise<EvalSummary>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=evalRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evalRunner.d.ts","sourceRoot":"","sources":["../../src/eval/evalRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG/D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,WAAW,EAAE,MAAM,KAAK,CAAC;IAEzB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,YAAY;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,eAAe;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAKD;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAU;;gBAMT,IAAI,EAAE,iBAAiB;IAKnC;;;;;;;;;;;;OAYG;IACG,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IA0B9D;;;;;;;;OAQG;IACG,YAAY,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;CA6D7E"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EvalRunner — Agent 行为评估执行器
|
|
3
|
+
*
|
|
4
|
+
* 职责:通过 createAgent 工厂构造测试条件 → 执行场景 →
|
|
5
|
+
* 收集 AgentChunk → 评估结果 → 汇总报告
|
|
6
|
+
*
|
|
7
|
+
* 设计要点:
|
|
8
|
+
* - 每个场景创建独立 Agent(通过工厂函数),避免状态污染
|
|
9
|
+
* - 场景执行后 close(),避免资源泄漏
|
|
10
|
+
* - 错误隔离:单个场景失败不中断其他场景
|
|
11
|
+
* - 超时保护:scenarioTimeoutMs 防止卡死(Promise.race + AbortController)
|
|
12
|
+
*
|
|
13
|
+
* 内核零依赖约束:仅使用 memora 内部模块,不引入新依赖。
|
|
14
|
+
*/
|
|
15
|
+
import { collectAgentChunks, evaluateResult } from './evalTypes.js';
|
|
16
|
+
/** 默认场景超时_ms */
|
|
17
|
+
const DEFAULT_SCENARIO_TIMEOUT_MS = 10_000;
|
|
18
|
+
/**
|
|
19
|
+
* Agent 行为评估执行器
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const runner = new EvalRunner({
|
|
24
|
+
* createAgent: () => new Agent({ projectPath, provider, configDir, dataDir, ... }),
|
|
25
|
+
* scenarioTimeoutMs: 15000,
|
|
26
|
+
* });
|
|
27
|
+
* const summary = await runner.runScenarios(EVAL_SCENARIOS);
|
|
28
|
+
* console.log(`通过 ${summary.passed}/${summary.total},耗时 ${summary.durationMs}ms`);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export class EvalRunner {
|
|
32
|
+
/** Agent 工厂函数 */
|
|
33
|
+
#createAgent;
|
|
34
|
+
/** 单场景超时_ms */
|
|
35
|
+
#scenarioTimeoutMs;
|
|
36
|
+
constructor(opts) {
|
|
37
|
+
this.#createAgent = opts.createAgent;
|
|
38
|
+
this.#scenarioTimeoutMs = opts.scenarioTimeoutMs ?? DEFAULT_SCENARIO_TIMEOUT_MS;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 执行单个评估场景
|
|
42
|
+
*
|
|
43
|
+
* 流程:创建 Agent → init() → chat(input) → collectAgentChunks → evaluateResult
|
|
44
|
+
*
|
|
45
|
+
* 错误隔离:任何异常(超时、Agent 抛错)都返回 passed=false 的 EvalResult,
|
|
46
|
+
* 不向上抛出,确保 runScenarios 批量执行时单个失败不中断其他场景。
|
|
47
|
+
*
|
|
48
|
+
* Agent 生命周期:每个场景执行后 close(),避免资源泄漏(try/finally 保证)。
|
|
49
|
+
*
|
|
50
|
+
* @param scenario 评估场景定义
|
|
51
|
+
* @returns 评估结果(始终返回,不抛异常)
|
|
52
|
+
*/
|
|
53
|
+
async runScenario(scenario) {
|
|
54
|
+
const agent = this.#createAgent();
|
|
55
|
+
try {
|
|
56
|
+
await agent.init();
|
|
57
|
+
const collected = await this.#runWithTimeout(agent, scenario.input);
|
|
58
|
+
return evaluateResult(scenario.name, collected, scenario.expect);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
// 错误隔离:返回 passed=false 的 EvalResult,不向上抛出
|
|
62
|
+
return {
|
|
63
|
+
name: scenario.name,
|
|
64
|
+
passed: false,
|
|
65
|
+
collected: {
|
|
66
|
+
toolsCalled: [],
|
|
67
|
+
recallCount: 0,
|
|
68
|
+
guardrailBlocked: false,
|
|
69
|
+
done: false,
|
|
70
|
+
},
|
|
71
|
+
failures: [
|
|
72
|
+
`场景执行异常:${err instanceof Error ? err.message : String(err)}`,
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
await agent.close();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 批量执行评估场景并汇总报告
|
|
82
|
+
*
|
|
83
|
+
* 顺序执行(非并行),每个场景创建独立 Agent,避免状态污染。
|
|
84
|
+
* 错误隔离:单个场景失败不中断其他场景(由 runScenario 保证)。
|
|
85
|
+
*
|
|
86
|
+
* @param scenarios 场景列表
|
|
87
|
+
* @returns 汇总报告
|
|
88
|
+
*/
|
|
89
|
+
async runScenarios(scenarios) {
|
|
90
|
+
const start = Date.now();
|
|
91
|
+
const results = [];
|
|
92
|
+
for (const scenario of scenarios) {
|
|
93
|
+
const result = await this.runScenario(scenario);
|
|
94
|
+
results.push(result);
|
|
95
|
+
}
|
|
96
|
+
const passed = results.filter((r) => r.passed).length;
|
|
97
|
+
const failed = results.length - passed;
|
|
98
|
+
return {
|
|
99
|
+
results,
|
|
100
|
+
passed,
|
|
101
|
+
failed,
|
|
102
|
+
total: results.length,
|
|
103
|
+
durationMs: Date.now() - start,
|
|
104
|
+
failedScenarios: results.filter((r) => !r.passed).map((r) => r.name),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 带超时执行单个场景的 chat
|
|
109
|
+
*
|
|
110
|
+
* 使用 Promise.race 实现超时:
|
|
111
|
+
* - 正常完成 → 返回 collected 行为数据
|
|
112
|
+
* - 超时 → reject Error(被 runScenario 的 catch 捕获)
|
|
113
|
+
*
|
|
114
|
+
* 超时后通过 AbortController.abort() 中断 agent.chat,
|
|
115
|
+
* 避免后台 generator 无限挂起。agent.close() 在 runScenario 的 finally 中调用,
|
|
116
|
+
* 确保即使超时后资源也被正确清理。
|
|
117
|
+
*/
|
|
118
|
+
async #runWithTimeout(agent, input) {
|
|
119
|
+
const controller = new AbortController();
|
|
120
|
+
let timer;
|
|
121
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
122
|
+
timer = setTimeout(() => {
|
|
123
|
+
controller.abort();
|
|
124
|
+
reject(new Error(`场景超时(${this.#scenarioTimeoutMs}ms)`));
|
|
125
|
+
}, this.#scenarioTimeoutMs);
|
|
126
|
+
});
|
|
127
|
+
const runPromise = collectAgentChunks(agent.chat(input, controller.signal));
|
|
128
|
+
// 抑制超时后 runPromise 可能产生的 unhandled rejection
|
|
129
|
+
// (超时后 agent.chat 被 abort,collectAgentChunks 可能在后台 resolve/reject,
|
|
130
|
+
// 但 Promise.race 已通过 timeoutPromise 返回,runPromise 的结果被丢弃)
|
|
131
|
+
void runPromise.catch(() => { });
|
|
132
|
+
try {
|
|
133
|
+
return await Promise.race([runPromise, timeoutPromise]);
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
if (timer)
|
|
137
|
+
clearTimeout(timer);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=evalRunner.js.map
|